这是我个人的学习笔记,可能有错误,不要见怪,不过程序都是运行过的,可以用的。
这一篇记录的是在上一篇读取的excel表格的基础上构建一个决策树,顺便复习下决策树的构建,决策树可以是二叉树也可以是非二叉树,它从一个根节点开始,通过判断数据的属性,一直到到达叶子结点为止,叶子结点就是输出的结果,例如:
枪 血 子弹 攻击
1 1 1 1
0 1 0 0
0 0 0 0
1 0 1 1
其中1表示真,0表示假,是否攻击就是决策树的判断结果,这里我是通过判断信息增益来为数据分类的,哪个属性的信息增益最大,就把它当作根节点,事实上用sklearn也好像不需要知道得太多,就是一个语句搞定了…,下面是代码:
from sklearn import tree
import numpy as np
import pydotplus
from sklearn.externals.six import StringIO
from pyexcel_xls import get_data
一、 导入各种模块,从sklearn导入决策树有关的模块tree,导入pydotplus用来画图,导入pyexcel_xls用来读取excel文件
def read_xls_file():
xls_data = get_data(r"G:\python 3.5.1\data\305_304_4.xls")
print( "Get data type:", type(xls_data))
xls_data = np.array(xls_data['Sheet2'])
print(xls_data)
return xls_data
def read_xls_file_1():
xls_data = get_data(r"G:\python 3.5.1\data\305_304_5.xls")
print( "Get data type:", type(xls_data))
a = np.array(xls_data['Sheet1'])
for i in range(1, 302): #将第二个文件的数据二值化,作为labels
if a[i] == 2:
a[i] = 1
if a[i] == 1:
a[i] = 0
if a[i] == 3:
a[i] = 1
print(a[i]) #输出测试下数据是否成功二值化
return a
dataSet = read_xls_file()
labels = read_xls_file_1()
为了更直观的展示二叉树,还是用下面的简单数据演示吧:
dataSet = [[1, 1, 0], [1, 0, 1], [1, 0, 1], [1, 0, 1], [0, 0, 1], [0, 1, 0], [0, 1, 1], [0, 1, 1]]
labels = ['fight', 'fight', 'fight', 'fight', 'run', 'fight', 'run', 'run']
这个就是开头的例子的数据,是否有枪,是否有血,是否有子弹,决定是否攻击
二、构建决策树,其实只有两行代码
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(dataSet, labels)
criterion默认是gini(不纯度),这里是entropy(信息增益),另外还有别的参数,splitter=’random’或者’best’(默认是best),表示分类策略;max_depth=’最大深度’;我只记得这几个了….
三、显示信息增益数值,也是只需要一行代码
print(clf.feature_importances_)
四、画图(这个pydotplus画图干脆和下一章的matplotlib的画图一起记录好了..)
dot_data = StringIO()
tree.export_graphviz(clf, out_file=dot_data, filled=True, rounded=True, special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('iris.png')
最后得出的决策树是这个样子的: