1. 什么是决策树?
决策树是一种用于解决分类问题的算法。决策树是由一个个“决策”组成的树,其中非叶节点放的是“决策依据”,叶节点放的是“决策结果”。
- 圆圈:内部节点(非叶节点)
- 方框:叶子节点
2. 决策树怎么用来解决分类问题
首先,我们以区分男女学生为例。这里有一些数据,且带有一些属性以及其正确标签。
学号 | 长头发 | 喉结 | 性别 |
---|---|---|---|
1 | 是 | 无 | 女 |
2 | 是 | 有 | 男 |
3 | 否 | 无 | 女 |
4 | 是 | 无 | 女 |
5 | 否 | 有 | 男 |
… | … | … | … |
对于以上这个比较简单的数据,很清楚的可以看出我们在区分性别的时候起作用的属性是头发的长短以及有无喉结。这里先画一下这棵决策树,如下图:
上面这些数据,喉结和头发就是我们所说的样本的特征,性别就是标签,即类别。这里我们假设有很多个这种数据,先用这些数据进行训练,然后我们可以得到这样的一棵决策树。那怎么用它来对新的样本进行分类呢?
当一个新的样本来临时,假设新样本为(无喉结,短头发),那么根据这棵决策树,我们将会预测这是一个男生。即下图中红色箭头就是预测的过程!
3. 如何构造一棵决策树
数据准备
这里是一组关于用户婚姻状况、是否有房、年收入以及是否会拖欠贷款的数据。为了便于后续的计算,这里我以10个数据为例。
ID | 有房者 | 婚姻状况 | 年收入 | 拖欠贷款 |
---|---|---|---|---|
1 | 是 | 单身 | 125k | 否 |
2 | 否 | 已婚 | 100k | 否 |
3 | 否 | 单身 | 70k | 否 |
4 | 是 | 已婚 | 120k | 否 |
5 | 否 | 离异 | 95k | 是 |
6 | 否 | 已婚 | 60k | 否 |
7 | 是 | 离异 | 220k | 否 |
8 | 否 | 单身 | 85k | 是 |
9 | 否 | 已婚 | 75k | 否 |
10 | 否 | 单身 | 90k | 是 |
构造节点
在构造这棵决策树之前,我门需要知道如何通过属性构造节点。因为有的属性分支为2,有的属性分支有多个,还有的属性是数值型的。这个例子中的有房者就是一个二元属性,分支结果为是和否;婚姻状况是一个多元属性:单身、已婚、离异;年收入是一个序数属性,是数值型的。下面以此例对这三种形式的属性节点构造做个总结和示例:
-
二元属性
-
多元属性
-
序数属性
属性选择
在构造决策树时,我们要通过选择某个属性来构造节点,比如说最开始我们会选择一个属性作为根节点,根节点分支后又会选择属性作为内部节点,那么选择哪个属性构造出来的决策树更好呢?这肯定不是随便选择的,对于属性的选择有相应的度量指标。
- 信息熵(entropy):熵是描述信息的不确定度的,是随机变量不确定度的度量。熵越大,信息的不确定度越大,信息越“混乱”,越不符合决策树分类的需求。
Ent(D) = - ∑ k = 1 n \sum_{k=1}^n ∑k=1n p k p_k pk l o g 2 log_2 log2 p k p_k pk
D:样本集合; p k p_k pk:第k类样本所占的比例(k=1,2,3…n)
- GINI公式:
Gini(D) = 1- ∑ k = 1 n \sum_{k=1}^n ∑k=1n p k 2 p_k^2 pk2
D:样本集合; p k p_k pk:第k类样本所占的比例(k=1,2,3…n)
下面可以任选以上一个公式对属性进行选择。此处我选择GINI计算,简单举例说明一下这个公式。
在数据足够多的情况下,可以绘制出如下曲线(这里将信息熵的曲线也绘制出来,与GINI绘制出的曲线十分相似):
也就是说,我们计算出的GINI系数越小表示这个属性对分类越好(为0时是最好的状态),就选择这个属性作为分类标准。
4. 构造一棵决策树
前面讲了构造一棵决策树需要了解和注意的一些问题,终于写完了。现在可以开始进入正题构建一棵决策树了!
这里的数据还是上面准备的那个数据
ID | 有房者 | 婚姻状况 | 年收入 | 拖欠贷款 |
---|---|---|---|---|
1 | 是 | 单身 | 125k | 否 |
2 | 否 | 已婚 | 100k | 否 |
3 | 否 | 单身 | 70k | 否 |
4 | 是 | 已婚 | 120k | 否 |
5 | 否 | 离异 | 95k | 是 |
6 | 否 | 已婚 | 60k | 否 |
7 | 是 | 离异 | 220k | 否 |
8 | 否 | 单身 | 85k | 是 |
9 | 否 | 已婚 | 75k | 否 |
10 | 否 | 单身 | 90k | 是 |
这里对这些数据做一个说明,有房、婚姻、年收入是我们常说的样本的特征(属性),拖欠贷款有两种分类:是、否,是否拖欠贷款就是我们所说的标签(类别)。这里我们需要利用这些数据构造出一棵决策树用来对新的样本进行预测。也就是说,先通过这些数据构造出一棵决策树,对于一个新的样本比如该样本为(有房,单身,90k),然后就可以根据这些样本特征通过之前构造的决策树来预测这个人是否会拖欠贷款,即我们对这个人分类了,结果会将他归属到拖欠贷款这一类或者不拖欠贷款这一类!
下面开始构建决策树:
- 选择一个属性作为根节点(注:我这里用GINI系数的方式来选择)
这里需要计算所有属性的加权平均GINI
以上,最小的GINI加权是婚姻状况,所以选择婚姻状况作为根节点。
- 继续根据GINI计算结果选择属性
上一步我们已经确定了婚姻左边分支会得到叶节点了,即婚姻状况为已婚的我们会预测为不会拖欠贷款;接着我们要对右边的这6条数据进行计算,算有房者和年收入的GINI系数,算出来小的那一个作为节点。(此处需要注意的是我们计算是在这6条数据中进行计算),这里还是把计算过程列在下边:
更小的GINI加权是有房者,所以这一步我们继续选择的属性是有房者。
再往后就是对年收入分支补充了,下面直接给出最终的决策树的图了!
- 最终的决策树
5. 用决策树来预测
前边在对数据进行说明的时候,举了一个例子,来了一个新的样本(有房,单身,90k),然后现在我们用刚刚创建对决策树来预测他会不会拖欠贷款。
红色箭头表示了我们在决策树中对他进行预测的过程,最后可以看到这个人不会拖欠贷款,也就是说我们把他分到了不拖欠贷款的这一类。
以上就是对决策树的理解以及自己手动构造决策树的一个过程,后面会尝试用代码来实现这个过程。