信息熵
一个集群中, 一类数据的出现概率假设为p,那么它所对应的信息量为-log p。考虑当p=1时,表示该集群中只有一个分类,那么这类集群包含的信息量为0。反之让p接近0时,表示该数据为小概率事件,那么这类时间发生所包含的信息量将会巨大。
对于整个集群的信息量,是由各类数据的权重累加而成,公式即为:
H ( X ) = ∑ i − P ( x i ) l o g P ( x i ) H(X)=\sum_{i}^{} -P(x_{i})log P(x_{i}) H(X)=∑i−P(xi)logP(xi)
这也被称为集群的信息熵
条件熵
如果集群X有个映射Y,那么还能够做一个条件概率的信息熵。
我们假设,映射Y,或者说标签Y,有n个分类,分别为 Y 1 , Y 2 . . . Y n {Y_{1},Y_{2}...Y_{n}} Y1,Y2...Yn。对于第i个分类下,又对应了k个X集群,即:
X = X 1 , X 2 . . . X k X={X_{1},X_{2}...X_{k}} X=X1,X2...Xk
那么就有 Y = Y i Y=Y_{i} Y=Yi是的条件熵 H ( X ∣ Y i ) = ∑ i − P ( x i ) l o g P ( x i ) H(X \mid Y_{i})=\sum_{i}^{} -P(x_{i})log P(x_{i}) H(X∣Yi)=∑i−P(xi)logP(xi)
再将所有的 Y i Y_{i} Yi按比例累加起来,就得到了整个函数集的条件熵了。
H ( X ∣ Y ) = ∑ y ∈ Y P ( y ) H ( X ∣ Y = y ) H(X \mid Y)=\sum_{y \in Y}^{} P(y)H(X \mid Y=y) H(X∣Y)=∑y∈YP(y)H(X∣Y=y)
信息增益
G a i n = 标 签 Y 本 身 信 息 熵 − 在 特 征 X 分 割 下 的 条 件 熵 ( 千 万 注 意 X 和 Y 的 位 置 ) Gain=标签Y本身信息熵-在特征X分割下的条件熵(千万注意X和Y的位置) Gain=标签Y本身信息熵−在特征X分割下的条件熵(千万注意X和Y的位置)
G a i n = H ( Y ) − H ( Y ∣ X ) = H ( Y ) − ∑ x ∈ X P ( x ) H ( Y ∣ X = x ) Gain=H(Y)-H(Y \mid X)=H(Y)-\sum_{x \in X}^{} P(x)H(Y \mid X=x) Gain=H(Y)−H(Y∣X)=H(Y)−∑x∈XP(x)H(Y∣X=x)
增益率
增益率定义为标签Y某特征X下的信息增益,除以该特征X本身的信息熵。即:
G a i n R a t i o = G a i n ( Y ∣ X ) H ( X ) Gain Ratio=\frac {Gain(Y \mid X)}{H(X)} GainRatio=H(X)Gain(Y∣X)
这样的结果是,如果特征X的分类越多,会导致增益率越小。
基尼指数
基尼指数类似于信息熵,都想表达“信息越分散,信息量越大”。只不过,信息熵用的方法是 − l o g P ( x i ) -log P(x_{i}) −logP(xi),而基尼系数用的是 1 − P ( x i ) 1-P(x_{i}) 1−P(xi)。换句话说,基尼值反映了从数据集中随机抽取两个样本,其类别标记不一致的概率,因此基尼值越小,则数据集纯度越高。则有:
G i n i ( X ) = ∑ i P ( x i ) ( 1 − P ( x i ) ) Gini(X)=\sum_{i}^{} P(x_{i})(1-P(x_{i})) Gini(X)=∑iP(xi)(1−P(xi))
G i n i ( X ) = ∑ i P ( x i ) − ∑ i P ( x i ) 2 Gini(X)=\sum_{i}^{} P(x_{i})-\sum_{i}^{}P(x_{i})^2 Gini(X)=∑iP(xi)−∑iP(xi)2
G i n i ( X ) = 1 − ∑ i P ( x i ) 2 Gini(X)=1-\sum_{i}^{}P(x_{i})^2 Gini(X)=1−∑iP(xi)2
基尼增益
类似信息增益,但是公式不同。
G i n i − G a i n = ∑ x ∈ X P ( x ) G i n i ( Y ∣ X = x ) Gini-Gain=\sum_{x \in X}^{} P(x)Gini(Y \mid X=x) Gini−Gain=∑x∈XP(x)Gini(Y∣X=x)
之前信息增益选择的是最大的特征,而在基尼增益中选取的则是最小的值。
ID3算法流程
1.计算标签Y的信息熵
2. 计算各特征的条件熵
3. 计算各特征的信息增益
4. 选取增益最大的特征,按特征类别构建第一层分裂。
5. 选择特征类别中未能与标签对应的那一个类别,设定为新的子集。
6. 在新的子集中,再对余下的特征做信息增益的计算,并往下分裂。
7. 分裂直至子集中的特征类别能够与标签一一对应为止。
ID3算法的优点
算法结构简单;
算法清晰易懂;
非常灵活方便;
不存在无解的危险;
可以利用全部训练例的统计性质进行决策,从而抵抗噪音。
ID3算法的缺点
ID3算法采用信息增益来选择最优划分特征,然而人们发现,信息增益倾向与取值较多的特征,对于这种具有明显倾向性的属性,往往容易导致结果误差;
ID3算法没有考虑连续值,对与连续值的特征无法进行划分;
ID3算法无法处理有缺失值的数据;
ID3算法没有考虑过拟合的问题,而在决策树中,过拟合是很容易发生的;
ID3算法采用贪心算法,每次划分都是考虑局部最优化,而局部最优化并不是全局最优化,当然这一缺点也是决策树的缺点,获得最优决策树本身就是一个NP难题,所以只能采用局部最优。
C4,5算法流程
与ID3基本一致,除了它是选择增益率最大的特征,而不是信息增益最大的特征。使用增益率可以有效解决ID3算法中偏向于选择类别较多的特征的缺点。不过这样也会导致另一种极端,即倾向选择分类较小特征。作为折中,这里将用到一种启发式的算法。
1.计算标签Y的信息熵
2. 计算各特征的条件熵
3. 计算各特征的信息熵
4. 计算各特征的信息增益
5. 计算各特征的信息增益率
6. 先寻找信息增益大于平均增益的特征,再在这类特征中选择增益率最大的特征,构建第一层分裂
7. 将信息增益低于平均值(或者设定值)的定为单节点,即不再分裂。
8. 选择特征类别中未能与标签对应的那一个类别,设定为新的子集。
9. 在新的子集中,再对余下的特征做信息增益的计算,并往下分裂。
10. 分裂直至子集中的特征类别能够与标签一一对应,或者已经没有可分裂的特征为止。
C4.5优点
用信息增益率来选择属性,克服了ID3算法选择属性时偏向选择取值多的属性的不足
在决策树的构造过程中进行剪枝,不考虑某些具有很好元素的节点。
能够完成对联系属性的离散化处理。
能够对不完整数据进行处理。
C4.5缺点
算法效率低,值适合用于能够驻留于内存的数据集
CART算法采用了Gini系数作为分裂判定,而非信息熵或者条件熵。
其次,ID3和C4.5会按照特征的类别,分别成不同的叉树。如西瓜的大小这一特征若有三种类别,在ID3和C4.5中就会分成“大”“中”“小”三个分叉;而在CART中,永远只有二分法,即“大或中”及“小”,或者“中或小”及“大”,或者“大或小”及“中”。
这么做的好处是,CART除了能够处理离散型变量之外,也能处理连续型变量。如西瓜的直径这个特征,可以分为“小于等于10cm”和“大于10cm”两种类型。
但是通常来说,一个特征会有多个类型,这就导致了二叉树的划分会有很多种可能。再实际过程中,CART采取的是单变量分析法。例如特征含有A1,A2,A3,A4四个变量,那我们仅考虑四种分隔形式:(A1 及 非A1),(A2 及 非A2),(A3 及 非A3),(A4 及 非A4),而不考虑2/2的分隔形式。这样可以降低计算量。
而对于连续型变量而言,则是按连续值先按从大到小排序,以两点之间的平均值作为分隔点,依次查看各个分割的基尼指数。(有些资料中显示,对于连续变量的回归分裂,也有使用最小二乘法,即比较 ( x L − c ) 2 + ( x R − c ) 2 (x_{L}-c)^2 +(x_{R}-c)^2 (xL−c)2+(xR−c)2
CART算法流程
1.计算标签Y的基尼指数
2. 遍历各特征,在特征中遍历特征类型,将该特征分为两类,分别计算基尼增益。
3. 选取基尼增益最小的值,作为该特征的基尼指数。
4. 比较各特征之间的基尼指数,选取最小的作为第一次分裂,
5. 在以ID3的模式,两个分裂继续往下递归分裂,直至子分类与标签完全一致,或者无特征可分裂,或者基尼指数小于指定值时,停止分裂。
CART的突破性贡献还在于,它提供了剪枝策略,可以在建树的基础上,有效防止过拟合。
剪枝分为了前剪枝和后剪枝,前剪枝在建树之前,先对标签和特征做一次显著性测试,如卡方检验等,如果显著性不明显,则不对此特征做训练。
后剪枝方法有多种,比如:代价复杂性剪枝、最小误差剪枝、悲观误差剪枝等等。这里我们只介绍代价复杂性剪枝法。
对于分类回归树中的每一个非叶子节点计算它的表面误差率增益值α
α = R ( t ) − R ( T t ) ∣ N T t ∣ − 1 \alpha=\frac {R(t)-R(T_{t})}{|N_{T_{t}}|-1} α=∣NTt∣−1R(t)−R(Tt)
∣ N T t ∣ |N_{T_{t}}| ∣NTt∣是子树中包含的叶子节点个数;
R(t)是节点t的误差代价
R(t)=r(t)∗p(t)
r(t)是节点t的误差率;
p(t)是节点t上的数据占所有数据的比例。
R(Tt)是子树Tt的误差代价,如果该节点不被剪枝。它等于子树Tt上所有叶子节点的误差代价之和。
举个例子,以上图所示,我们计算节点T4的α值。在这张图中,只有T8,T9,T7为叶子,T4,T6均为非叶子节点。假设一共有60个数据。图中的圈里左右两边的数字分别表示,判断正确和错误的数据。例如T4中,有9个数据判断正确,有7个数据判断错误。
因此对于T4,误差率r(t)为7/16;
数据占比 p ( t ) = 16 60 p(t)=\frac {16}{60} p(t)=6016
即节点4的误差代价 R ( t ) = r ( t ) ∗ p ( t ) = 7 / 60 R(t)=r(t)*p(t)=7/60 R(t)=r(t)∗p(t)=7/60
再来看 R ( T t ) R(T_{t}) R(Tt)。它表示子树上所有叶子的误差代价之和。对于T4,它所有子树的叶子为T8. T9, T7。因此有:
R ( T t ) = 2 5 ∗ 5 60 + 2 2 ∗ 2 60 + 3 9 ∗ 9 60 = 7 60 R(T_{t})=\frac {2}{5}*\frac {5}{60}+\frac {2}{2}*\frac {2}{60}+\frac {3}{9}*\frac {9}{60}=\frac {7}{60} R(Tt)=52∗605+22∗602+93∗609=607
那么α就等于了0.
对于代价复杂性算法,它是要比较不同节点之间的α值,最后只保留最小的α值的树枝。那在这个案例中,我们假设有另一个决策树,其结构基本与上面那棵相同,除了T9叶子中,有2个判断正确,0个判断错误。那么就有:
R ( T t ) = 2 5 ∗ 5 60 + 0 2 ∗ 2 60 + 3 9 ∗ 9 60 = 5 60 R(T_{t})=\frac {2}{5}*\frac {5}{60}+\frac {0}{2}*\frac {2}{60}+\frac {3}{9}*\frac {9}{60}=\frac {5}{60} R(Tt)=52∗605+20∗602+93∗609=605
∣ N T t ∣ = 3 |N_{T_{t}}|=3 ∣NTt∣=3 (T8,T9,T7三个)
则 α = 7 / 60 − 5 / 60 3 − 1 = 1 60 \alpha=\frac {7/60-5/60}{3-1}=\frac {1}{60} α=3−17/60−5/60=601
显然这棵树的α大于了前一棵树的α,因此要将这棵树减掉。
总结:代价复杂性剪枝,就是自上而下遍历所有节点,寻找代价最小的α值,剪掉α较大的树。
参考资料:https://www.biaodianfu.com/decision-tree.html
https://www.cnblogs.com/zhangchaoyang/articles/2709922.html