第14关 手把手教你构建一棵决策树_人工智能课程 - 小象学院

课程目录 小象学院 - 人工智能

关注公众号【Python家庭】领取1024G整套教材交流群学习商务合作。整理分享了数套四位数培训机构的教材,现免费分享交流学习,并提供解答、交流群

你要的白嫖教程,这里可能都有喔~

 

本关内容概述

欢迎来到本关的学习,本关的学习目标是找到一种通用的方法来构建出一棵决策树,准备好了吗?Let's go!

我们先来回顾一下在上一关得到的两个重要结论:

  • 我们做每一步决策时,希望能最大程度地减少不确定性

  • 我们用信息熵来衡量不确定性:信息熵越大,不确定性越高

那么,我们再回头看看上一关提出的这个问题:性别和年龄哪一个特征对于我们的预测更加有效呢

扫描二维码关注公众号,回复: 12908798 查看本文章

信息熵的计算

不同于上一关的观察法,这里我们将用更严谨的数学知识来计算哪个特征更能减少不确定性。

具体要怎么做呢?很简单,用原来的不确定性减去划分后的不确定性!换句话说,就是用原数据集的信息熵减去划分后的所有数据集的信息熵之和。当然了,我们希望这个差值越大越好。因为划分前后的差值越大,就表明划分后减小的不确定性越多,也就是把最终结果的范围缩小的越小。

沿用之前推荐App下载的例子,先计算最开始没有做任何划分之前的信息熵Entropy。

信息熵的表达式:

我们把下载王者荣耀定义为事件1,在总的下载记录中事件1有3条记录,所以事件1出现的概率

我们把下载微信定义为事件2,在总的下载记录中事件2有2条记录,所以事件2出现的概率

我们把下载QQ定义为事件3,在总的下载记录中事件3有1条记录,所以事件3出现的概率

推荐App下载这个例子中可能发生3个事件:下载王者荣耀、下载微信、下载QQ,所以信息熵计算公式中的n=3。

接下来我们要计算按照性别划分后的不确定性,也就是信息熵

我们先看效果图,然后再看后面的计算过程,这样理解起来更加直观一些。

按照性别划分

女性下载App的记录有3条,占总下载记录数的​​

男性下载App的记录也是3条,占总下载记录数的​​

所以按照性别划分之后的信息熵:

说明:

​​:表示女性数据集的信息熵

​​:表示男性数据集的信息熵

这里需要特别注意的是在计算划分后的信息熵时,不是简单的把划分之后的两个信息熵相加,而是计算的加权和权重是划分后的子数据集样本数占原数据集样本数的比例

被划分到女性的数据集的信息熵:

被划分到男性的数据集的信息熵:

最终按照性别划分之后的信息熵

有了划分前和划分后的信息熵之后,我们就可以对它们做差运算,计算出按照性别划分前后信息熵减少了多少

因此,按照性别对数据集进行划分,减少的信息熵等于

按照上面按照性别划分的计算方法,计算按照年龄进行划分的效果,先看效果图,有图有真相,有助于理解。

我们先把之前已经计算过的没有做任何划分之前的信息熵Entropy摆在这,方便后面计算的时候查看。

按照年龄划分

小于20岁的用户下载App的记录有3条,占总下载记录数的

大于等于20岁的用户下载App的记录也是3条,占总下载记录数的​​

所以按照年龄划分之后的信息熵:​​

说明:

:表示小于20岁数据集的信息熵

:表示大于等于20岁数据集的信息熵

小于20岁数据集的信息熵:小于20岁的数据集中所有用户都下载了王者荣耀,所以概率是1,那么,因为

大于等于20岁数据集的信息熵:

最终按照性别划分之后的信息熵

因此,按照年龄对数据集进行划分,减少的信息熵等于$$ = 1.46 - 0.46 = 1 $$。

通过按照性别和年龄划分之后的信息熵减小值可以看出:

按照性别划分,信息熵减小值:0.54

按照年龄划分,信息熵减小值:1

经过对比,按照年龄划分信息熵减小值要大于按照性别划分信息上减小值。

因为我们要最大程度地减少不确定性(减小信息熵),所以按照年龄划分比按照性别划分可以更大程度地减少的不确定性,因此我们优先选择年龄对数据集进行划分。

这和我们上一关用观察法得到的结论是一致的,真是值得庆祝一下!

对了,顺便说一下,由于原来的不确定性减去划分后的不确定性这个差值很常用,因此我们给这个差值起了一个更加专业的名字,叫做信息增益

我们做每一次决策都希望找到能使信息增益最大的特征,是不是瞬间感觉这个表述变得高大上了?

正如我们所愿,我们找到了一种通用的构建决策树的方法

  • 每次从当前数据集的所有特征中选出一个使信息增益最大的特征

  • 利用这个特征将原数据集划分成子数据集

不停地重复上述两个步骤,直至构建出一棵决策树。

恭喜你,本关的内容你已学完了。。。一半。

看上去我们似乎已经掌握了构建一棵决策树的方法,我们详细地介绍了如何寻找信息增益最大的特征,这一步没有任何问题;然后我们利用这个特征划分数据集,这一步有没有不对劲的地方呢?

回想一下,利用性别特征划分数据集时,处理起来很方便,因为性别这个特征是个离散特征,只有男和女两种取值,对每种取值创建一个分支就可以了;但是,利用年龄特征划分数据集时,我们采用了20岁作为一个阈值,那么问题来了,20这个数是从哪来的呢?

这就涉及到了决策树算法中如何处理连续型特征的问题,年龄特征是个连续特征,如何利用连续特征对数据集进行划分呢?

连续特征的处理

这当然难不倒我们。

仍使用推荐App下载的例子,数据集中所有样本的年龄为{15,25,22,28,13,16}。我们的目标是找到一个合适的阈值,将数据集分成两部分,从而将连续的问题转化为离散的问题。

排序

先将所有年龄升序排列得到 {13,15,16,22,25,28}。

遍历

对于这个排好序的结果,一个简单的处理思路就是选取一个合适的步长,遍历13到28之间的所有数值,比如以1为步长,我们需要尝试13,14,15,......,27,28分别作为阈值,分别计算出相应的信息增益,从而选出一个最优的阈值。

再仔细想想,就会发现,其实不需要尝试这么多阈值,比如说,阈值取23和24,用这两个值来划分数据集的效果其实是一模一样的!我们只需要在每两个样本之间任意找一个值进行尝试就可以了,如下图所示:

为了方便起见,我们通常会直接取两个样本的平均值作为阈值,因此,我们只需要遍历14, 15.5, 19, 23.5, 26.5这5个阈值,分别计算相应的信息增益,从中选出最优的那个阈值即可。

小练习

接下来是练习的时间了,请你通过编程计算出这5种情况下(分别以14,15.5,19,23.5,26.5作为阈值)的信息增益,并思考哪种划分是最优的。

AI_14_0_1

import numpy as np

# 原数据集的信息熵≈1.46
entropy = -( 1/2 * np.log2(1/2) + 1/3 * np.log2(1/3) + 1/6 * np.log2(1/6))

# 分别计算出划分后的子数据集的信息熵的加权和
entropy1 = 1/6 * 0 + 5/6 * -(2/5 * np.log2(2/5) + 1/5 * np.log2(1/5) + 2/5 * np.log2(2/5))
entropy2 = 2/6 * 0 + 4/6 * -(1/4 * np.log2(1/4) + 1/4 * np.log2(1/4) + 2/4 * np.log2(2/4) )
entropy3 = 3/6 * 0 + 3/6 * -(1/3 * np.log2(1/3) + 2/3 * np.log2(2/3))
entropy4 = 4/6 * -(3/4 * np.log2(3/4) + 1/4 * np.log2(1/4)) + 2/6 * 0
entropy5 = 5/6 * -(3/5 * np.log2(3/5) + 1/5 * np.log2(1/5) + 1/5 * np.log2(1/5) ) + 1/6 * 0

# 分别计算出每种划分的信息增益
gain1 = entropy - entropy1
gain2 = entropy - entropy2
gain3 = entropy - entropy3
gain4 = entropy - entropy4
gain5 = entropy - entropy5


print("gain1=",gain1)
print("gain2=",gain2)
print("gain3=",gain3)
print("gain4=",gain4)
print("gain5=",gain5)

5种情况下计算出的信息增益分别为0.19,0.46,1,0.92,0.32,可以看出,第3种划分得到的信息增益是最大的,也就是说我们在16到22之间任意找一个数作为阈值,得到的划分是最优的。到此为止,我们就解释清楚了20这个阈值是怎么来的。

本关总结:在本关,我们给出了构建一棵决策树的通用方法,并对其中的两个步骤进行了详细地介绍。如果你能回答出以下两个问题,那说明本关内容你已经完全掌握了:

  • 给定数据集,选择哪个特征进行当前划分?
  • 对于选定的特征,在哪个阈值上进行划分?

今天我们就先学到这里吧,下一关见,拜拜~

联系我们,一起学Python吧

分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。


​关注公众号「Python家庭」领取1024G整套教材、交流群学习、商务合作

猜你喜欢

转载自blog.csdn.net/qq_34409973/article/details/115177460