Advertisement

《python数据分析与挖掘实战》 ID3决策树

阅读量:
复制代码
    #-*- coding: utf-8 -*-
    #使用ID3决策树算法预测销量高低
    import pandas as pd
    from sklearn.tree import DecisionTreeClassifier as DTC
    from sklearn.tree import export_graphviz #导入相关函数,可视化决策树。
    #from sklearn.externals.six import StringIO  书中导入的这个函数实际上没有用到
    
    #参数初始化
    filename = r'D:\python\stats\pythonsjwj\chapter5\demo\data\sales_data.xls'
    data = pd.read_excel(filename, index_col = u'序号')  #导入数据
    
    #数据是类别标签,要将它转换为数据
    #用1来表示“好”“是”“高”这三个属性,用-1来表示“坏”“否”“低”
    data[(data == u"好") | (data == u"是") | (data == u"高")] = 1  #书上这里是3行,这里缩减成了1行
    data[data != 1] = -1
    
    x = data.iloc[:, :3].values.astype(int) #书上这里用到了as.matrix(),该用法已经过时,这里改成了values
    y = data.iloc[:, 3].values.astype(int) #x取左边的天气、是否周末和是否有促销3列数据,y取第4列的销量数据
    
    dtc = DTC(criterion = 'entropy')  #建立决策树模型,基于信息熵
    dtc.fit(x, y)  #训练模型
    
    #导出的结果是一个dot文件,需要安装Graphviz才能将它转换为pdf或png等格式。
    data2 = data.drop("销量", 1)  #删掉销量列数据方便下面取表头画图,书中是用x.columns直接取x的表头,因为之前对x的定义做了改动,所以这里也要改一下。
    with open("tree.dot", 'w') as f:
    f = export_graphviz(dtc, feature_names = data2.columns, out_file = f)

输出的dot文件中包含中文,需要用文本编辑器在文件中指定中文字体,并将文件编码转成UTF-8格式(我用的文本编辑器是Notepad++,点击上方工具栏的“编码”,“转为UTF-8 编码”之后保存就好了)。修改之后的代码如下:
在这里插入图片描述
Graphviz安装配置好,dot文件的代码也修改好之后,需要在dot文件所在位置打开命令行,运行以下代码将dot文件转成pdf格式文件,将下面代码中的pdf改成png运行一遍就能生成一个png格式文件(png格式文件像素太低,还是建议转成pdf格式)。
下面的决策树中,每个节点往下的左边分支均为“True”,右边分支均为“False”,每个节点中的value中第1个数值表示销量为“低”的结果数,第2个是销量为“高”的结果数。以最左边的路径为例,从上往下第一个节点表示总样本有34个,其中16个销量低,18个销量高,分支判断条件“是否周末<=0”表示不是周末则为“True”。左边分支为“True”,第二个节点表示不是周末的样本有20个,其中有13个销量低,7个销量高,分支判断条件“是否有促销<=0”表示没做促销则为“True”。左边第三个节点表示不是周末的20个样本中没做促销的有8个,其中7个销量低,1个销量高,分支判断条件“天气<=0”表示坏天气则为True。左边第四个节点表示不是周末,没做促销,且天气不好的样本有4个,4个结果都是低销量。
每个节点中都有一个信息熵(entropy),取值范围0-1,指的是根据数据得出结论的过程中信息丢失严重程度,越接近1表示信息丢失越严重,换句话说就是预测的不确定性越高。举个例子:最上面的节点中,34个样本中16个销量低,18个销量高,entropy=0.998,非常接近于1,这个时候没有任何其他条件,我们直接预测销量会高,但是这个预测的不确定性非常高,实际上未来销量高的可能性占比50%多一点。左边最下面的节点,4个样本全部是销量低,entropy=0,这个时候我们预测不是周末,没做促销,且天气不好的情况下销量会低,这个预测的不确定性非常低,实际上未来销量低的可能性近乎100%。

复制代码
    dot -Tpdf tree.dot -o tree.pdf

在这里插入图片描述
在这里插入图片描述
最后,附上分析用的源数据截图
在这里插入图片描述

全部评论 (0)

还没有任何评论哟~