文章来源:公众号-智能化IT系统。
初识决策树
决策树是一个类似于人们决策过程的树结构,从根节点开始,每个分枝代表一个新的决策事件,会生成两个或多个分枝,每个叶子代表一个最终判定所属的类别。
例如,如下是一个决策树,代表薪水大于30W的男性会买车。
我们可以很容易的写出IF Else来实现决策树的判定。上述的决策树有两个特征区间,性别和年龄,最终的结果有两个类别,买和不买。
决策树流程
我们在实际的大数据分析中,一般对决策树分为四个步骤:
-
生成决策树模型
上例中的图就是一个决策树模型,具体的生成方式后面会详细介绍。
-
产生分类规则
通过决策树模型产生分类的规则,这一步很简单,如果分枝少,直接的IF Else即可,在上例中,就是
if (sex=male)
{
if(money>30W)
{
buy = true;
}
else
{
buy = fales;
}
else
{
buy = false;
}
-
测试决策树模型的准确性
假设我们有1万条数据,可以对前9千条进行决策树模型测试,生成好后,对剩下的1千条数据进行准确性测试,以评估决策树的准确度。
-
对新数据进行预测
这一步没什么说的了,唯一注意的是必须在第三步通过的基础上,决策不是儿戏。
决策树生成
下面我们围绕第一步,说明如何生成决策树。有一个熵的概念,在决策树中需要用到类别熵(H(c))以及特征条件熵(H(c|x)),同时在此基础上计算信息增益(G(x)),以决定决策树的生成。公式如下:
G(x) = H(c) - H(c|x)
概念是虚幻的,下面我们用一个具体的案例来说明,还是前面提到的一个买房的记录:
用户ID | 年龄 | 性别 | 收入 | 婚姻状况 | 是否买房 |
1 | 27 | 男 | 15W | 否 | 否 |
2 | 47 | 女 | 30W | 是 | 是 |
3 | 32 | 男 | 12W | 否 | 否 |
4 | 24 | 男 | 45W | 否 | 是 |
5 | 45 | 男 | 30W | 是 | 否 |
6 | 56 | 男 | 32W | 是 | 是 |
7 | 31 | 男 | 15W | 否 | 否 |
8 | 23 | 女 | 30W | 是 | 否 |
有四个纬度,年龄,性别,收入,婚姻状况,我们先把年龄分为20-30,30-40,40+三个阶段,把收入分为10-20,20-40,40+三个级别。
首先,正对所有数据,一共3人买房,5人没买,条件熵H(c) = - 3/8 * log23/8 - 5/8 * log25/8 = 0.288
我们对这四个纬度逐一计算信息增益。
年龄
我们先按照三个年龄阶段将表划分为如下三张:
用户ID | 年龄 | 性别 | 收入 | 婚姻状况 | 是否买房 |
1 | 27 | 男 | 15W | 否 | 否 |
4 | 24 | 男 | 45W | 否 | 是 |
8 | 23 | 女 | 30W | 是 | 否 |
用户ID | 年龄 | 性别 | 收入 | 婚姻状况 | 是否买房 |
3 | 32 | 男 | 12W | 否 | 否 |
7 | 31 | 男 | 15W | 否 | 否 |
用户ID | 年龄 | 性别 | 收入 | 婚姻状况 | 是否买房 |
2 | 47 | 女 | 30W | 是 | 是 |
5 | 45 | 男 | 30W | 是 | 否 |
6 | 56 | 男 | 32W | 是 | 是 |
首先,针对20-30年龄区间的,特征条件熵计算如下:
H(c|x11) = - 1/3 * log21/3 - 2/3 * log22/3 = 0.278(买房的比例乘以其自身对数,加上不买房的比例乘以自身对数)
针对30-40年龄区间的,特征条件熵计算如下:
H(c|x11) = - 0 * log20 - 1 * log21 = 0
针对40+年龄区间的,特征条件熵计算如下:
H(c|x11) = - 2/3 * log22/3 - 1/3 * log21/3 = 0.278
综合上面,年龄的条件熵计算如下:
H(c|x1) = 3/8 * 0.278 + 2/8 * 0 + 3/8 * 0.278 = 0.209 (每个区间的比例,乘以各区间的条件熵,再取总和)
那么年龄这个纬度的信息增益就是 0.288 - 0.209 = 0.079
性别
分表如下:
用户ID | 年龄 | 性别 | 收入 | 婚姻状况 | 是否买房 |
1 | 27 | 男 | 15W | 否 | 否 |
3 | 32 | 男 | 12W | 否 | 否 |
4 | 24 | 男 | 45W | 否 | 是 |
5 | 45 | 男 | 30W | 是 | 否 |
6 | 56 | 男 | 32W | 是 | 是 |
7 | 31 | 男 | 15W | 否 | 否 |
用户ID | 年龄 | 性别 | 收入 | 婚姻状况 | 是否买房 |
2 | 47 | 女 | 30W | 是 | 是 |
8 | 23 | 女 | 30W | 是 | 否 |
针对男性,特征条件熵:
H(c|x21) = - 2/6 * log22/6 - 4/6 * log24/6 = 0.278
针对女性,特征条件熵:
H(c|x22) = - 1/2 * log21/2 - 1/2 * log21/2 = 0.301
综合上面,性别的条件熵计算如下:
H(c|x2) = 6/8 * 0.278 + 2/8 * 0.301 = 0.284
那么性别这个纬度的信息增益就是 0.288 - 0.284 = 0.004
收入
分表如下:
用户ID | 年龄 | 性别 | 收入 | 婚姻状况 | 是否买房 |
1 | 27 | 男 | 15W | 否 | 否 |
3 | 32 | 男 | 12W | 否 | 否 |
7 | 31 | 男 | 15W | 否 | 否 |
用户ID | 年龄 | 性别 | 收入 | 婚姻状况 | 是否买房 |
2 | 47 | 女 | 30W | 是 | 是 |
5 | 45 | 男 | 30W | 是 | 否 |
6 | 56 | 男 | 32W | 是 | 是 |
8 | 23 | 女 | 30W | 是 | 否 |
用户ID | 年龄 | 性别 | 收入 | 婚姻状况 | 是否买房 |
4 | 24 | 男 | 45W | 否 | 是 |
针对10-20W收入者,特征条件熵:
H(c|x31) = - 0 * log20 - 1 * log21 = 0
针对20-40W收入者,特征条件熵:
H(c|x32) = - 2/4 * log22/4 - 2/4 * log22/4 = 0.301
针对40W+收入者,特征条件熵:
H(c|x33) = 0
综合上面,收入的条件熵计算如下:
H(c|x3) = 3/8 * 0 + 4/8 * 0.301 + 1/8 * 0 = 0.151
那么收入这个纬度的信息增益就是 0.288 - 0.151 = 0.137
婚姻状况
分表如下:
用户ID | 年龄 | 性别 | 收入 | 婚姻状况 | 是否买房 |
1 | 27 | 男 | 15W | 否 | 否 |
3 | 32 | 男 | 12W | 否 | 否 |
4 | 24 | 男 | 45W | 否 | 是 |
7 | 31 | 男 | 15W | 否 | 否 |
用户ID | 年龄 | 性别 | 收入 | 婚姻状况 | 是否买房 |
2 | 47 | 女 | 30W | 是 | 是 |
5 | 45 | 男 | 30W | 是 | 否 |
6 | 56 | 男 | 32W | 是 | 是 |
8 | 23 | 女 | 30W | 是 | 否 |
针对未婚者,特征条件熵:
H(c|x41) = - 3/4 * log23/4 - 1/4 * log21/4 = 0.245
针对已婚者,特征条件熵:
H(c|x31) = - 2/4 * log22/4 - 2/4 * log22/4 = 0.301
综合上面,婚姻状态的条件熵计算如下:
H(c|x3) = 4/8 * 0.245+ 4/8 * 0.301 + 1/8 * 0 = 0.274
那么婚姻状态这个纬度的信息增益就是 0.288 - 0.274 = 0.014
OK,我们现在总结下所有四个纬度的信息增益,如下
年龄:0.079
性别:0.004
收入:0.137
婚姻状况:0.014
可以看到,收入这个纬度的信息增益最大,所以我们就按照收入,做为根节点,分枝如下:
收入就是决策树的根节点,可以看到,分枝后,收入在40W+的可以得到结论,是买房,叶子也一并生成;收入在10-20W的也可以得到结论,不买房,叶子也一并生成。对于中间的20到40W的数据,我们将进一步进行决策树的完善,用同样的方式,针对剩余的三个纬度进行计算,此处省略。
这就是决策树的生成,后面针对实际工作中的数据,可能需要有剪枝的操作,针对无意义的枝节。剪枝有预剪枝和后剪枝的方式,目的是精简决策树,减少不必要的匹配计算。
公众号-智能化IT系统。每周都有技术文章推送,包括原创技术干货,以及技术工作的心得分享。扫描下方关注。