机器学习————决策树(三)
程序员文章站
2024-02-03 20:10:58
...
前两篇决策树的blog介绍了有关决策树的理论知识,这篇文章我们编码实践一下,采用了网上较为简单的一个有关天气影响运动的数据集,决策树建模部分是利用sklearn.tree.DecisionTreeClassifier()训练构建决策树模型,利用pydotplus+graphviz进行模型可视化展示。
数据集
由于数据量较少,就不再划分训练集测试集,将以上数据全部用于训练。
编码
import pandas as pd
from pandas import Series
import pydotplus
from sklearn import tree
from sklearn.externals.six import StringIO
# load data
datadic = '决策树.xlsx'
mydata = pd.read_excel(datadic)
# prepare
whetherlist = []
windlist =[]
resultlist = []
for i in range(len(mydata)):
if mydata.ix[i][u'天气'] == u'晴':
whetherlist.append(0)
elif mydata.ix[i][u'天气'] == u'多云':
whetherlist.append(1)
elif mydata.ix[i][u'天气'] == u'有雨':
whetherlist.append(2)
if mydata.ix[i][u'风况'] == u'有':
windlist.append(1)
elif mydata.ix[i][u'风况'] == u'无':
windlist.append(0)
if mydata.ix[i][u'运动'] == u'适合':
resultlist.append(1)
elif mydata.ix[i][u'运动'] == u'不适合':
resultlist.append(0)
mydata[u'天气']=Series(whetherlist)#将中文数据数值化
mydata[u'风况']=Series(windlist)
mydata[u'运动']=Series(resultlist)
xdata = mydata.values[:,:4]
ydata = mydata.values[:,4]
#print(xdata)
#print(ydata)
clf = tree.DecisionTreeClassifier(criterion='gini',min_samples_split=5)
clf = clf.fit(xdata, ydata)
dot_data = StringIO()
tree.export_graphviz(clf, out_file=dot_data,feature_names=['whether','Temperature','wet','wind'], class_names=['no', 'yes'], filled=True, rounded=True, special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
#导出
graph.write_pdf('sport.pdf')
graph.write_png('sport.png')
在prepare阶段,要做的是将中文的数据进行数值化保存在mydata中,由于pandas读取excel得到的数据类型是pandas自带的DataFrame类型,因此可以直接通过loc定位获取第几行几列的数据,如xdata和ydata的获取过程,这里为了方便大家理解DataFrame,后续进行了打印,mydata数据如下:
天气 温度 湿度 风况 运动
0 0 85 85 0 0
1 0 80 90 1 0
2 1 83 78 0 1
3 2 70 96 0 1
4 2 68 80 0 1
5 2 65 70 1 0
6 1 64 65 1 1
7 0 72 95 0 0
8 0 69 70 0 1
9 2 75 80 0 1
10 0 75 70 1 1
11 1 72 90 1 1
12 1 81 75 0 1
13 2 71 80 1 0
左边0-13是行坐标,天气温度湿度风况和运动是列坐标,前4列为特征,最后一列为分类标签,可以看出DataFrame类型像极了excel,处理起来非常方便。
之后进入建模阶段,使用sklearn封装好的函数建模决策树非常简单,只需要提供训练数据,寻取参数,就会自动训练。对于DecisionTreeClassifier()函数中的几个比较重要常用的参数需要了解,如:
- criterion:标准。看过之前两篇介绍决策树的同学都知道,划分决策树的属性的标准有三:信息增益、信息增益率和基尼指数。在DecisionTreeClassifier()函数中criterion参数的取值提供了两个:entropy和gini,也就是信息增益和基尼指数。换句话说,DecisionTreeClassifier()这个函数只支持ID3和CART算法,做不到C4.5。
- min_samples_split:定义了划分节点的最小样本数,就是说如果当前节点所包含的样本数小于min_samples_split,那就不用再划分,如果大于,就很可能需要再进行划分,很可能的原因是如果当前节点"完全纯净",所有样本都归属同一类,那么再划分也就没有意义,后续会有可视化的例子进行分析。
- max_depth:最大深度。默认是None,如果是None就默认是划分知道所有叶子都是纯净的或者叶子节点包含样本数都小于min_samples_split(之前说过的特殊情况先不考虑);也可以自己定义int类型。
- 更多参数参考官方文档:Decision Trees官方文档(sklearn)
再之后就是可视化阶段,这部分略。
可视化结果分析
这里跑了4个结果,分别是:
- criterion='entropy',min_samples_split=3
- criterion='entropy',min_samples_split=2
- criterion='gini',min_samples_split=2
- criterion='entropy',min_samples_split=5
- 对比gini2和gini5可以看出当gini=0.5时,gini2对samples=4的节点继续进行划分,而gini5不划分,因为min_samples_split=5>4。
- 同时我们在entropy2中可以到最左端叶子节点samples=5>2,这就是之前提到的特殊情况,由于所在节点的已经纯净,不许再进行划分。
- 即使使用同一个标准,gini2和gini5的划分依据也是不同的,gini2第一个最优划分属性是wet,gini5是whether。
总结
- 在利用DecisionTreeClassifier()时,可供选择的算法只有ID3和CART。
- 划分得到的决策树模型无论是分类还是回归,结果都是二叉树,因此对于ID3来说,本身应该是多叉树,因此能够实现的ID3算法也是不完全的,因此CART在DecisionTreeClassifier()函数中被普遍使用。
上一篇: Angular2 多级注入器详解及实例
下一篇: 笔记本键盘打不出字有哪些情况该如何解决