决策树算法
基本概念
决策树算法,顾名思义,是基于树结构来进行决策过程。譬如我们判断一个西瓜好坏,会先从它的色泽,再从它的敲声等等来从上至下进行判断,逻辑过程类似于一颗倒着生长的大树。由于决策树的思路很像我们人在做判断,具有很好的解释性,在医疗等很多领域应用广泛。
决策树是由根节点(第一个选择点)、非叶子结点与分支(中间过程)、叶子节点(决策结果)三部分组成。一棵决策树由若干内部节点和若干叶子节点组成。
给定一个训练集:
D = D= D={ ( x 1 , y 1 ) , ( x 2 , y 2 ) . . . ( x m , y m ) (x_1,y_1),(x_2,y_2)...(x_m,y_m) (x1,y1),(x2,y2)...(xm,ym)}
属性集:
A = A= A={ a 1 , a 2 . . . a d a_1,a_2...a_d a1,a2...ad}
若将此训练集用决策树算法进行分类,首先我们要在属性集中选择一个属性作为决策树的根节点,那么我们通过什么样的判定标准去进行选择呢?
信息熵与信息增益
信息熵
熵是随机变量不确定性的度量,表示了事物内部的混乱程度,混乱程度越高,不确定性越大,熵越大。
公式:
设 X X X是一个取有限个值的离散型随机变量,其分布律为:
P ( X = x i ) = p i P(X=x_i)=p_i P(X=xi)=pi i = 1 , 2... n i=1,2...n i=1,2...n
随机变量的熵为:
H ( X ) = − ∑ i = 1 n p i l o g p i H(X)=-\sum_{i=1}^{n}{p_ilogp_i} H(X)=−∑i=1npilogpi
熵只依赖于 X X X的分布即:
H ( p ) = − ∑ i = 1 n p i l o g p i H(p)=-\sum_{i=1}^{n}{p_ilogp_i} H(p)=−∑i=1npilogpi
条件熵
条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X)表示已知随机变量X的条件下随机变量Y的不确定性,定义为X给定条件下Y的条件概率分布的熵对X的数学期望:
H ( Y ∣ X ) = ∑ i = 1 n P ( X = x i ) H ( Y ∣ X = x i ) H(Y|X)=\sum_{i=1}^{n}P(X=x_i)H(Y|X=x_i) H(Y∣X)=∑i=1nP(X=xi)H(Y∣X=xi)
信息增益
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
ID3算法
思路:
ID3算法是以信息增益为衡量标准的算法,核心是在决策树的每个结点上利用信息增益来选择特征。具体方法:从根节点开始,对结点计算所有可能的信息增益,选择信息增益最大的特征作为结点,由该特征的不同取值建立子节点,再对子节点递归的调用上述方法。
输入:训练数据集D,特征集A,阈值 ε \varepsilon ε
输出:决策树T
- 若D中所有实例属于同一类别 C k C_k Ck,则T为单节点树,并将类 C k C_k Ck 作为该结点的类标记,返回T
- 若A= ϕ \phi ϕ ,则T为则T为单结点树,并将D中实例最大的类 C k C_k Ck 作为该结点的类标记,返回T
- 否则,按信息增益算法,计算A中各特征对D的信息增益,选择信息增益最大的特征 A g A_g Ag
- 如果 A g A_g Ag 的信息增益小于阈值 ε \varepsilon ε ,则置T为单结点树,并将D中实例数最大的类 C k C_k Ck 作为该结点的类标记,返回T
- 否则,对 A g A_g Ag 的每一可能值 a i a_i ai ,依 A g = a i A_g=a_i Ag=ai 将D分割为若干个非空子集 D i D_i Di ,将 D i D_i Di 中实例数最大的类作为标记,构建子结点,由结点及其子结点构造树T,返回T
- 对于第 i 个子结点,以 D i D_i Di 为训练集,以 A − A g A-A_g A−Ag 作为特征集,递归调用 1-5 步,返回树 T i T_i Ti
信息增益算法;
1.将训练集D分成K类,则D的信息增益为:
H ( D ) = ∑ k = 1 K ∣ C k ∣ ∣ D ∣ l o g 2 ∣ C k ∣ ∣ D ∣ H(D)=\sum_{k=1}^{K}\dfrac{|C_k|}{|D|}log_2\dfrac{|C_k|}{|D|} H(D)=∑k=1K∣D∣∣Ck∣log2∣D∣∣Ck∣
C k C_k Ck为在D上被分成第k类的样本集
2.若选择一个特征A作为结点,则D在A下的条件熵为:
H ( D ∣ A ) = ∑ 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)=\sum_{i=1}^{n}\dfrac{|D_i|}{|D|}\sum_{k=1}^K\dfrac{|D_{ik}|}{|D_i|}log_2\dfrac{|D_{ik}|}{|D_i|} H(D∣A)=∑i=1n∣D∣∣Di∣∑k=1K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
特征A将D分为n个子集 D i D_i Di , D i k D_{ik} Dik 为在 D i D_i Di 上被分为第k类的样本集
3.此时的信息增益为:
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
C4.5算法
C4.5算法是对ID3算法的改进版,步骤与ID3算法一样,但是选择结点的衡量标准变成了信息增益比。
信息增益比
对于训练集来说,信息增益对于结点的选择并不绝对,经验熵越大,信息增益越大,经验熵越小,信息增益也越小。为了解决这个问题,我们用信息增益比 g R ( D , A ) g_R(D,A) gR(D,A) 来代替信息增益。
g R ( D , A ) = g ( D , A ) H ( D ) g_R(D,A)=\dfrac{g(D,A)}{H(D)} gR(D,A)=H(D)g(D,A)
CART算法
对于一个具有非常多特征的训练集来说,前两种算法会使得决策树的分支非常的庞大,对于运算和剪枝来说都比较困难。CART算法就能很好的解决这样的问题。CART算法是基于二叉树的一种决策算法,它采用基尼指数的衡量标准来选择特征作为结点。
基尼指数
基尼指数是表示了从样本集中任意取出两个样本不属于同一类的概率,基尼指数越小样本集约纯。
分类问题中假设有K个类,样本点属于第k类的概率为 p k p_k pk,则概率分布的基尼指数定义为:
G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) Gini(p)=\sum_{k=1}^Kp_k(1-p_k) Gini(p)=∑k=1Kpk(1−pk)
G i n i ( p ) = 1 − ∑ k = 1 K p k 2 Gini(p)=1-\sum_{k=1}^Kp_k^2 Gini(p)=1−∑k=1Kpk2
对于二分类问题
G i n i ( p ) = 2 p ( 1 − p ) Gini(p)=2p(1-p) Gini(p)=2p(1−p)
给定训练集D,其基尼指数为:
G i n i ( D ) = 1 − ∑ k = 1 K { ∣ C k ∣ ∣ D ∣ } 2 Gini(D)=1-\sum_{k=1}^{K}\left\{ \frac{|C_k|}{|D|} \right\}^2 Gini(D)=1−∑k=1K{∣D∣∣Ck∣}2
这里 C k C_k Ck 是在D上属于第k类的样本集,
如果样本集D根据特征A上的某一取值a分为两部分子集 D 1 , D 2 D_1,D_2 D1,D2
在特征A的条件下,D的基尼指数定义为:
G i n i ( D , A ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) Gini(D,A)=\dfrac{|D_1|}{|D|}Gini(D_1)+\dfrac{|D_2|}{|D|}Gini(D_2) Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2) …(1)
算法如下:
输入:训练集D,特征集A
输出:决策树
1.计算现有特征对训练集 D 的基尼指数,选择基尼指数最小的特征作为结点,对于每个特征A来说,对其可能取的每一个a值,根据样本点对A==a的“ 是 ”或“ 否 ”将 D 划分成 D 1 D_1 D1, D 2 D_2 D2两个样本集,再根据(1)式计算基尼指数。
2.在所有可能的特征A,和A所有可能的取值a中,选取基尼指数最小的特征和取值,作为最优特征和最优切分点。依最优特征和最优切分点,从现有结点生成两个结点,并将训练样本集依特征分配到两个结点中去。
3.对于生成的两个结点递归的调用步骤1和步骤2。
4.生成CART决策树。
决策树剪枝
剪枝是为了防止决策树对样本出现过拟合问题,能够使模型具有更好的泛化能力。
预剪枝
预剪枝策略是指在决策树生成过程中,对每个结点在划分前进行评估,如果当前结点的划分不能带来决策树泛化能力上的提升,就停止划分,并将该结点划分为叶子结点。
后剪枝
后剪枝策略是指在构造出一棵完整的决策树之后,由底至上的对非叶结点进行评估,若将该结点对应子树替换为叶子结点后能够对决策树的泛化能力有提高,就替换为叶子结点。
注:对某个结点剪枝前后,决策树泛化能力变化不大,根据奥卡姆剃刀原则,剪枝会更好。
连续值处理
我们在处理实际数据的时候,很多时候样本集的特征的取值为连续值。通常的处理方法是,将连续值从小到大排列,取中值为t,以t为切分点,将大于t的分为 D + D^+ D+ 小于t的分为 D − D^- D− 。将连续值当做离散值来进行处理。
参考:
李航《统计学习方法》
周志华《机器学习》