机器学习之决策树

1. 引入

顾名思义, 决策树是由一个个“决策”所组成的树, 放“决策依据”的是非叶结点, 放“决策结果”的是叶结点. 决策树是一种简单高效并且具有强解释性的模型, 它也是我们人类在面临决策问题时一种很自然的处理机制.

比如, 一位母亲要给她的女儿介绍男朋友, 可能就有这样一段对话:

女儿: 多大年纪了?

母亲: 26.

女儿: 长得如何?

母亲: 挺帅一小伙.

女儿: 收入高不?

母亲: 不算很高, 中等水平.

女儿: 是公务员不?

母亲: 是, 在税务局上班.

女儿: 那好, 我去看看.

整段对话看来, 其实就是一个决策问题的处理过程. 决策结果也很简单, “见”或者“不见”. 女儿经过一系列的问询, 最终作出的结果是“见”. 这在计算机中,我们可以把它看作是许多个"if-then"操作. 若满足条件(condition), 就执行操作.

决策树可以看作是一个装着“if-then"规则的集合, 由决策树的根节点到叶结点的每一条路径, 构建一条规则: 路径上内部结点的特征对应着规则的条件, 叶结点对应规则的结论. 决策树的“if-then”规则集合有一个重要性质: 互斥并且完备. 也就是说, 每个实例都被一条规则(路径)所覆盖, 并且只被这一条规则覆盖.

决策树学习的本质, 是从训练数据集中归纳出一组“if-then”的分类规则. 与训练集不相矛盾的决策树, 可能有很多个, 也可能一个也没有, 所以我们需要选择一个与训练数据集矛盾较小的决策树; 另一方面, 我们可以把决策树看成一个条件概率模型, 我们的目标是将实例分配到条件概率更大的那一类中去. 

其基本流程遵循简单且直观的“分而治之”(divide-and-conquer)策略, 如下所示:

输入: 训练集\(\mathbf{D} = \{(x_1, y_1), (x_2, y_2),\dots,(x_n, y_n)\};\)

         属性集\(\mathbf{A} = \{a_1, a_2,\dots,a_m\}.\)

过程: 函数 \(\rm TreeGenerate(\mathbf{D}, \mathbf{A})\)
1: 生成结点 \(\rm node\).
2: \(\rm if\) \(\mathbf{D}\)中样本全属于同一类别\(\mathbf{C}\)  \(\rm then\)
3:     将\(\rm node\)标记为\(\mathbf{C}\)类叶结点;  \(\rm return\)

4: \(\rm end\) \( \rm if\)

5: \(\rm if\) \(\mathbf{A} = \emptyset \) \(\rm or\) \(\mathbf{D}\)中样本在\(\mathbf{A}\)上取值相同  \(\rm then\)

6:     将\(\rm node\)标记为叶结点, 其类别标记为\(\mathbf{D}\)中样本数最多的类;  \(\rm return\)

7: \(\rm end\) \( \rm if\)

8: 从\(\mathbf{A}\)中选择最优划分属性\(a_*\);

9: \(\rm for\) \(a_*\)的每一个值\(a_*^{v}\)  \(\rm do\)

10:      为\(\rm node\) 生成一个分支; 令\(\mathbf{D}_v\)表示在\(\mathbf{D}\)中在\(a_*\)上取值为\(a_*^{v}\)的样本子集;

11:      \(\rm if\) \(\mathbf{D}_v\)为空  \(\rm then \)

12:          将分支结点标记为叶结点, 其类别标记为\(\mathbf{D}\)中样本最多的类;  \(\rm return\)

13:     \(\rm else\)

14:         以\(\rm TreeGenerate(\mathbf{D}_v, \mathbf{A} \backslash \{a_*\})\)为分支结点

15:     \(\rm end\) \( \rm if\)

16:  \(\rm end\) \( \rm for\)

输出: 以\(\rm node\)为根节点的一颗决策树

2. ID3算法

信息熵(information entropy): 信息量大小的度量, 即表示随机变量不确定性的度量, 是度量样本集合纯度最常用的一种指标. 假定当前样本集合\(\mathbf{D}\)中第\(i\)类样本所占比例为\(p_i\)(\(i=1, 2,\dots, m)\), 则\(\mathbf{D}\)的信息熵定义为:

$$Ent(\mathbf{D})= - \sum_{i=1}^m p_i \log_2 p_i$$

\(Ent(\mathbf{D})\)的值越小, 则\(\mathbf{D}\)的纯度越高.

假定离散属性\(a\)有\(V\)个可能的取值\(\{a^1, a^2,\dots, a^V\}\), 若使用\(a\)来对样本集\(\mathbf{D}\)进行划分, 则会产生\(V\)个分支结点, 其中第\(v\)个分支结点包含了\(\mathbf{D}\)中所有在属性\(a\)上取值为\(a^v\)的样本, 记为\(\mathbf{D}^v\). 我们可根据上面的式子计算出\(\mathbf{D}^v\)的信息熵, 再考虑到不同的分支结点所包含的样本数不同, 给分支结点赋予权重\(|\mathbf{D}^v| / |\mathbf{D}\) , 即样本数越多的分支结点的影响越大, 于是看计算出用属性\(a\)对样本集\(\mathbf{D}\)进行划分所获得的“信息增益”(information gain):

$$Gain(\mathbf{D}, a) = Ent(\mathbf{D}) - \sum_{v=1}^V \frac {|\mathbf{D}^v|}{|\mathbf{D}|} Ent(\mathbf{D}^v)$$

ID3算法就是选择的\( \arg \max Gain(\mathbf{D}, a)\)来进行属性的划分.

下面举一个例子:

DayOutlookTemperatureHumidityWindPlay
1SunnyHotHighWeakNo
2SunnyHotHighStrongNo
3OvercastHotHighWeakYes
4RainMildHighWeakYes
5RainCoolNormalWeakYes
6RainCoolNormalStrongNo
7OvercastCoolNormalStrongYes
8SunnyMildHighWeakNo
9SunnyCoolNormalWeakYes
10RainMildNormalWeakYes
11SunnyMildNormalStrongYes
12OvercastMildHighStrongYes
13OvercastHotNormalWeakYes
14RainMildHighStrongNo

4个条件属性: Outlook, Temperature, Humidity, Wind.

1个决策属性: Play(y or n).

那么我们首先可计算出根结点的信息熵:

\(Ent(\mathbf{D})=-\sum_{i=1}^2 p_i \log_2 p_i = -(\frac {5}{14}\log_2\frac {5}{14}+\frac {9}{14}\log_2\frac {9}{14})=0.9401\)

然后, 我们要计算出当前属性集合{Outlook, Temperature, Humidity, Wind}中每个属性的信息增益.以“Outlook”为例, 它有3个可能的取值: {Sunny, Overcast, Rain}. 若使用该属性对\(\mathbf{D}\)进行划分, 则可得到3个子集: \(\mathbf{D}^1\) (Outlook = Sunny), \(\mathbf{D}^2\) (Outlook = Overcast), \(\mathbf{D}^3\) (Outlook = Rain). 所占比例:Sunny  \(=\frac{5}{14}=0.357\), Overcast  \(=\frac{4}{14}=0.286\), Rain \(=\frac{5}{14} = 0.357\).

分别计算出它们的信息熵:

\(Ent(\mathbf{D}^1)= -(\frac {2}{5}\log_2\frac {2}{5}+\frac {3}{5}\log_2\frac {3}{5})=0.971\)

\(Ent(\mathbf{D}^2)= 0\)

\(Ent(\mathbf{D}^3)= -(\frac {3}{5}\log_2\frac {3}{5}+\frac {2}{5}\log_2\frac {2}{5})=0.971\)

于是我们可以算出属性“Outlook”的信息增益:

\(Gain(\mathbf{D},Outlook) = Ent(\mathbf{D}) - \sum_{v=1}^3\frac {|\mathbf{D}^v|}{|\mathbf{D}|} Ent(\mathbf{D}^v) \)

                                   \(=0.9401- (0.357*0.971 + 0.286*0 +0.357*0.971 )\)

                                   \(= 0.247\) 

同理, 我们可以计算出其他属性的信息增益:

\(Gain(\mathbf{D},Temperature) = 0.029\) ; \(Gain(\mathbf{D},Humidity) = 0.152\);

\(Gain(\mathbf{D},Wind) = 0.048.\)

显然,“Outlook”的信息增益最大, 于是它被选为划分属性. 如下图:

 很显然还可以继续划分.以图中第一个分支结点(Outlook = Sunny)为例, 可用属性集合为{Temperature, Humidity, Wind}. 

基于\(\mathbf{D}^1\)计算出各属性的信息增益:

\(Gain(\mathbf{D}^1, Temperature) = 0.571\) ; \(Gain(\mathbf{D}^1, Humidity) = 0.971\);

\(Gain(\mathbf{D}^1, Wind) = 0.020\);

所以我们选择“Humidity”作为划分属性.

 类似的, 对剩下的分支节点进行上述操作, 得到最终的决策树. 


《机器学习》周志华

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值