决策树算法
给定一组数据,如果特征值与标签值都是连续值,很容易可以判断出要用回归算法去拟合这组数据。如果标签值是离散值,那就要用分类算法去对数据进行分类任务。那么如果这组数据的特征值是离散值,我们用普逻辑回归算法很难对数据进行分类,那么这时候我们可以选择用决策树算法。
一、算法简介:
决策树算法是一种基于规则的方法,他用一组嵌套的规则进行预测。在树的每个决策节点处,根据判断结果进入一个分支,反复执行这种操作直到到达叶子节点,得到预测结果。这些规则是通过训练得到的,而不是人工制定的。简单来说决策树的目的就是构造一棵分类树,每一层都进行一个特征判别(可以看作是一个" i f − t h e n if-then if−then"规则),经过指定的深度之后将 l a b e l label label值正确分类。但值得说明的是,每一层的特征不是随便选取的,事实上决策树就是一个条件概率模型,基于特征空间划分的分类的条件概率模型有无穷多个,而我们选择的条件概率模型应该具有很好的准确度以及对未知数据有很好的预测性,这就限制了每一层的判别特征选取。(取自《机器学习原理、算法与应用》、《统计学习方法》)
二、算法描述:
1、信息增益
为了理解决策树算法,我们先给定信息增益也就是熵的概念。
在统计学中,熵是表示随机变量不确定性的度量。我们设 x x x是一个取有限个值都离散随机变量,它得概率分布为:
P ( X = x i ) = p i , i = 1 , 2 , 3 , . . . , n P(X=x_i)=p_i, i=1, 2, 3 ,...,n P(X=xi)=pi,i=1,2,3,...,n
则随机变量X的熵定义为:
H ( X ) = − ∑ i = 1 n p i l o g p i H(X)=-\sum^n_{i=1}p_ilogp_i H(X)=−∑i=1npilogpi
由公式可以看出,随机变量的不确定性越大,熵就越大。
举个例子:
假设商店只能出售三个物品,A商店选择出售一个篮球、一个足球和一个排球,B商店选择出售两个篮球和一个足球。我们根据公式计算一下A和B商店出售物品的熵值:
A : H ( X ) = − p 1 l o g p 1 − p 2 l o g p 2 − p 3 l o g p 3 = − 1 3 l o g 1 3 − 1 3 l o g 1 3 − 1 3 l o g 1 3 = 0.4771 A: H(X)=-p_1logp_1-p_2logp_2-p_3logp_3=-\frac{1}{3}log\frac{1}{3}-\frac{1}{3}log\frac{1}{3}-\frac{1}{3}log\frac{1}{3}=0.4771 A:H(X)=−p1logp1−p2logp2−p3logp3=−31log31−31log31−31log31=0.4771
B : H ( X ) = − p 1 l o g p 1 − p 2 l o g p 2 = − 2 3 l o g 2 3 − 1 3 l o g 1 3 = 0.2764 B: H(X) = -p_1logp_1-p_2logp_2=-\frac{2}{3}log\frac{2}{3}-\frac{1}{3}log\frac{1}{3}=0.2764 B:H(X)=−p1logp1−p2logp2=−32log32−31log31=0.2764
A商店出售了三个品种的商品,而B商店出售了两个品种的商品,显然A商店的不确定性(为了便于理解我们可以将不确定性理解为散乱程度)比较大,而经过公式计算显然A的熵也比B的熵大。
值得注意的是,在举的例子中熵值整体上很小,因为我们采用的是以10为底的对数,通常二分类任务采用的底为2或者 e e e,但是多分类情况下笔者更喜欢用以10为底的对数。
在数据中我们根据特征 X X X来计算 Y Y Y的熵叫做条件熵。设随机变量 ( X , Y ) (X, Y) (X,Y),其联合概率分布为:
P ( X = x i , Y = y i ) = p i j , i = 1 , 2 , . . . , n ; j = 1 , 2 , . . . , n P(X=x_i, Y=y_i)=p_{ij},i=1, 2,...,n; j=1,2,...,n P(X=xi,Y=yi)=pij,i=1,2,...,n;j=1,2,...,n
设由随机变量 X X X给定的条件下随机变量 Y Y Y的条件熵为 H ( Y ∣ X ) H(Y|X) H(Y∣X),那么
H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X)=\sum^n_{i=1}p_iH(Y|X=x_i) H(Y∣X)=∑i=1npiH(Y∣X=xi)
在一组数据中我们知道了经验熵 H ( Y ) H(Y) H(Y)和条件经验熵 H ( Y ∣ X ) H(Y|X) H(Y∣X),两者的差就是我们要知道的信息增益。信息增益表示:知道特征 X X X的信息而使类 Y Y Y的不确定性减少的程度。我们要 g ( D , A ) g(D,A) g(D,A)来表示,D为已知的数据集,A为特征。
为了理解,我们先给出一组数据来计算各个特征的信息增益:
ID | 年龄 | 性别 | 是否玩游戏 |
---|---|---|---|
1 | 少年 | 男 | 是 |
2 | 少年 | 男 | 是 |
3 | 少年 | 女 | 是 |
4 | 少年 | 男 | 否 |
5 | 成年 | 女 | 否 |
6 | 成年 | 女 | 是 |
7 | 成年 | 男 | 是 |
8 | 老年 | 男 | 否 |
9 | 老年 | 男 | 是 |
10 | 老年 | 女 | 否 |
首先计算经验熵: H ( D ) H(D) H(D):
H ( D ) = − 6 10 l o g 2 6 10 − 4 10 l o g 2 4 10 = 0.9710 H(D)=-\frac{6}{10}log_2\frac{6}{10}-\frac{4}{10}log_2\frac{4}{10}=0.9710 H(D)=−106log2106−104log2104=0.9710
基于年龄特征对数据的信息增益为:
g ( D , A 1 ) = H ( D ) − [ 4 10 H ( D 1 ) + 3 10 H ( D 2 ) + 3 10 H ( D 3 ) ] = 0.971 − [ 4 10 ( − 3 4 l o g 2 3 4 − 1 4 l o g 2 1 4 ) + 3 10 ( − 1 3 l o g 2 1 3 − 2 3 l o g 2 2 3 ) + 3 10 ( − 1 3 l o g 2 1 3 − 2 3 l o g 2 2 3 ) ] = 0.0955 g(D,A_1)=H(D)-[\frac{4}{10}H(D_1)+\frac{3}{10}H(D_2)+\frac{3}{10}H(D_3)]\\ \\=0.971-[\frac{4}{10}(-\frac{3}{4}log_2\frac{3}{4}-\frac{1}{4}log_2\frac{1}{4})+\frac{3}{10}(-\frac{1}{3}log_2\frac{1}{3}-\frac{2}{3}log_2\frac{2}{3})+\frac{3}{10}(-\frac{1}{3}log_2\frac{1}{3}-\frac{2}{3}log_2\frac{2}{3})]\\=0.0955 g(D,A1)=H(D)−[104H(D1)+103H(D2)+103H(D3)]=0.971−[104(−43log243−41log241)+103(−31log231−32log232)+103(−31log231−32log232)]=0.0955
基于性别特征对数据的信息增益为:
g ( D , A 1 ) = H ( D ) − [ 6 10 H ( D 1 ) + 4 10 H ( D 2 ) ] = 0.0200 g(D,A1)=H(D)-[\frac{6}{10}H(D_1)+\frac{4}{10}H(D_2)]=0.0200 g(D,A1)=H(D)−[106H(D1)+104H(D2)]=0.0200
2、 I D 3 ID3 ID3算法
I D 3 ID3 ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。具体方法是:从根节点开始,对节点计算所有可能的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子节点;再对子节点递归地调用以上方法,构建决策树;知道所有特征的信息增益均很小或没有特征可以选择为止。简单来说就是计算每一个特征对数据的信息增益,看那个最大就优先放置在上层的节点(根节点是最上层节点)。以上述数据为例,根据计算结果我们可以知道基于年龄特征对数据的信息增益最大,所以在最上层也就是根节点选择年龄特征来判别,而性别特征作为第二层结点。
3、 C 4.5 C4.5 C4.5算法
PS: 信息增益比
I D 3 ID3 ID3算法用信息增益来获取最优特征的方法会存在一个问题,将上述数据稍微改动一下:
ID | 年龄 | 是否玩游戏 |
---|---|---|
1 | 5 | 是 |
2 | 10 | 是 |
3 | 15 | 是 |
4 | 20 | 否 |
5 | 25 | 否 |
6 | 30 | 是 |
7 | 35 | 是 |
8 | 40 | 否 |
9 | 45 | 是 |
10 | 50 | 否 |
先不看性别特征,我们将年龄特征具体为某一数值,当然首先保证这十个数值仍然是离散型变量,根据数据我们很容易可以得出基于年龄对数据的条件经验熵为0(
l
o
g
1
=
0
log1=0
log1=0),那么基于年龄对数据的信息增益就为
H
(
D
)
H(D)
H(D),应该是所有特征对数据信息增益中最大的值了,按照
I
D
3
ID3
ID3算法是不是就应该将年龄这一特征作为最优节点呢?答案是不行。因为你会发现每一个年龄都只对应一个类,如果忽略其他特征你会得到这样一棵树(额,画的不好看,见谅哈!):
我们会发现每一个类别数据都对应到具体的年龄特征值上,当我们尝试做第二层特征判别时,同样也会具体到对应年龄特征值上,这样增加了决策树的复杂度,对未知数据的预测能力也大大降低,显然这不是我们想要的决策树模型。为了解决这一问题,可以使用信息增益比:
g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A)=\frac{g(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A),其中, H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ l o g 2 ∣ D i ∣ ∣ D ∣ H_A(D)=-\sum^n_{i=1}\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|} HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣, n n n是特征 A A A取值的个数。
C 4.5 C4.5 C4.5算法与 I D 3 ID3 ID3算法的基础上使用了信息增益比来作为选择特征的标准。
4、 C A R T CART CART算法
C A R T CART CART算法在原有算法的基础上又做了进一步改进,使决策树不仅可以用于离散数据分类,同样也可以用于连续数据的回归。对回归树,采用平方误差最小化准则,对分类树采用基尼系数 ( G i n i i n d e x ) (Gini\, index) (Giniindex)最小化准则。对于回归树笔者会在后面讲到 G B D T GBDT GBDT算法时详述,在这里我们只讨论分类问题.
G i n i Gini Gini系数:
在分类问题中,假设有K个类,样本点属于第k类的概率为 p k p_k pk,则概率分布的基尼系数定义为:
G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum^K_{k=1}p^2_k Gini(p)=∑k=1Kpk(1−pk)=1−∑k=1Kpk2
对于二分类问题,假设第一个类的概率为 p p p,则概率分布的基尼系数为:
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_{k=1}(\frac{|C_k|}{|D|})^2 Gini(D)=1−∑k=1K(∣D∣∣Ck∣)2
这里, C k C_k Ck是D中属于第 k k k类的样本子集,K是类的个数。
对于给定样本集合D,其基尼系数为:
G i n i ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D)=1-\sum^K_{k=1}(\frac{|C_k|}{|D|})^2 Gini(D)=1−∑k=1K(∣D∣∣Ck∣)2
这里, C k C_k Ck是D中属于第 k k k类的样本子集,K是类的个数。