《python数据分析和数据挖掘》——ID3决策树学习笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lamusique/article/details/79731388

ID3决策树

决策树在分类预测和规则提取中有着广泛的应用。他是一树状结构,每一个节点对应着一个分类,非叶节点对应着在某个属性上的划分,根据样本在该属性上的不同取值将其划分成若干个子集。构造决策树的核心问题就是如何选择适当的属性对样本进行拆分。

基本原理

————————希望自己能用最通俗的语言讲清楚————————

选择当前样本集中具有最大信息增益值的属性作为测试属性。样本集的划分则根据测试属性的取值进行,测试属性有多少不同取值,就将样本集划分为多少子样本,同时决策树上相应于该样本集的节点生成新子节点。ID3决策算法根据信息增益值度量不确定性:信息增益值越大,不确定性越小。因此每个非叶节点选择信息增益最大的属性作为测试属性,从而得到较小的决策树。

划线部分就是重点很好理解:“好”和“坏”是某测试属性中的不同取值,那么就可以分成“好”样本和“坏”样本两个子样本集合。

1、 总信息熵:

一串数据他有很多属性,我们可以分为两种。一种是特征属性(测试属性),我们认为是自变量;一种是结果属性(类别属性),我们认为是因变量。那么决策树要实现的分类就是根据自变量的层层规则,得到因变量的结果。基于此,我们需要确定总信息熵。总信息又是啥?就是我们需要得到的结果属性,或者最终的类别属性

那么s个数据样本构成的集合S,如果他的类别属性有m个不同的值:Ci(i=1,2,…,m),如优/良/中/差。那么统计s个样本中“优”占多少个,又有多大P1概率。其他依次可得P2,P3,…,Pm。咱们用专业的话总结一遍就是:

对于一个给定的样本,根据类别属性,总信息熵为

                                                      

       其中Pi表示样本中属于Ci的概率,用si/s估计。

2、 划分样本的信息熵:

划分样本我们知道可以根据结果类别属性和特征属性分,显然类别属性我们已经动刀子了,我们就该对特征属性下手了,但是特征属性+类别属性结合着地“双管齐下”。

那么s个数据样本构成的集合S,我们只看他的某一特征属性A,它具有k个不同的值:{a1,a2,…,ak}如“是”,“否”,根据k个不同的值我们又可以划分成k个集合{s1,s2,…,sk},其中sj包含了集合S中属性A取aj值的样本,如“是”集合,“否”集合。这个属性就可以成为一个新的子节点。

针对属性A所代表的子节点,对其划分的子集合进行类别属性的划分。如对“是”集合中的“优”“良”“差”进行统计,对应又分别占多大概率,得到“是”集合的信息熵,同理得到“否”集合的信息熵,根据“是”“否”集合所占总集合的比例,综合得到属性A的信息熵。说到底就是贝叶斯条件概率的应用。用专业的话讲,根据属性A划分样本的信息熵值为

                                              

其中sij是子集Sj类别为Ci的样本数,是子集Sj中类别为Ci的样本的概率。

3、 属性A划分样本集S后得到的信息增益为:

                                                          

显然E(A)越小,Gain(A)的值越大,说明选择测试属性A对于分类提供的信息越大,选择A之后对分类不确定程度越小,属性A的k个不同的值对应样本集S的k个子集或分支,通过递归调用上述过程(不包括已经选择的属性),生成其他属性作为节点的子节点和分支来生成整个决策树。

————————举个栗子讲清楚————————

以公司销量为例,要求构造模型来分析天气、是否周末和是否有促销活动对销量的影响。天气:好/坏,周末:是/否,促销:是/否—→销量:高/低。

即销量为类别结果属性,其他为测试特征属性。

采用ID3决策算法建立模型步骤如下:(数据未贴出)

1.计算总信息熵。其中数据总记录34,而销量作为结果属性“高”数据有18个。“低”有16个。所以

                                

2.计算每个测试属性的信息熵。

对于“天气”属性,属性值有“好”和“坏”两种,其中天气“好”条件下,销量为“高”的记录为11,销售数量为“低”的记录为6,可表示为(11,6);其中天气“坏”条件下,销量为“高”的记录为7,销售数量为“低”的记录为10,可表示为(7,10)。则天气属性的信息熵为

                                        

对于“是否周末”属性,属性值有“是”和“否”两种,其中周末“是”条件下,销量为“高”的记录为11,销售数量为“低”的记录为3,可表示为(11,3);其中周末“否”条件下,销量为“高”的记录为7,销售数量为“低”的记录为13,可表示为(7,13)。则是否周末属性的信息熵为

对于“是否促销”属性,属性值有“是”和“否”两种,其中促销“是”条件下,销量为“高”的记录为15,销售数量为“低”的记录为7,可表示为(15,7);其中促销“否”条件下,销量为“高”的记录为3,销售数量为“低”的记录为9,可表示为(3,9)。则是否促销属性的信息熵为

3.计算每个测试属性的信息增益值

                    

4. 选择信息增益值最大的特征属性作为第一个树节点,他的属性值就作为根节点的两个分支,然后分别针对两个分支节点进行新的信息增益计算,迭代反复?更应该是递归调用,直至没有新的节点分支,最终构成一个决策树,如下所示。

依次选择leftroot,rightroot做尾递归逻辑,同时每次递归删去已经作为树根节点的属性,避免重复浪费资源。

根据上面可以写出分类规则。

                                          

总结:首先根据类别属性计算总信息熵;然后在不同测试属性值条件下,计算类别属性的信息熵,并根据分布概率的权和得到测试属性的信息熵,最后总信息熵减去测试属性的信息熵,得到测试属性的信息增益,并取最大。并最后删去该最大属性(不作为统计条件搁置在一旁),根据该方法递归得到左右分支节点对应的属性。

由于ID3决策树算法采用了信息增益作为选择测试属性的标准,会偏向于选择取值较多的,即所谓高度分支属性,而这类属性不一定最优。同时ID3决策树算法智能处理离散属性,对于连续属性,分类前应进行离散化。

为了解决选择高度分支属性的问题,人们采用信息增益作为选择测试属性的标准,这样便得到C4.5决策树模型。此外常用的决策树算法还有CART算法、SLIQ算法、SPRINT算法和PUBLIC算法等。

 代码:

#使用ID3决策树算法预测销量高低


#算法初始化
filename='data/sales_data.xls'
data=pd.read_excel(filename,index_col=u'序号')#导入数据

#数据是类别标签,要把它转换成数据
#用1代表“好”“是”“高”这三个属性,用-1代表“坏”“否”“低”
data[data==u'好']=1
data[data==u'是']=1
data[data==u'高']=1
data[data!=1]=-1
x=data.iloc[:,:3].as_matrix().astype(int)
y=data.iloc[:,3].as_matrix().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
from sklearn.externals.six import StringIO
with open("tree.dot",'w') as f:
    f=export_graphviz(dtc,feature_names=x.columns,out_file=f)





猜你喜欢

转载自blog.csdn.net/lamusique/article/details/79731388