决策树算法梳理

信息论基础(熵 联合熵 条件熵 信息增益 基尼不纯度)

在信息论中,(entropy)是接收的每条消息中包含的信息的平均量,又称为信息熵、信息源熵、平均信息量。这里,“消息”代表来自分布或数据流中的事件、样本或特征。(熵最好理解为不确定性的量度而不是确定性的量度,因为越随机的信源的熵越大。)来自信源的另一个特征是样本的概率分布。这里的想法是,比较不可能发生的事情,当它发生了,会提供更多的信息。1948年香农将热力学的熵引入到信息论,因此它又称为香农熵。
信息熵的公式:
H ( x ) = − ∑ x ∈ X p ( x ) l o g p ( x ) H(x)=-\displaystyle\sum_{x\in X}p(x)logp(x) H(x)=xXp(x)logp(x)我们用 l o g 1 p log\frac1p logp1来衡量不确定性。P是意见事情发生的概率,概率越大,不确定性越小。
信息熵的公式其实就是 l o g 1 p log\frac 1p logp1的期望,代表了一个系统的不确定性,信息熵越大,不确定性越大。

信息熵在联合概率分布的自然推广,就得到了联合熵 H ( x , y ) = − ∑ x ∈ X ∑ y ∈ Y p ( x , y ) l o g p ( x , y ) H(x,y)=-\displaystyle\sum_{x\in X}\displaystyle\sum_{y\in Y}p(x,y)logp(x,y) H(x,y)=xXyYp(x,y)logp(x,y)当X,Y相互独立时, H ( X , Y ) = H ( X ) + H ( Y ) H(X,Y)=H(X)+H(Y) H(X,Y)=H(X)+H(Y)当X,Y不独立时,可以用 I ( X , Y ) = H ( X ) + H ( Y ) − H ( X , Y ) I(X,Y)=H(X)+H(Y)-H(X,Y) I(X,Y)=H(X)+H(Y)H(X,Y)

条件熵描述变量Y在变量X确定的情况下,变量Y的熵还剩多少。 H ( X ∣ Y ) = − ∑ x ∈ X ∑ y ∈ Y p ( x , y ) l o g p ( y ∣ x ) H(X|Y)=-\displaystyle\sum_{x\in X}\displaystyle\sum_{y\in Y}p(x,y)logp(y|x) H(XY)=xXyYp(x,y)logp(yx)联合熵和条件熵的关系是: H ( X , Y ) = H ( X ) + H ( Y ∣ X ) = H ( Y ) + H ( X ∣ Y ) = H ( Y , X ) H(X,Y)=H(X)+H(Y|X)=H(Y)+H(X|Y)=H(Y,X) H(X,Y)=H(X)+H(YX)=H(Y)+H(XY)=H(Y,X)

信息增益(Kullback–Leibler divergence)又叫做KL散度。KL散度是两个概率分布P和Q差别非对称性的度量。KL散度用来度量基于Q的编码来编码来自P的样本平均所需的额外的位元数。典型情况下,P表示数据的真实分布,Q表述数据的模型分布。计算公式: D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) l o g 2 p ( x i ) q ( x i ) D_{KL}(p||q)=\displaystyle\sum_{i=1}^np(x_i)log_2\frac{p(x_i)}{q(x_i)} DKL(pq)=i=1np(xi)log2q(xi)p(xi)n为事件所有的可能性, D K L D_{KL} DKL的值与q、p分布接近程度呈正相关关系。

在CART算法中, 基尼不纯度(gini impurity)表示一个随机选中的样本在子集中被分错的可能性。基尼不纯度为这个样本被选中的概率乘以它被分错的概率。当一个节点中所有样本都是一个类时,基尼不纯度为零。
假设y的可能取值为 J J J个类别,另 i ∈ { 1 , 2 , . . . , J } i \in \lbrace 1,2,...,J\rbrace i{1,2,...,J} p i p_i pi表示被标定为第 i i i类的概率,则基尼不纯度的计算为: I G ( p ) = ∑ i = 1 J p i ∑ k = /   i p k = ∑ i = 1 J p i ( 1 − p i ) = ∑ i = 1 J ( p i − p i 2 ) = ∑ i = 1 J p i − ∑ i = 1 J p i 2 = 1 − ∑ i = 1 J p i 2 I_G(p)=\displaystyle\sum_{i=1}^Jp_i\displaystyle\sum_{k{=}\mathllap{/\,}i}p_k=\displaystyle\sum_{i=1}^Jp_i(1-p_i)=\displaystyle\sum_{i=1}^J(p_i-p_i^2)=\displaystyle\sum_{i=1}^Jp_i-\displaystyle\sum_{i=1}^Jp_i^2=1-\displaystyle\sum_{i=1}^Jp_i^2 IG(p)=i=1Jpik=/ipk=i=1Jpi(1pi)=i=1J(pipi2)=i=1Jpii=1Jpi2=1i=1Jpi2

决策树的不同分类算法(ID3算法、C4.5、CART分类树)的原理及应用场景

ID3算法

ID3算法由Ross Quinlan在1986年提出。ID3决策树可以有很多个分支,但是不能处理特征值为连续的情况。ID3算法是一种贪心算法,每次选取的分割数据的特征值都是当前的最佳选择,并不关心是否达到最优。在ID3中,每次根据“最大信息熵增益”选取当前最佳的特征来分割数据,并按照该特征的所有取值来切分,也就是说如果一个特征有4种取值,数据将被切分4份,一旦按某特征切分后,该特征在之后的算法执行中,将不再起作用,所以有观点认为这种切分方式过于迅速。ID3算法十分简单,核心是根据“最大信息熵增益”原则选择划分当前数据集的最好特征,信息熵是信息论里面的概念,是信息的度量方式,不确定度越大或者说越混乱,熵就越大。在建立决策树的过程中,根据特征属性划分数据,使得原本“混乱”的数据的熵(混乱度)减少,按照不同特征划分数据熵减少的程度会不一样。在ID3中选择熵减少程度最大的特征来划分数据(贪心),也就是“最大信息熵增益”原则。下面是计算公式:
计算数据集D的经验熵H(D): H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ H(D)=-\displaystyle\sum_{k=1}^K\frac {|C_k|}{|D|} H(D)=k=1KDCk计算特征A对数据集D的经验条件熵H(D|A): H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ D H ( D i ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ ∑ k = 1 K D i k D i l o g 2 D i k D i H(D|A)=\displaystyle\sum_{i=1}^n\frac{|D_i|}{D}H(D_i)=-\displaystyle\sum_{i=1}^n\frac{|D_i|}{|D|}\displaystyle\sum_{k=1}^K\frac{D_{ik}}{D_i}log_2\frac{D_{ik}}{D_i} H(DA)=i=1nDDiH(Di)=i=1nDDik=1KDiDiklog2DiDik计算信息增益: g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)

C4.5算法

C4.5是Ross Quinlan在1993年在ID3的基础上改进而提出的。.ID3采用的信息增益度量存在一个缺点,它一般会优先选择有较多属性值的Feature,因为属性值多的Feature会有相对较大的信息增益(信息增益反映的给定一个条件以后不确定性减少的程度,必然是分得越细的数据集确定性更高,也就是条件熵越小,信息增益越大).为了避免这个不足C4.5中是用信息增益比率(gain ratio)来作为选择分支的准则。信息增益比率通过引入一个被称作分裂信息(Split information)的项来惩罚取值较多的Feature。除此之外,C4.5还弥补了ID3中不能处理特征属性值连续的问题。但是,对连续属性值需要扫描排序,会使C4.5性能下降。 S p l i t I n f o r m a t i o n ( D , A ) = − ∑ i = 1 n ∣ D i ∣ D l o g D i D SplitInformation(D,A)=-\displaystyle\sum_{i=1}^n\frac{|D_i|}{D}log\frac{D_i}{D} SplitInformation(D,A)=i=1nDDilogDDi G a i n R a t i o ( D , A ) = g ( D , A ) S p l i t I n f o r m a t i o n ( D , A ) GainRatio(D,A)=\frac{g(D,A)}{SplitInformation(D,A)} GainRatio(D,A)=SplitInformation(D,A)g(D,A)

CART算法

CART(Classification and Regression tree)分类回归树由L.Breiman,J.Friedman,R.Olshen和C.Stone于1984年提出。ID3中根据属性值分割数据,之后该特征不会再起作用,这种快速切割的方式会影响算法的准确率。CART是一棵二叉树,采用二元切分法,每次把数据切成两份,分别进入左子树、右子树。而且每个非叶子节点都有两个孩子,所以CART的叶子节点比非叶子多1。相比ID3和C4.5,CART应用要多一些,既可以用于分类也可以用于回归。CART分类时,使用基尼指数(Gini)来选择最好的数据分割的特征,gini描述的是纯度,与信息熵的含义相似。CART中每一次迭代都会降低GINI系数。下图显示信息熵增益的一半,Gini指数,分类误差率三种评价指标非常接近。回归时使用均方差作为loss function。基尼系数的计算与信息熵增益的方式非常类似,公式如下: G i n i ( D ) = 1 − ∑ i = 0 n ( D i D ) 2 Gini(D)=1-\displaystyle\sum_{i=0}^n(\frac{D_i}{D})^2 Gini(D)=1i=0n(DDi)2 G i n i ( D ∣ A ) = ∑ i = 0 n D i D G i n i ( D i ) Gini(D|A)=\displaystyle\sum_{i=0}^n\frac{D_i}{D}Gini(D_i) Gini(DA)=i=0nDDiGini(Di)

回归树原理

一个回归树对应着输入空间(即特征空间)的一个划分以及在划分单元上的输出值。分类树中,我们采用信息论中的方法,通过计算选择最佳划分点。而在回归树中,采用的是启发式的方法。假如我们有n个特征,每个特征有 s i ( i ∈ ( 1 , n ) ) s_i(i\in(1,n)) si(i(1,n))个取值,那我们遍历所有特征,尝试该特征所有取值,对空间进行划分,直到取到特征j的取值s,使得损失函数最小,这样就得到了一个划分点。描述该过程的公式如下: m i n ( j s ) [ m i n ( c 1 ) L o s s ( y i , c 1 ) + m i n ( c 2 ) L o s s ( y i , c 2 ) ] min_{(js)}[min_{(c_1)}Loss(y_i,c_1)+min_{(c_2)}Loss(y_i,c_2)] min(js)[min(c1)Loss(yi,c1)+min(c2)Loss(yi,c2)]假设将输入空间划分为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(yixiRm)也就是该区域内所有点y值的平均数。

决策树防止过拟合手段

主要有两种原因引起决策树的过拟合:

1.样本问题:
(1)噪声数据干扰过大
(2)样本抽取错误
(3)建模时使用了样本中太多无关的输入变量
针对这种问题,需要合理、有效地抽样,用相对能够反映业务逻辑的训练集去产生决策树;

2.构建决策树的方法问题
在决策树的搭建中,我们使用的算法对于决策数的生长没有合理的限制和修剪,决策树的自由生长有可能导致每片叶子里只包含单纯的事件数据或非事件数据,这种决策树可以完美匹配训练数据,但是无法应用到新的业务的真实数据。
针对这种问题需要用到剪枝的方法,即提前停止树的生长或者对已经生成的树按照一定的规则进行后剪枝。两种常见的剪枝方法有:
(1)先剪枝(prepruning):通过提前停止树的构建而对树“剪枝”,一旦停止,节点就成为树叶。该树叶可以持有子集元组中最频繁的类。
(2)后剪枝(postpruning):它首先构造完整的决策树,允许树过度拟合训练数据,然后对那些置信度不够的结点子树用叶子结点来代替,该叶子的类标号用该结点子树中最频繁的类标记。后剪枝的剪枝过程是删除一些子树,然后用其叶子节点代替,这个叶子节点所标识的类别通过大多数原则(majority class criterion)确定。相比于先剪枝,这种方法更常用,正是因为在先剪枝方法中精确地估计何时停止树增长很困难。

模型评估

自助法(bootstrap):

训练集是对于原数据集的有放回抽样,如果原始数据集N,可以证明,大小为N的自助样本大约包含原数据63.2%的记录。当N充分大的时候, 1 − ( 1 − 1 N ) N 1-(1-\frac{1}{N})^N 1(1N1)N概率逼近 1 − e − 1 = 0.632 1-e^{-1}=0.632 1e1=0.632。抽样b次,产生b个bootstrap样本,则总准确率为(accs为包含所有样本计算的准确率): a c c b o o t = 1 b ∑ i = 1 b ( 0.632 × ε i + 0.368 × a c c s ) acc_{boot}=\frac{1}{b}\displaystyle\sum_{i=1}b(0.632\times \varepsilon _i+0.368\times acc_s) accboot=b1i=1b(0.632×εi+0.368×accs)

准确的区间估计:

将分类问题看做二项分布,则有:
令 X 为模型正确分类,p 为准确率,X 服从均值 Np、方差 Np(1-p)的二项分布。acc=X/N为均值 p,方差 p(1-p)/N 的二项分布。acc 的置信区间:
P ( − Z α 2 ≤ a c c − p p ( 1 − p ) / N ≤ Z 1 − α 2 ) = 1 − α P(-Z_{\frac{\alpha}{2}}\le \frac{acc-p}{\sqrt{\smash[b]{p(1-p)/N}}}\le Z_{1-\frac{\alpha}{2}})=1-\alpha P(Z2αp(1p)/N accpZ12α)=1α P ∈ 2 × N × a c c + Z α 2 2 ± Z α 2 Z α 2 2 + 4 × N × a c c − 4 × N × a c c 2 2 ( N + Z α 2 2 ) P\in \frac{2\times N\times acc +Z_{\frac{\alpha}{2}}^2\pm Z_{\frac{\alpha}{2}}\sqrt{\smash[b]{Z_{\frac{\alpha}{2}}^2}+4\times N\times acc-4\times N\times acc^2}} {2(N+Z_{\frac{\alpha}{2}}^2)} P2(N+Z2α2)2×N×acc+Z2α2±Z2αZ2α2+4×N×acc4×N×acc2

sklearn参数详解,Python绘制决策树

sklearn.tree.DecisionTreeClassifier
        (criterion='gini', splitter='best', max_depth=None, 
        min_samples_split=2, min_samples_leaf=1,
        min_weight_fraction_leaf=0.0, max_features=None, 
        random_state=None, max_leaf_nodes=None, 
        min_impurity_decrease=0.0,min_impurity_split=None, 
        class_weight=None, presort=False)

criterion:特征选择的标准,有信息增益和基尼系数两种,使用信息增益的是ID3和C4.5算法(使用信息增益比),使用基尼系数的CART算法,默认是gini系数。
splitter:特征切分点选择标准,决策树是递归地选择最优切分点,spliter是用来指明在哪个集合上来递归,有“best”和“random”两种参数可以选择,best表示在所有特征上递归,适用于数据集较小的时候,random表示随机选择一部分特征进行递归,适用于数据集较大的时候。
max_depth:决策树最大深度,决策树模型先对所有数据集进行切分,再在子数据集上继续循环这个切分过程,max_depth可以理解成用来限制这个循环次数。
min_samples_split:子数据集再切分需要的最小样本量,默认是2,如果子数据样本量小于2时,则不再进行下一步切分。如果数据量较小,使用默认值就可,如果数据量较大,为降低计算量,应该把这个值增大,即限制子数据集的切分次数。
min_samples_leaf:叶节点(子数据集)最小样本数,如果子数据集中的样本数小于这个值,那么该叶节点和其兄弟节点都会被剪枝(去掉),该值默认为1。
min_weight_fraction_leaf:在叶节点处的所有输入样本权重总和的最小加权分数,如果不输入则表示所有的叶节点的权重是一致的。
max_features:特征切分时考虑的最大特征数量,默认是对所有特征进行切分,也可以传入int类型的值,表示具体的特征个数;也可以是浮点数,则表示特征个数的百分比;还可以是sqrt,表示总特征数的平方根;也可以是log2,表示总特征数的log个特征。
random_state:随机种子的设置,与LR中参数一致。
max_leaf_nodes:最大叶节点个数,即数据集切分成子数据集的最大个数。
min_impurity_decrease:切分点不纯度最小减少程度,如果某个结点的不纯度减少小于这个值,那么该切分点就会被移除。
min_impurity_split:切分点最小不纯度,用来限制数据集的继续切分(决策树的生成),如果某个节点的不纯度(可以理解为分类错误率)小于这个阈值,那么该点的数据将不再进行切分。
class_weight:权重设置,主要是用于处理不平衡样本,与LR模型中的参数一致,可以自定义类别权重,也可以直接使用balanced参数值进行不平衡样本处理。
presort:是否进行预排序,默认是False,所谓预排序就是提前对特征进行排序,我们知道,决策树分割数据集的依据是,优先按照信息增益/基尼系数大的特征来进行分割的,涉及的大小就需要比较,如果不进行预排序,则会在每次分割的时候需要重新把所有特征进行计算比较一次,如果进行了预排序以后,则每次分割的时候,只需要拿排名靠前的特征就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值