首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

机器学习,决策树学习概述与实现

基于树的学习算法在数据科学竞赛中相当常见。这些算法给预测模型赋予了准确性、稳定性以及易解释性。其中,决策树算法也是引人关注的「随机森林」算法的基础构造模块。本文介绍了决策树的概念和简单实现,使用生动的示例帮助理解,希望能够对你有所帮助。

从 Kaggle 到课堂,机器学习第一课就是决策树。之所以关注决策树,是因为与其他 ML 方法相比,决策树的数学复杂度不高,同时能为分类问题提供足够的精度。

对于 ML 的入门者来说,决策树很容易上手。本教程将介绍:

决策树是什么

如何构建决策树

使用 Python 构建决策树

决策树是什么

我们跳过正式定义,从概念上了解一下决策树。试想你坐在办公室里,感觉自己饿了,想出去吃点东西,但是午餐要下午 1 点才开始。那么你怎么办呢?当然,你会看一下时间,然后决定能否出去。你可以按照以下逻辑进行思考:

我们刚刚搭了一个决策树!这是一个简单的版本,但我们可以通过加入天气、成本等因素构建一个更为复杂的决策树。如果你想和你的朋友 Jon Snow 去一家中餐馆吃午饭,决策逻辑可以这样表示:

这也是一个决策树。从顶部开始,循着描述当前状况的路线一路向下,直到做出决定。

注意事项

每个节点测试我们的世界(数据集)中的某个属性,从节点引出的每个分支对应于该属性的值。给定一棵决策树,决策过程如下:

从根节点开始

观察根节点属性的值

按照与观察值对应的路径往下走

重复以上步骤,直至到达叶节点,这样就能做出决策

如何构建决策树?

构建决策树不需要从头开始(除非你是一个像我一样的学生)。尽管如此,这也是一个很好的学习经验,你将学到一些有趣的概念。

构建决策树最常用的算法是 ID3,该算法非常简单。以下是算法伪代码:

你将注意到这样一个细节:在循环开始之后,算法必须选择一个属性,为样本分类选出最佳方案。那么算法会怎么做呢?为了理解这一点,我们必须深入了解一些数学知识。别担心,不会太难。

信息增益和熵

信息增益是选择最佳属性常用且容易上手的方法之一。它使用另一种叫做熵的属性计算出来。

熵是物理学和数学中的概念,指系统的随机性或混乱度。在信息论中,它指的是一组样本的混乱度。

我们通过一个例子来说明:你有两个装满巧克力的袋子。巧克力有红的也有蓝的。你想通过计算巧克力的数量来测量袋子的熵。所以你坐下来开始数。2 分钟后,你发现第一袋有 50 块巧克力。其中 25 块是红色的,25 块是蓝色的。第二袋也有 50 块巧克力,都是蓝色的。

在这种情况下,第一个袋子的熵是 1,因为里面的巧克力呈均匀分布。第二个袋子的熵为零,因为里面的巧克力没有随机性。

我们用下面这个公式计算一个系统的熵:

在这个公式中,c 代表类别或属性的总数,p_i 代表属于第 i 类的样本数量。是不是有点懵?我们通过例子了解一下:

让我们回到刚刚的巧克力袋子。我们有两个类别:红色(R)和蓝色(B)。第一个袋子里有 25 块红色巧克力。巧克力总数是 50。因此,p_i=25/50。蓝色类别也是这样处理。把这些值代入熵方程,我们得到以下结果:

解方程,结果如下:

如果想验证结果或尝试其他例子,请移步 Wolfram Alpha:http://www.wolframalpha.com/input/?i=-(25%2F50)log2(25%2F50)+-+(25%2F50)log2(25%2F50)。

继续计算第二个袋子的熵,里面有 50 块红色巧克力,0 块蓝色巧克力。得到的熵是 0。

如果你理解这个概念,太好了!我们现在转到信息增益。

信息增益

信息增益是由基于给定属性的样本分割导致的熵下降。从数学角度上看,信息增益的定义为:

S 代表整个样本集,A 代表我们想要分割的属性。|S| 代表样本数量,|Sv| 表示属性 A 当前值的样本数量。

仍然很复杂,是不是?那我们举个例子,看看它的工作流程。

构建决策树

首先,给巧克力的例子添加一些细节。我们已经知道袋 1 中有 25 块红色巧克力、25 块蓝色巧克力。现在,我们还要考虑巧克力的品牌。红色巧克力中,有 15 块是士力架,10 块是 Kit Kat 牌。蓝色巧克力中,20 块是 Kit Kat 牌,5 块是士力架。假设我们只想吃红色的士力架。那么这里,红色士力架(15)是正例,其他的巧克力(如红色 Kit Kat 和蓝色士力架)都是负例。

现在,与我们的类别(吃/不吃)相关的数据集的熵是:

现在我们来回顾一下,我们有 50 块巧克力。如果只看属性「颜色」,则我们有 25 个红色的、25 个蓝色的。如果看属性「品牌」,则我们有 20 块士力架、30 块 Kit Kat 巧克力。

为了构建决策树,我们需要选择其中一个属性作为根节点。我们想要选择具备最高信息增益的属性。现在我们来计算这些属性的信息增益。

颜色相关的信息增益是:

我们刚才计算了与类别相关的巧克力的熵,是 0.8812。如果我们想吃 15 块士力架而不是 10 块 Kit Kat,则红色巧克力的熵是:

如果我们不想吃蓝色巧克力,则熵为 0。

我们的信息增益计算就变成了:

如果我们分割颜色,则信息增益是 0.3958。

现在我们来看下品牌。如果我们想吃 15 块士力架(共有 20 块),不想吃 Kit Kat。则士力架的熵是:

如果我们不吃 Kit Kat,则熵为 0。信息增益为:

品牌分割的信息增益是 0.5567。

由于品牌的信息增益较大,我们将基于品牌进行分割。下一级,我们只要左边的颜色。我们可以轻松地根据颜色进行分割,无需进行任何计算。决策树如下:

谁能想到吃块巧克力这么难呢?

现在你应该了解决策树的运行原理了。

使用 Python 3 实现决策树

现在我们继续为巧克力数据集构建决策树。

代码和数据地址:https://github.com/ishansharma/decision_trees_tutorial/

创建新文件夹。

从 GitHub 下载 data.csv(https://github.com/ishansharma/decision_trees_tutorial/blob/master/data.csv)。

你可能需要安装 Scipy、Scikit-Learn 和 Pandas,如果没有安装的话。我推荐使用虚拟环境,参见:http://docs.python-guide.org/en/latest/dev/virtualenvs/。从终端运行以下命令行,安装 Pandas 和 Scikit-Learn:

4. 安装后,创建新文件 decision_tree.py,并将以下两行添加进去:

5. 使用 Pandas 加载数据:

6. Pandas 可以处理大型数据集,且具备大量可视化功能。它在使用 Python 的大数据流程中广泛使用,因此使用 Pandas 是个好主意。在 Pandas 中你可以使用 head() 方法快速查看加载数据:

下图显示了数据的前 5 行。

7. 我使用 Class 列来确定我们是否想吃巧克力。1 代表吃,0 代表不吃。

8. 接下来,我们需要对数据执行一些预处理。Scikit-Learn 默认不支持文本标签,因此我们使用 Pandas 将文本标签转换成数字。只需要添加以下两行:

9. 刚才我们改变了 Color 属性,用 0 代表红色,1 代表蓝色。类似地,在 Brand 列中,我们用 0 替代士力架,用 1 替换 Kit Kat。

10. 如果你使用 head() 查看数据集,你将看到品牌和颜色的值已经变成了整数:

11. 最后,按惯例用 X 表示训练属性,Y 表示输出类别,因此我们执行以下命令:

12. 差不多完成了。我们现在已经准备好训练决策树了。添加以下两行在我们的数据上训练决策树:

13. 完成了吗?我们对决策树进行快速可视化。添加下列行,并运行程序:

14. 输出如下:

16. 这颗树有点难懂,因为有很多额外信息,不过你可以看到它先基于列 1(Brand)进行分割,再基于列 2(Color)进行分割。

一旦构建处这颗树,那么未来的预测就很简单了。我们来看一下我们是否想吃蓝色的 Kit Kat 巧克力。

将以下行添加至 decision_tree.py 文件的末尾:

输出为 [0],意味着分类是不吃。如果你尝试红色士力架(print(dTree.predict([[0, 0]]))),则输出是 [1]。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180521B1CL0L00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券