数据挖掘之决策树_绝对能看懂!

数据挖掘之决策树

决策树是一种机器学习算法,可以用于解决分类或回归问题。

分类问题

1、用决策树解决分类问题,分为两个阶段:

  • 训练阶段:通过学习训练数据集,构造出一颗决策树
  • 分类阶段:用生成的决策树对新的数据集进行分类

2、决策树长什么样

例如有人给我们介绍新的对象的时候,我们就要一个个特点去判断,于是这种判断的过程就可以画成一棵树,例如根据特点依次判断:

如上,整个决策过程以树的形式进行示意和编码,就形成了决策树。

决策树的结构

  • 根节点:包含数据集中的所有数据的集合
  • 内部节点(非叶子节点):每个内部节点为一个判断条件,并且包含数据集中满足从根节点到该节点所有条件的数据的集合。内部节点对应的数据的集合别分到两个或多个子节点中。
  • 叶节点:叶节点为最终的类别,被包含在该叶节点的数据属于该类别。

如何构造决策树

可以这样理解什么是熵,用于描述一个集合内部的混乱程度,熵越大,越混乱,集合所包含的类别种类越多,越不纯。熵的计算公式如下:

E n t r o p y ( D ) = − ∑ i = 1 n P i log ⁡ 2 ( P i ) Entropy(D)=-\sum_{i=1}^{n}P_i \log_2 (P_i) Entropy(D)=i=1nPilog2(Pi)

D 表 示 数 据 集 ; D表示数据集; D
i 表 示 分 类 的 类 别 个 数 ; i表示分类的类别个数; i
P i 表 示 类 别 i 的 概 率 ; P_i表示类别i的概率; Pii

假设,有A和B两个集合,A{1,2,3,4,5},B{1,1,1,1,2},A和B的熵计算如下:

E n t r o p y ( A ) = − [ P 1 log ⁡ 2 ( P 1 ) + P 2 log ⁡ 2 ( P 2 ) + P 3 log ⁡ 2 ( P 3 ) + P 4 log ⁡ 2 ( P 4 ) + P 5 log ⁡ 2 ( P 5 ) ] = − ( 1 5 × log ⁡ 2 1 5 × 5 ) = − log ⁡ 2 1 5 = 2.321 E n t r o p y ( B ) = − [ P 1 log ⁡ 2 ( P 1 ) + P 2 log ⁡ 2 ( P 2 ) ] = − ( 4 5 × log ⁡ 2 4 5 + 1 5 × log ⁡ 2 1 5 ) = 0.7219 \begin{aligned} \\ Entropy(A) & =-[P_1 \log_2 (P_1)+P_2 \log_2 (P_2)+P_3 \log_2 (P_3)+P_4 \log_2 (P_4)+P_5 \log_2 (P_5)] \\ & =-(\frac{1}{5}\times \log_2 \frac{1}{5}\times 5) \\ & =- \log_2 \frac{1}{5}=2.321 \\ \\ Entropy(B) & =-[P_1\log_2(P_1)+P_2\log_2(P_2)] \\ & =-(\frac{4}{5}\times\log_2\frac{4}{5}+\frac{1}{5}\times\log_2\frac{1}{5}) =0.7219 \\ \\ \end{aligned} Entropy(A)Entropy(B)=[P1log2(P1)+P2log2(P2)+P3log2(P3)+P4log2(P4)+P5log2(P5)]=(51×log251×5)=log251=2.321=[P1log2(P1)+P2log2(P2)]=(54×log254+51×log251)=0.7219

由上可知,Entropy(A) > Entropy(B) ,所以集合A比集合B更混乱,集合A内部的数据类别多、纯度低。

条件熵

E n t r o p y ( D ∣ A ) = ∑ i = 1 n P i E n t r o p y ( A = a i ) Entropy(D|A)= \sum_{i=1}^{n}P_iEntropy(A=a_i) Entropy(DA)=i=1nPiEntropy(A=ai)

D 表 示 数 据 集 ; D表示数据集; D
A 表 示 分 类 属 性 ; A表示分类属性; A
i 表 示 A 的 取 值 个 数 ; i表示A的取值个数; iA
A = a i 表 示 A 取 第 i 个 属 性 值 a i ; A=a_i表示A取第i个属性值a_i; A=aiAiai
P i 表 示 A = a i 的 概 率 ; P_i表示A=a_i的概率; PiA=ai
E n t r o p y ( A = a i ) 表 示 A = a i 时 数 据 集 的 熵 Entropy(A=a_i)表示A=a_i时数据集的熵 Entropy(A=ai)A=ai
E n t r o p y ( D ∣ A ) 表 示 D 选 择 A 作 为 分 类 条 件 时 的 熵 Entropy(D|A)表示D选择A作为分类条件时的熵 Entropy(DA)DA

信息增益

G a i n ( D , A ) = E n t r o p y ( D ) − E n t r o p y ( D ∣ A ) Gain(D,A)= Entropy(D) - Entropy(D|A) Gain(D,A)=Entropy(D)Entropy(DA)

信息增益率

G a i n _ r a t i o ( D , A ) = G a i n ( D , A ) I V ( A ) 其 中 , I V ( A ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log ⁡ 2 ( ∣ D v ∣ ∣ D ∣ ) \begin{aligned} Gain\_ratio(D,A) & = \frac{Gain(D,A)}{IV(A)} \\ \\ 其中,IV(A) & =-\sum_{v=1}^{V}\frac{|D^v|}{|D|}\log_2 (\frac{|D^v|}{|D|}) \\ \end{aligned} Gain_ratio(D,A)IV(A)=IV(A)Gain(D,A)=v=1VDDvlog2(DDv)

IV(A)的计算公式与熵的计算公式一模一样,IV(A)是指属性A自身的熵,也就是属性A的纯度,如果属性A只有少量取值,那么A的纯度就比较高,否则,纯度就越低。

基尼系数

G i n i = ∑ k = 1 K P k ( 1 − P k ) = 1 − ∑ k = 1 K P k 2 \begin{aligned} Gini = \sum_{k=1}^{K}P_k(1-P_k)=1-\sum_{k=1}^{K}P_k^2 \end{aligned} Gini=k=1KPk(1Pk)=1k=1KPk2

同样使用上面的集合A和集合B,分别计算A和B的基尼系数:

G i n i ( A ) = 1 − ( P 1 2 + P 2 2 + P 3 2 + P 4 2 + P 5 2 ) = 1 − [ 5 × ( 1 5 ) 2 ] = 0.8 G i n i ( B ) = 1 − ( P 1 2 + P 2 2 ) = 1 − [ ( 4 5 ) 2 + ( 1 5 ) 2 ] = 0.32 \begin{aligned} \\ Gini(A) & =1-(P_1^2+P_2^2+P_3^2+P_4^2+P_5^2) \\ & =1-[5\times (\frac{1}{5})^2] \\ & = 0.8 \\ \\ Gini(B) & =1-(P_1^2+P_2^2) \\ & =1-[(\frac{4}{5})^2+(\frac{1}{5})^2] \\ & = 0.32 \end{aligned} Gini(A)Gini(B)=1(P12+P22+P32+P42+P52)=1[5×(51)2]=0.8=1(P12+P22)=1[(54)2+(51)2]=0.32

可以看出基尼系数越小,说明纯度越高。

构造决策树的基本想法是随着树深度的增加,节点的熵迅速地降低。熵降低的速度越快越好,这样我们有望得到一颗深度最小的树。

一个简单的问题讲解如何构造决策树

有如下训练集D,共有14行数据,每行数据包含4个特征属性(outlook、tempreature、humidity、windy),play为分类结果(yes表示打篮球、no表示不打篮球):

假设没有给定任何用于分类的特征属性(天气、温度、湿度等),通过计算可以得到,该训练集D中打篮球的概率为9/14,即 P ( y e s ) = 9 / 14 P(yes)=9/14 P(yes)=9/14;不打篮球的概率为5/14,即 P ( n o ) = 5 / 14 P(no)=5/14 P(no)=5/14。此时该训练集D的熵为:

E n t r o p y ( D ) = − [ P y e s log ⁡ 2 ( P y e s ) + P n o log ⁡ 2 ( P n o ) ] = − ( 9 14 × log ⁡ 2 9 14 + 5 14 × log ⁡ 2 5 14 ) = 0.940 \begin{aligned} \\ Entropy(D) & =-[P_{yes} \log_2(P_{yes})+P_{no} \log_2(P_{no})] \\ & =-(\frac{9}{14}\times\log_2\frac{9}{14}+\frac{5}{14}\times \log_2\frac{5}{14}) =0.940 \\ \\ \end{aligned} Entropy(D)=[Pyeslog2(Pyes)+Pnolog2(Pno)]=(149×log2149+145×log2145)=0.940

1、那么,该训练集中有4个特征属性,到底选哪个作为根节点比较好?

分别计算每个属性做根节点时的熵值。

属性outlook不同取值下的熵(参考下图中的“1.基于天气的划分”,可以计算出不同取值下打篮球和不打篮球的概率):
outlook=sunny时, P ( y e s ) = 2 / 5 P(yes)=2/5 P(yes)=2/5 P ( n o ) = 3 / 5 P(no)=3/5 P(no)=3/5 E n t r o p y ( o u t l o o k = s u n n y ) = 0.971 Entropy(outlook=sunny)=0.971 Entropy(outlook=sunny)=0.971
outlook=overcast时, P ( y e s ) = 1 P(yes)=1 P(yes)=1 P ( n o ) = 0 P(no)=0 P(no)=0 E n t r o p y ( o u t l o o k = o v e r c a s t ) = 0 Entropy(outlook=overcast)=0 Entropy(outlook=overcast)=0
outlook=rainy时, P ( y e s ) = 3 / 5 P(yes)=3/5 P(yes)=3/5 P ( n o ) = 2 / 5 P(no)=2/5 P(no)=2/5 E n t r o p y ( o u t l o o k = r a i n y ) = 0.971 Entropy(outlook=rainy)=0.971 Entropy(outlook=rainy)=0.971

由训练集D中的数据可知,outlook取sunny、overcast、rainy的概率分别为5/14、4/14、5/14,所以当该训练集D选择outlook做分类条件时,条件熵 E n t r o p y ( D ∣ o u t l o o k ) = 5 / 14 × 0.971 + 4 / 14 × 0 + 5 / 14 × 0.971 = 0.693 Entropy(D|outlook)=5/14\times0.971+4/14\times0+5/14\times0.971=0.693 Entropy(Doutlook)=5/14×0.971+4/14×0+5/14×0.971=0.693。由此可见,如果outlook做根节点,那么原始集合的熵就会从0.9401下降至0.693,信息增益 G a i n ( o u t l o o k ) = 0.940 − 0.693 = 0.247 Gain(outlook)=0.940-0.693=0.247 Gain(outlook)=0.9400.693=0.247

同理,可以算出 G a i n ( t e m p r e a t u r e ) = 0.029 Gain(tempreature)=0.029 Gain(tempreature)=0.029 G a i n ( h u m i d i t y ) = 0.152 Gain(humidity)=0.152 Gain(humidity)=0.152 G a i n ( w i n d y ) = 0.048 Gain(windy)=0.048 Gain(windy)=0.048。比较可得, G a i n ( o u t l o o k ) Gain(outlook) Gain(outlook)的值最大,说明outlook做根节点的话能在第一步就使得整体的熵值下降得最快,故选择outlook做根节点。

2、选完根节点后,又该选择哪个属性做内部节点?

其实就是重复上述选择根节点的过程。

在第一步中,我们已经选择outlook做根节点,因为outlook有三种取值,所以会将原始数据集划分为三个数据集。对于每个划分后所产生的数据集来说,其实这又是一个选谁当根节点的问题,此时还剩下三个属性(tempreature、humidity、windy),分别计算 G a i n ( t e m p r e a t u r e ) Gain(tempreature) Gain(tempreature) G a i n ( h u m i d i t y ) Gain(humidity) Gain(humidity) G a i n ( w i n d y ) Gain(windy) Gain(windy),选最大者作为下一个内部节点。

依此类推,构造决策树。当熵降为0时,就没必要再往下分裂节点了,此时的叶子节点是纯的,这是理想情况下。最坏的情况是,决策树的深度为属性的个数,叶子节点不纯(这意味着我们要以一定的概率作出决策)。

算法介绍

  • ID3:采用信息增益来选择属性
  • C4.5:采用信息增益率来选择属性
  • CART:采用Gini系数来选择属性

ID3

缺点:

1、用信息增益来构造决策树,容易出现过拟合情况。过拟合是指构造出来的决策树分类分得太好了,每个叶子节点都是纯的,但是分得太细了,每个叶子节点包含的数据都很少,这样的决策树往往缺少泛化能力,表现为在训练集上的分类效果很好,但在测试集上的分类效果很差,容错率低。

2、只能处理离散型属性。

C4.5

它是ID3的改进算法,使用信息增益率来选择属性,规避了ID3的缺点。

优点:

1、能够处理连续型属性
首先把连续型属性离散化,把连续型属性的取值分成不同的区间,依据是比较各个分裂点的Gain值的大小。

连续型属性如何选取分界点:贪婪算法。

如何评价决策数的效果

评价函数
C ( T ) = ∑ t ϵ l e a f N t ⋅ H ( t ) C(T)=\sum_{t\epsilon leaf}N_t\cdot H(t) C(T)=tϵleafNtH(t)

t表示每个叶子节点;
N表示叶子节点中数据的个数;
H(t)表示叶子节点的熵值;
C(T)的值越小越好。

如何得到一颗高度最小的决策树

答案就是:剪枝。

预剪枝:在构造决策树的过程中,提前停止,不再往下分裂。边构建,边剪枝。

后剪枝:决策树构建好后才开始剪枝。后剪枝需要遍历每个内部节点的 C α ( T ) C_\alpha(T) Cα(T)的值,如果一个节点分裂后的 C α ( T ) C_\alpha(T) Cα(T)值大于未分裂的 C α ( T ) C_\alpha(T) Cα(T)值,那就把它分裂出来的剪掉。

C α ( T ) = C ( T ) + α ⋅ ∣ T l e a f ∣ C_\alpha(T)=C(T)+\alpha \cdot |T_{leaf}| Cα(T)=C(T)+αTleaf

其 中 , C ( T ) 是 前 面 提 到 的 评 价 函 数 ; 其中,C(T)是前面提到的评价函数; C(T)
∣ T l e a f ∣ 表 示 叶 子 节 点 的 个 数 。 叶 子 节 点 的 个 数 越 多 , 损 失 越 大 , 决 策 树 的 效 果 也 就 越 差 。 |T_{leaf}|表示叶子节点的个数。叶子节点的个数越多,损失越大,决策树的效果也就越差。 Tleaf

随机森林

随机森林的特点:
1、有放回随机取样
2、特征随机选择
3、随机选择的n个样本,构造出n棵决策树,共同决定最终的分类结果

Python Sklearn 决策树实战

Sklearn使用教程

参考文档:
Sklearn 中文文档
Python之Sklearn使用教程

猜你喜欢

转载自blog.csdn.net/qq_36569032/article/details/107385327