1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 利用机器学习之决策树进行预测分析

利用机器学习之决策树进行预测分析

时间:2021-07-10 18:53:57

相关推荐

利用机器学习之决策树进行预测分析

本章主要使用的是sklearn库中的决策树

1 决策树(分类)基本概念

顾名思义,决策树就是一棵树,一棵决策树包含一个根节点、若干个内部结点和若干个叶结点;叶结点对应于决策结果,其他每个结点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集,从根结点到每个叶子结点的路径对应了一个判定测试序列。

对于离散的分类任务,决策树最后生成的树叶是根据算法构建出的最优类别,如果没有限定决策树的最大高度等参数,树叶内的数据一般会是纯的,即一片树叶内只有一种类别,但是经过剪枝(后面会讲)操作后,叶节点的数据可能会不纯。

2 分类问题决策树生成原理

2.1 “纯度”判断

决策树学习的关键在于如何选择最优的划分属性,所谓的最优划分属性,对于分类而言,就是尽量使划分的样本属于同一类别,即“纯度”最高的属性。

那么,如何定义数据的“纯度”就成了问题的关键,现在的主流算法是CART算法,sklearn中DecisionTreeClassifier就是用的CART算法,其判别纯度的指标是entropy熵与Gini指数。

熵的公式为:

其中表示有种类别,是取第种类的概率,实际计算直接用第i种类别所占的比例代替,熵越大,表示此时的混乱程度越大,数据越不纯。

如果利用某一种指标将原数据 分为两类与 之后,在这个分类下,定义此时的条件熵为

接着定义信息增益:

基尼指数的公式为:

同样表示有种类别, 是 取第种类的概率,直观上说,基尼指数反映了从数据集中随机抽取两个样本,其类别标记不一致的概率,所以基尼指数也是越大表示越混乱。

同样地,利用某一种指标将原数据 分为两类与 之后,在这个分类下,定义此时的基尼指数为

相比于熵的对数运算,基尼指数只涉及平方与加法运算,所以在大数据量问题上,基尼指数有更快的运行速度。

2.2 CART算法思路

CART算法生成的决策树是二叉树,每一步只对某一个指标做出划分。如果特征是离散的取值,那么就对每个特征的每个不同的取值作为二叉树的判定标准,大于或者小于等于该值分成两类,并计算以该点分类后,新节点的信息增益(information entropy)或者基尼指数,以两个子节点的样本数占比进行加权计算;如果特征是连续的取值,那么以每两个相邻的特征取值的算术平均离散化。

具体来说,如果某一个特征 有 个连续的属性,那么对应的取值从小到大排列为 , 以 为其n-1个划分点,将特征 离散化。

2.3代码实现

import csvimport matplotlib.pyplot as pltfrom pandas import DataFramefrom sklearn.feature_extraction import DictVectorizerfrom sklearn import preprocessingfrom sklearn import treeimport pandas as pdmateria = [0 for i in range(0, 100)]pd = pd.read_excel('train.xlsx')num = 0for item in pd.ticketOffice:if item>40:materia[num] = "True"else:materia[num] = "False"num += 1# print(num)pd.insert(3, "ticket", materia)pd.drop(labels='ticketOffice',axis=1,inplace=True)pd.to_csv('film.csv')# print(pd)print("训练数据统计:")print(" 共有:",len(pd),"行")print(" 共有:",len(pd.columns),"列")print(" 行列数为:", pd.shape)print(" 共有",pd.size,"个元素")film_data=open('film.csv','rt')reader = csv.reader(film_data)#表头信息headers = next(reader)# print(headers)feature_list = []result_list = []for row in reader:result_list.append(row[-1])#去掉首位列,feature_list.append(dict(zip(headers[1:-1],row[1:-1])))# print(result_list)# print(feature_list)#vec = DictVectorizer() #将数据类型转换成numpy annaydummyx = vec.fit_transform(feature_list).toarray()dummyY = preprocessing.LabelBinarizer().fit_transform(result_list)#humity、outlook、temperature、windy#high,normal;overcast、Rainy、sunny;cool,hot,mild;false,true;# print('dummyx is ',dummyx)# print('dummyY is ',dummyY)clf = tree.DecisionTreeClassifier(criterion='entropy',random_state=0)clf = clf.fit(dummyx,dummyY)# print("clf:"+str(clf))picture = tree.plot_tree(clf,max_depth=3,filled=True)plt.show()# import pydotplus## dot_data = tree.export_graphviz(clf,# feature_names=vec.get_feature_names(),# filled=True,rounded=True,# special_characters=True,# out_file=None)# graph = pydotplus.graph_from_dot_data(dot_data)# graph.write_pdf("file.pdf")###开始预测A=([[1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0]])predict_resurt=clf.predict(A)print("=====================================")print("根据以往爆火电影特征分析,此部电影")if predict_resurt==1:print("的预测结果:电影不会爆火")else:print("的预测结果:电影会爆火")print("=====================================")

训练数据

预测结果:

决策树:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。