昨天学习了决策树的思想和算法,脑子卡壳了输出结果老是看不懂,一直在验算和猜想,hh后来终于明白了~在此记录巩固一下。

这里学的是ID3算法实现决策树,ID3算法能处理的数据类型是:自变量和因变量都是离散型

假设自变量有3个:天气情况(好、坏)、是否周末(是、否)、是否有促销(有、没用)。因变量有1个:销售数量(高、低),则我们决策树叶节点都会是高、低这两种情况之一。ID3算法是基于信息熵来选择属性的,它选择当前样本集中具有最大信息增益值的自变量作为测试属性。可以简单的理解为每层的根节点、子节点都能计算出当前样本集的信息熵值,记为I(低,高),在剩下的自变量中计算如果按照此自变量对数据集进行划分时的信息熵值,记为E(自变量Ai),则信息增益值为:Gain(自变量Ai)=I(低,高)-E(自变量Ai),在每一次选择测试属性的时候都会选择信息增益值最大的自变量最为测试属性。

想了解详细的ID3算法可以参考《Python数据分析与挖掘实战》第二版p108-114。书上街上的很详细。

下面看一下代码和代码运行出来的结果

代码

import pandas as pd
inputfile=r'C:\..\data\sales_data.xls'
data=pd.read_excel(inputfile,index_col='序号')
# index_col='序号'是把'序号'这一列当成索引,这样就不会把'序号'这一列读成数据

# 数据是类别标签,要将它转换为数据
# 用1来表示好、是、高这3个属性,用-1来表示坏、否、低这3个属性
data[data=='好']=1
data[data=='是']=1
data[data=='高']=1
data[data!=1]=-1
x=data.iloc[:,:3].values.astype(int)
#pandas.core.frame.DataFrame 的属性 .values 是转换为numpy.ndarray
# numpy.ndarray的属性.astype(int)是把里面的数据转化成int整型
y=data.iloc[:,3].values.astype(int)
from sklearn.tree import DecisionTreeClassifier as DTC
dtc=DTC(criterion='entropy') #基于信息熵确立决策树模型
dtc.fit(x,y)


#导入相关函数,可视化决策树
#导出的结果是一个dot文件,需要安装Graphviz才能将它转化为pdf或png等格式
from sklearn.tree import export_graphviz
with open("C:/.../Desktop/tree.dot",'w') as f:
    f=export_graphviz(dtc,feature_names=x.columns,class_names=True,out_file=f)


dtc. classes_
#查看因变量y的分类

导入的数据是这样的:

 数据是标签类别,需要进一步处理转换成数据

 ↑数据处理后长这样。之后就可以调用决策树的算法直接进行计算了,

运行结果

决策树的运行结果是生成一个.dot文件,要将该文件可视化需要安装Graphviz(跨平台的、基于命令行的绘图工具),运行结果是按照下面的命令生成的,我这里生成结果后直接放置在了桌面。

from sklearn.tree import export_graphviz
with open("C:/.../Desktop/tree.dot",'w') as f:
    f=export_graphviz(dtc,feature_names=x.columns,class_names=True,out_file=f)

 上面这个千万不要用word打开,打开以后另存为基本全乱码(我走过的坑),直接记事本打开并且把该文件另存为uft-8的编码格式(如果要修改正常显示中文字体之类的也可以直接修改),看看记事本打开的决策树生成的结果:

它就是一个图画的编码表达。剩下的就需要利用Graphviz来帮忙了。这里要先安装Graphviz。地址:http://www.graphviz.org/download/,直接下载合适的版本安装即可。安装成功后要设置环境变量,把安装路径C:\...\Graphviz2.38\bin加入到环境变量。添加好环境变量后,打开cmd,输入dot -version,如果显示如下图所示的graphviz相关版本信息,则安装配置成功。

 准备工作做完后就要开始处理决策树输出结果tree.dot文件了。在tree.dot文件的所在目录里打开cmd,输入以下命令会生成一个tree.pdf和tree.png的文件,这就是我们想要的结果了。

dot -Tpdf tree.dot -o tree.pdf #生成pdf
dot -Tpng tree.dot -o tree.png #生成png

 

 

 这样就是生成成果了。打开后结果是这样的:

 终于看到图画了,但刚开始看到的时候,我不知道为什么哪个True和False是反过来的,害,思考了半天。后面偶显灵感,感觉是1<=0.0这句话的True/False判断,果然是这样,哈哈~关于决策树的分支,左分支为True,右分支False。结果解读如下:

 

 和标准答案给的结果一样!!!

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐