一、信息论基础
1.熵:信息熵代表的是随机变量或整个系统的不确定性,熵越大,随机变量或系统的不确定性就越大。即描述的是有关事件 X X X的所有可能结果的自信息期望值: H ( X ) = − ∑ i = 1 n p i l o g p i H(X)=-\sum\limits_{i=1}^{n}p_{i}logp_{i} H(X)=−i=1∑npilogpi
其中n代表事件 X X X的所有n种可能的取值, p i p_i pi代表了事件X为i时的概率。
自信息: I ( x ) = − l o g P ( x ) I(x)=-logP(x) I(x)=−logP(x)
2.联合熵:二维随机变量XY的联合熵(joint entropy)定义为联合自信息的数学期望,它是二维随机变量XY的不确定性的度量: H ( X , Y ) = − ∑ x ∈ χ ∑ y ∈ ρ p ( x , y ) l o g p ( x , y ) = ( l o g 1 p ( x , y ) ) H(X,Y)=-\sum\limits_{x\in\chi}\sum\limits_{y\in\rho}p(x,y)logp(x,y)=(log\frac{1}{p(x,y)}) H(X,Y)=−x∈χ∑y∈ρ∑p(x,y)logp(x,y)=(logp(x,y)1)
注意:如果X和Y相互关联,整个系统的熵并不等于 H ( X ) + H ( Y ) H(X)+H(Y) H(X)+H(Y)
特性:
(1)大于子系统的熵
H(X,Y)≥H(X)
增加一个新系统不减少不确定性。
2)子可加性 (Subadditivity)
H(X,Y)≤H(X)+H(Y)
3)非负性(Bounds)
H(X,Y)≥0
3.条件熵
给定X时,Y的条件熵(conditional entropy):
其中,H(Y|X)表示已知X时,Y的平均不确定性。
4.信息增益(又称相对熵,KL散度,信息散度)
信息增益是两个概率分布P和Q差别的非对称性的度量。
对一个离散随机变量的两个概率分布P和Q来说,他们的KL散度定义为:
对于连续的随机变量,定义为:
注:
(1)p(x) 和q(x)分别是pq两个随机变量的PDF,Dkl(P||Q)是一个数值,而不是一个函数
(2)KL散度并不满足距离的概念,应为:1)KL散度不是对称的;2)KL散度不满足三角不等式。
(3)P通常指数据集,我们已有的数据集,Q表示理论结果
接下来说一下它的性质:
(1)尽管KL散度从直观上是个度量或距离函数,但它并不是一个真正的度量或者距离,因为它不具有对称性,即D(P||Q) ≠ D(Q||P)
(2)相对熵的值为非负值,即Dkl(P||Q)≥0,只有 P(x)=Q(x) 几乎处处成立的时候,Dkl(P||Q)=0.
证明:利用 Jensen’s Inequality(直接用,证明略),可以得到。
所以,移项即可得到KL散度的证明。
我的理解:
从信息论的角度,KL散度是用来度量使用基于Q的编码来编码来自P的样本平均所需的额外的比特个数。 典型情况下,P表示数据的真实分布,Q表示数据的理论分布,模型分布,或P的近似分布。
根据shannon的信息论,给定一个字符集的概率分布,我们可以设计一种编码,使得表示该字符集组成的字符串平均需要的比特数最少。假设这个字符集是X,对x∈X,其出现概率为P(x),那么其最优编码平均需要的比特数等于这个字符集的熵:
H(X)=∑x∈XP(x)log[1/P(x)]
在同样的字符集上,假设存在另一个概率分布Q(X)。如果用概率分布P(X)的最优编码(即字符x的编码长度等于log[1/P(x)]),来为符合分布Q(X)的字符编码,那么表示这些字符就会比理想情况多用一些比特数。KL-divergence就是用来衡量这种情况下平均每个字符多用的比特数,因此可以用来衡量两个分布的距离。即:
5.基尼不纯度
正规解释:从一个数据集中随机选取子项,度量其被错误的划分到其他组里的概率。
通俗理解:一个随机事件变成它的对立事件的概率
计算公式:(fi为某概率事件发生的概率)
下图是相关曲线图,可以参考数据挖掘导论的98页:
从上图可以看出,基尼系数和熵之半的曲线非常接近,仅仅在45度角附近误差稍大。因此,基尼系数可以做为熵模型的一个近似替代。
讲解案例:
一个随机事件X ,P(X=0)= 0.5 ,P(X=1)=0.5
那么基尼不纯度就为 P(X=0)*(1 - P(X=0)) + P(X=1)*(1 - P(X=1)) = 0.5
一个随机事件Y ,P(Y=0)= 0.1 ,P(Y=1)=0.9
那么基尼不纯度就为P(Y=0)*(1 - P(Y=0)) + P(Y=1)*(1 -P(Y=1)) = 0.18
很明显 X比Y更混乱,因为两个都为0.5 很难判断哪个发生。而Y就确定得多,Y=1发生的概率很大。而基尼不纯度也就越小。
结论:
(1)基尼不纯度可以作为 衡量系统混乱程度的 标准;
(2)基尼不纯度越小,纯度越高,集合的有序程度越高,分类的效果越好;
(3)基尼不纯度为 0 时,表示集合类别一致;
(4)在决策树中,比较基尼不纯度的大小可以选择更好的决策条件(子节点)。
二、决策树的不同分类算法
ID3算法:
ID3(Iterative Dichotomiser 3)算法是由罗斯昆(J. Ross Quinlan)于1975年在悉尼大学提出的一种分类预测算法,算法的核心是“信息熵”(information entropy)。这个算法是通过计算出每个属性的信息增益,来选取信息增益(information gain)最高的属性来作为决策树划分的属性和标准。为什么要选取信息增益最高的属性来划分,我们来看一下下面这个公式:
这个公式中,Entropy表示父节点的熵,pi表示子节点的数据量占父节点数据量的比例,Entropyi表示第i个子节点的熵,该公式的第二项中子节点的熵越小,就表示子节点的信息量越小,子节点就越纯,分类的效果就越好。所以整体的来看,这个公式的第二项越小,那么整个的信息增益就越大,离我们预期的效果就越接近。
因此把信息增益最大的特征作为第一个分支条件。此后按照同样的方法确定各个分支。
优点:
ID3优点是理论清晰、方法简单、学习能力较强,但也存在一些缺点:
(1)只能处理分类属性的数据,不能处理连续的数据;
(2)划分过程会由于子集规模过小而造成统计特征不充分而停止;
(3)ID3算法在选择根节点和各内部节点中的分支属性时,采用信息增益作为评价标准。信息增益的缺点是倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息。
C4.5算法:
不同于ID3使用信息增益作为划分训练数据集的特征,C4.5使用的是信息增益比作为划分训练数据集的特征。
信息增益比:
特征A对训练数据集D的信息增益比 g R ( D , A ) g_R(D,A) gR(D,A)定义为其信息增益 g ( D , A ) g(D,A) g(D,A)与训练数据集D关于特征A的值的熵 H A ( D ) H_A(D) HA(D)之比,即:
用信息增益比来选择特征的算法称为C4.5算法。
优缺点:
C4.5算法用信息增益率来选择属性,继承了ID3算法的优点。并在以下几方面对ID3算法进行了改进:
1.克服了用信息增益选择属性时偏向选择取值多的属性的不足;
2.在树构造过程中进行剪枝;
3.能够完成对连续属性的离散化处理;
4.能够对不完整数据进行处理。
C4.5算法产生的分类规则易于理解、准确率较高;但效率低,因树构造过程中,需要对数据集进行多次的顺序扫描和排序。也是因为必须多次数据集扫描,C4.5只适合于能够驻留于内存的数据集。在实现过程中,C4.5算法在结构与递归上与ID3完全相同,区别只在于选取决决策特征时的决策依据不同,二者都有贪心性质:即通过局部最优构造全局最优。
C4.5虽然改进或者改善了ID3算法的几个主要的问题,仍然有优化的空间。
由于决策树算法非常容易过拟合,因此对于生成的决策树必须要进行剪枝。剪枝的算法有非常多,C4.5的剪枝方法有优化的空间。思路主要是两种,一种是预剪枝,即在生成决策树的时候就决定是否剪枝。另一个是后剪枝,即先生成决策树,再通过交叉验证来剪枝。后面在下篇讲CART树的时候我们会专门讲决策树的减枝思路,主要采用的是后剪枝加上交叉验证选择最合适的决策树。
C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。
C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。
C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化可以减少运算强度但又不牺牲太多准确性的话,那就更好了。
CART(Classification and Regression Trees )算法:
前文介绍了ID3、C4.5生成决策树的算法。由于上文使用的测试数据以及建立的模型都比较简单,所以其泛化能力很好。但是,当训练数据量很大的时候,建立的决策树模型往往非常复杂,树的深度很大。此时虽然对训练数据拟合得很好,但是其泛化能力即预测新数据的能力并不一定很好,也就是出现了过拟合现象。这个时候我们就需要对决策树进行剪枝处理以简化模型。
CART,即分类与回归树(classification and regression tree),也是一种应用很广泛的决策树学习方法。但是CART算法比较强大,既可用作分类树,也可以用作回归树。作为分类树时,其本质与ID3、C4.5并有多大区别,只是选择特征的依据不同而已。另外,CART算法建立的决策树一般是二叉树,即特征值只有yes or no的情况(个人认为并不是绝对的,只是看实际需要)。当CART用作回归树时,以最小平方误差作为划分样本的依据。
CART有分类和回归,本文主要讲的是分类,也就是分类树。分类树采用基尼指数选择最优特征。假设有K个类,样本属于第K类的概率为 P k P_k Pk,则概率分布的基尼指数定义为:
对于二分类问题,若样本点属于第一类的概率为 p p p,则概率分布的基尼指数为:
对于给定的样本集合D,其基尼指数为:
这里, C k C_k Ck是D中属于K类的样本子集,K是类的个数。
如果样本集合D根据特征集合A是否是某一特征值 α \alpha α被分为两个部分D1,D2,即:
那么在给定特征A的条件下,集合D的基尼指数定义为:
基尼指数 G i n i ( D ) Gini(D) Gini(D)表示集合D的不确定性,基尼指数 G i n i ( D , A ) Gini(D,A) Gini(D,A)表示经 A = α A=\alpha A=α分割后集合D的不确定性,基尼指数值越大,样本集合的不确定性也就越大,这一点与熵相似。
树的构建与前面两个方法类似,只是特征变了而已。
三、回归树原理
决策树实际上是将空间用超平面进行划分的一种方法,每次分割的时候,都将当前的空间一分为二, 这样使得每一个叶子节点都是在空间中的一个不相交的区域,在进行决策的时候,会根据输入样本每一维feature的值,一步一步往下,最后使得样本落入N个区域中的一个(假设有N个叶子节点),如下图所示。
分类与回归树(classificationandregressiontree, CART)模型由Breiman等人在1984年提出,是应用广泛的决策树学习方法。CART同样由特征选择、树的生成及剪枝组成,既可以用于分类也可以用于回归。
下面介绍回归树:
既然是决策树,那么必然会存在以下两个核心问题:如何选择划分点?如何决定叶节点的输出值?
一个回归树对应着输入空间(即特征空间)的一个划分以及在划分单元上的输出值。分类树中,我们采用信息论中的方法,通过计算选择最佳划分点。而在回归树中,采用的是启发式的方法。假如我们有n个特征,每个特征有 s i ( i ∈ ( 1 , n ) ) s_i(i\in(1,n)) si(i∈(1,n))个取值,那我们遍历所有特征,尝试该特征所有取值,对空间进行划分,直到取到特征j的取值s,使得损失函数最小,这样就得到了一个划分点。描述该过程的公式如下:
假设将输入空间划分为M个单元: R 1 , R 2 , . . . R m R_1,R_2,...R_m R1,R2,...Rm,那么每个区域的输出值就是: c m = a v e ( y i ∣ x i ∈ R m ) c_m=ave(y_i|x_i\in R_m) cm=ave(yi∣xi∈Rm)也就是该区域内所有点y值的平均数。
举个例子。如下图所示,假如我们想要对楼内居民的年龄进行回归,将楼划分为3个区域, R 1 , R 2 , R 3 R_1,R_2,R_3 R1,R2,R3(红线),那么 R 1 R_1 R1的输出就是第一列四个居民年龄的平均值, R 2 R_2 R2的输出就是第二列四个居民年龄的平均值, R 3 R_3 R3的输出就是第三,四列八个居民年龄的平均值。
下图是李航教授的统计学习方法上面关于回归树的算法描述:
回归树与线性回归效果图:
回归树总结:
实际上,回归树总体流程类似于分类树,分枝时穷举每一个特征的每一个阈值,来寻找最优切分特征j和最优切分点s,衡量的方法是平方误差最小化。分枝直到达到预设的终止条件(如叶子个数上限)就停止。
当然,处理具体问题时,单一的回归树肯定是不够用的。可以利用集成学习中的boosting框架,对回归树进行改良升级,得到的新模型就是提升树(Boosting Decision Tree),在进一步,可以得到梯度提升树(Gradient Boosting Decision Tree,GBDT),再进一步可以升级到XGBoost。
四、决策树防止过拟合手段
过拟合:overfittingt是这样一种现象:一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集上却不能很好的拟合数据.此时我们就叫这个假设出现了overfitting的现象。
要想搞清楚决策树如何防止过拟合,首先就需要搞懂决策树为什么会发生过拟合。
下面就先说一下决策树过拟合的一些常见原因:
原因1:样本问题
(1)样本里的噪音数据干扰过大,大到模型过分记住了噪音特征,反而忽略了真实的输入输出间的关系;(什么是噪音数据?)
(2)样本抽取错误,包括(但不限于)样本数量太少,抽样方法错误,抽样时没有足够正确考虑业务场景或业务特点,等等导致抽出的样本数据不能有效足够代表业务逻辑或业务场景;
(3)建模时使用了样本中太多无关的输入变量。
原因2:构建决策树的方法问题
在决策树模型搭建中,我们使用的算法对于决策树的生长没有合理的限制和修剪的话,决策树的自由生长有可能每片叶子里只包含单纯的事件数据或非事件数据,可以想象,这种决策树当然可以完美匹配(拟合)训练数据,但是一旦应用到新的业务真实数据时,效果是一塌糊涂。
如何解决决策树过拟合?
针对原因1的解决方法:
合理、有效地抽样,用相对能够反映业务逻辑的训练集去产生决策树;
针对原因2的解决方法(主要):
剪枝:提前停止树的增长或者对已经生成的树按照一定的规则进行后剪枝。
剪枝的方法
剪枝是一个简化过拟合决策树的过程。有两种常用的剪枝方法:
(1)先剪枝(prepruning):通过提前停止树的构建而对树“剪枝”,一旦停止,节点就成为树叶。该树叶可以持有子集元组中最频繁的类;
先剪枝的方法
有多种不同的方式可以让决策树停止生长,下面介绍几种停止决策树生长的方法:
限制决策树的高度和叶子结点处样本的数目
1.定义一个高度,当决策树达到该高度时就可以停止决策树的生长,这是一种最为简单的方法;
2.达到某个结点的实例具有相同的特征向量,即使这些实例不属于同一类,也可以停止决策树的生长。这种方法对于处理数据中的数据冲突问题非常有效;
3.定义一个阈值,当达到某个结点的实例个数小于该阈值时就可以停止决策树的生长;
4.定义一个阈值,通过计算每次扩张对系统性能的增益,并比较增益值与该阈值的大小来决定是否停止决策树的生长。
后剪枝的方法:
它首先构造完整的决策树,允许树过度拟合训练数据,然后对那些置信度不够的结点子树用叶子结点来代替,该叶子的类标号用该结点子树中最频繁的类标记。后剪枝的剪枝过程是删除一些子树,然后用其叶子节点代替,这个叶子节点所标识的类别通过大多数原则(majority class criterion)确定。所谓大多数原则,是指剪枝过程中, 将一些子树删除而用叶节点代替,这个叶节点所标识的类别用这棵子树中大多数训练样本所属的类别来标识,所标识的类称为majority class .相比于先剪枝,这种方法更常用,正是因为在先剪枝方法中精确地估计何时停止树增长很困难。
五、决策树模型的评估
自助法(bootstrap):
训练集是对于原数据集的有放回抽样,如果原始数据集N,可以证明,大小为N的自助样本大约包含原数据63.2%的记录。当N充分大时, 1 − ( 1 − 1 N ) N 1-(1-\frac{1}{N})^{N} 1−(1−N1)N概率逼近 ( 1 − e − 1 ) = 0.632 (1-e^{-1})=0.632 (1−e−1)=0.632。抽样b次,产生b个bootstrap样本,则总的准确率(accs为包含所有样本计算的准确率):
准确度的区间估计:
将分类问题看作是二项分布,则有:
令X为模型的正确分类,p为准确率,X服从均值Np,方差为Np(1-p)的二项分布。acc = X/N为均值p,方差p(1-p)/N的二项分布。acc的置信区间:
六、决策树sklearn参数详解以及其可视化
scikit-learn决策树算法类库内部实现是使用了调优过的CART树算法,既可以做分类,又可以做回归。分类决策树的类对应的是DecisionTreeClassifier。
sklearn.tree模块提供了决策树模型,用于解决分类问题和回归问题。方法如下所示:
我们先看下DecisionTreeClassifier这个函数,一共有12个参数:
参数说明如下:
除了这些参数要注意之外,其他在调参时的注意点有:
决策树可视化环境搭建与使用总结:
scikit-learn中决策树的可视化一般需要安装graphviz。首先需要安装Graphviz,笔者使用的是Anaconda集成环境,只需在在终端窗口输入:
conda install python-graphviz
pip3 install graphviz
笔者使用两种方式:
方式一:
用graphviz的dot命令生成决策树的可视化文件,敲完这个命令后当前目录就可以看到决策树的可视化文件iris.pdf.打开可以看到决策树的模型图。
需要在代码中添加如下代码。
运行成功后会在目录下生成Infor_Gain.dot的文件,需要转化dot文件至pdf可视化决策树。
dot -Tpdf iris.dot -o output.pdf
参考博客:
http://blog.sina.com.cn/s/blog_6255d20d0100ex34.html
https://blog.csdn.net/JJBOOM425/article/details/79997440
https://blog.csdn.net/Oscar6280868/article/details/80983449
https://blog.csdn.net/u013162035/article/details/82822239
https://blog.csdn.net/weixin_40604987/article/details/79296427
https://blog.csdn.net/longgb123/article/details/52972604
https://blog.csdn.net/u013162035/article/details/82824852