You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pt5jvslni/Chapter6/决策树算法原理.md

122 lines
6.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 6.2 决策树算法原理
我们已经知道,构造一棵决策树其实就是根据数据的特征(内部节点)对数据一步一步的进行划分,从而达到分类的目的。但是,每一步根据哪个特征来进行划分呢?这个就是构造决策树的关键。其实构造决策树时会遵循一个指标,有的是按照信息增益来构建,如**ID3算法**;有的是信息增益率来构建,如**C4.5算法**;有的是按照基尼系数来构建的,如**CART算法**。但不管是使用哪种构建算法,决策树的构建过程通常都是一个递归选择最优特征,并根据特征对训练集进行分割,使得对各个子数据集有一个最好的分类的过程。这里我们以**ID3算法**为例,详细介绍构建决策树相关知识。
### 信息熵
信息是个很抽象的概念。人们常常说信息很多,或者信息较少,但却很难说清楚信息到底有多少。比如一本五十万字的中文书到底有多少信息量。
直到`1948`年,香农提出了**“信息熵”**的概念,才解决了对信息的量化度量问题。信息熵这个词是香农从热力学中借用过来的。热力学中的热熵是表示分子状态混乱程度的物理量。香农用信息熵的概念来描述信源的不确定度。**信源的不确定性越大,信息熵也越大**。
从机器学习的角度来看,信息熵表示的是信息量的期望值。如果数据集中的数据需要被分成多个类别,则信息量 $$I(x_i)$$的定义如下:
其中$$x_i$$表示多个类别中的第`i`个类别,$$p(x_i)$$表示概率:
$$
I(X_i)=-log_2p(x_i)
$$
由于信息熵是信息量的期望值,所以信息熵$$H(X)$$的定义如下(其中`n`为数据集中类别的数量)
$$
H(X)=-\sum\limits_{i=1}^np(x_i)log_2p(x_i)
$$
从这个公式也可以看出,如果概率是`0`或者是`1`的时候,熵就是`0`。(因为这种情况下随机变量的不确定性是最低的),那如果概率是`0.5`也就是五五开的时候,此时熵达到最大,也就是`1`。(就像扔硬币,你永远都猜不透你下次扔到的是正面还是反面,所以它的不确定性非常高)。所以呢,**熵越大,不确定性就越高**。
### 条件熵
在实际的场景中,我们可能需要研究数据集中某个特征等于某个值时的信息熵等于多少,这个时候就需要用到**条件熵**。条件熵`H(Y|X)`表示特征`X`为某个值的条件下,类别为`Y`的熵。条件熵的计算公式如下:
$$
H(Y|X)=\sum\limits_{i=1}^np_iH(Y|X=x_i)
$$
### 信息增益
现在已经知道了什么是熵,什么是条件熵。接下来就可以看看什么是信息增益了。所谓的信息增益就是表示我已知条件`X`后能得到信息`Y`的不确定性的减少程度。
就好比,我在玩读心术。你心里想一件东西,我来猜。我已开始什么都没问你,我要猜的话,肯定是瞎猜。这个时候我的熵就非常高。然后我接下来我会去试着问你是非题,当我问了是非题之后,我就能减小猜测你心中想到的东西的范围,这样其实就是减小了我的熵。那么我熵的减小程度就是我的信息增益。
所以信息增益如果套上机器学习的话就是,如果把特征`A`对训练集`D`的信息增益记为`g(D, A)`的话,那么`g(D, A)`的计算公式就是:
$$
g(D,A)=H(D)-H(D,A)
$$
为了更好的解释熵,条件熵,信息增益的计算过程,下面通过示例来描述。假设我现在有这一个数据集,第一列是编号,第二列是性别,第三列是活跃度,第四列是客户是否流失的标签(`0:`表示未流失,`1:`表示流失)。
| 编号 | 性别 | 活跃度 | 是否流失 |
| --- | --- | --- | --- |
| 1 | 男 | 高 | 0 |
| 2 | 女 | 中 | 0 |
| 3 | 男 | 低 | 1 |
| 4 | 女 | 高 | 0 |
| 5 | 男 | 高 | 0 |
| 6 | 男 | 中 | 0 |
| 7 | 男 | 中 | 1 |
| 8 | 女 | 中 | 0 |
| 9 | 女 | 低 | 1 |
| 10 | 女 | 中 | 0 |
| 11 | 女 | 高 | 0 |
| 12 | 男 | 低 | 1 |
| 13 | 女 | 低 | 1 |
| 14 | 男 | 高 | 0 |
| 15 | 男 | 高 | 0 |
假如要算性别和活跃度这两个特征的信息增益的话,首先要先算总的熵和条件熵。总的熵其实非常好算,就是把标签作为随机变量`X`。上表中标签只有两种(`0`和`1`)因此随机变量`X`的取值只有`0`或者`1`。所以要计算熵就需要先分别计算标签为`0`的概率和标签为`1`的概率。从表中能看出标签为`0`的数据有`10`条,所以标签为`0`的概率等于`2/3`。标签为`1`的概率为`1/3`。所以熵为:
$$
-\frac{1}{3}*log(\frac{1}{3})-\frac{2}{3}*log(\frac{2}{3}) = 0.9182
$$
接下来就是条件熵的计算,以性别为男的熵为例。表格中性别为男的数据有`8`条,这`8`条数据中有`3`条数据的标签为`1`,有`5`条数据的标签为`0`。所以根据条件熵的计算公式能够得出该条件熵为:
$$
-\frac{3}{8}*log(\frac{3}{8})-\frac{5}{8}*log(\frac{5}{8}) = 0.9543
$$
根据上述的计算方法可知,总熵为:
$$
-\frac{5}{15}*log(\frac{5}{15})-\frac{10}{15}*log(\frac{10}{15}) = 0.9182
$$
性别为男的熵为:
$$
-\frac{3}{8}*log(\frac{3}{8})-\frac{5}{8}*log(\frac{5}{8}) = 0.9543
$$
性别为女的熵为:
$$
-\frac{2}{7}*log(\frac{2}{7})-\frac{5}{7}*log(\frac{5}{7}) = 0.8631
$$
活跃度为低的熵为:
$$
-\frac{4}{4}*log(\frac{4}{4}) = 0
$$
活跃度为中的熵为:
$$
-\frac{1}{5}*log(\frac{1}{5})-\frac{4}{5}*log(\frac{4}{5}) = 0.7219
$$
活跃度为高的熵为:
$$
-0-\frac{6}{6}*log(\frac{6}{6}) = 0
$$
现在有了总的熵和条件熵之后就能算出性别和活跃度这两个特征的信息增益了。
性别的信息增益=总的熵-(8/15)性别为男的熵-(7/15)性别为女的熵=0.0064
活跃度的信息增益=总的熵-(6/15)活跃度为高的熵-(5/15)活跃度为中的熵-(4/15)活跃度为低的熵=0.6776
那信息增益算出来之后有什么意义呢?回到读心术的问题,为了我能更加准确的猜出你心中所想,我肯定是问的问题越好就能猜得越准!换句话来说我肯定是要想出一个信息增益最大(**减少不确定性程度最高**)的问题来问你。其实`ID3`算法也是这么想的。`ID3`算法的思想是从训练集`D`中计算每个特征的信息增益,然后看哪个最大就选哪个作为当前结点。然后继续重复刚刚的步骤来构建决策树。