开发者自述:我是如何理解决策树的

前言

最近学习了一段时间的决策树算法,但是感觉并没有达到自己预期的想法,所以这几天参考了一些决策树方面的资料,来将自己的学习的过程的笔记记录在这里,来加深理解和请教别人指出错误。

决策树的原理

决策树又叫做 decision tree,这个是一种比较简单但是又得到广泛应用的分类器的一种形式。我们一般都是通过训练的数据来搭建起决策树的模型。通过这个模型,我们可以高效的对于未知的数据进行归纳分类,类似于我们的聚类算法。

应用决策树有如下几个优点:

1:决策树的模型的可读性比较好,具有很强的可以描述性,有利于以后高效率的人工分析 2:效率高,决策树只需要以此构建,就可以达到反复使用的效果,每一次的预测的最大计算次数只要不超过决策树的深度即可。 3:决策树来如何预测:

现在我们以 Data Analysis 中的经典案例来进行分析:

从上边的表述中的相关信息,我们可以通过记录以前的用户的一些相关的特性,比如记录这个用户是否可以偿还债务,是否拥有房产,是否结过婚,年收入等,来构建我们所需要的决策树。

上表根据历史数据,记录已有的用户是否可以偿还债务,以及相关的信息。通过该数据,构建的决策树如下:

现在假设新来了一个用户:没有房产,单身狗,年收入 5 万,那么根据上面的决策树,可以预测他无法偿还债务(蓝色虚线路径)。从上面的决策树,还可以知道看出来是否拥有房产可以很大的决定用户是否可以偿还债务,对借贷业务具有指导意义。

基本步骤

现在我们开始学习如何构造决策树

决策树构建的基本步骤如下:

1. 开始,把所有记录看作一个节点 2. 遍历每个变量的每一种分割方式,找到最好的分割点 3. 分割成两个节点 N1 和 N2 4. 对 N1 和 N2 分别继续执行 2-3 步,直到每个节点足够 “纯” 为止

决策树的变量可以有两种:

1)数字型(Numeric):变量类型是整数或浮点数,如前面例子中的 “年收入”。用 “>=”,“>”,“<” 或 “<=” 作为分割条件(排序后,利用已有的分割情况,可以优化分割算法的时间复杂度)。

2)名称型(Nominal):类似编程语言中的枚举类型,变量只能重有限的选项中选取,比如前面例子中的 “婚姻情况”,只能是 “单身”,“已婚” 或 “离婚”。使用 “=” 来分割。

如何评估分割点的好坏?如果一个分割点可以将当前的所有节点分为两类,使得每一类都很 “纯”,也就是同一类的记录较多,那么就是一个好分割点。比如上面的例子,“拥有房产”,可以将记录分成了两类,“是” 的节点全部都可以偿还债务,非常 “纯”;“否” 的节点,可以偿还贷款和无法偿还贷款的人都有,不是很 “纯”,但是两个节点加起来的纯度之和与原始节点的纯度之差最大,所以按照这种方法分割。构建决策树采用贪心算法,只考虑当前纯度差最大的情况作为分割点。

量化纯度

前面讲到,决策树是根据 “纯度” 来构建的,如何量化纯度呢?这里介绍三种纯度计算方法。如果记录被分为 n 类,每一类的比例 P(i)= 第 i 类的数目 / 总数目。还是拿上面的例子,10 个数据中可以偿还债务的记录比例为 P(1) = 7/10 = 0.7,无法偿还的为 P(2) = 3/10 = 0.3,N = 2。

Gini 不纯度

熵(Entropy)

错误率

上面的三个公式均是值越大,表示越 “不纯”,越小表示越 “纯”。三种公式只需要取一种即可,实践证明三种公司的选择对最终分类准确率的影响并不大,一般使用熵公式。

纯度差,也称为信息增益(Information Gain),公式如下:

其中,I 代表不纯度(也就是上面三个公式的任意一种),K 代表分割的节点数,一般 K = 2。vj 表示子节点中的记录数目。上面公式实际上就是当前节点的不纯度减去子节点不纯度的加权平均数,权重由子节点记录数与当前节点记录数的比例决定。

停止条件

决策树的构建过程是一个递归的过程,所以需要确定停止条件,否则过程将不会结束。一种最直观的方式是当每个子节点只有一种类型的记录时停止,但是这样往往会使得树的节点过多,导致过拟合问题(Overfitting)。另一种可行的方法是当前节点中的记录数低于一个最小的阀值,那么就停止分割,将 max(P(i)) 对应的分类作为当前叶节点的分类。

过渡拟合

采用上面算法生成的决策树在事件中往往会导致过滤拟合。也就是该决策树对训练数据可以得到很低的错误率,但是运用到测试数据上却得到非常高的错误率。过渡拟合的原因有以下几点:

1. 噪音数据:训练数据中存在噪音数据,决策树的某些节点有噪音数据作为分割标准,导致决策树无法代表真实数据。

2. 缺少代表性数据:训练数据没有包含所有具有代表性的数据,导致某一类数据无法很好的匹配,这一点可以通过观察混淆矩阵(Confusion Matrix)分析得出。

3. 多重比较:举个列子,股票分析师预测股票涨或跌。假设分析师都是靠随机猜测,也就是他们正确的概率是 0.5。每一个人预测 10 次,那么预测正确的次数在 8 次或 8 次以上的概率为

只有 5% 左右,比较低。但是如果 50 个分析师,每个人预测 10 次,选择至少一个人得到 8 次或以上的人作为代表,那么概率为:

概率十分大,随着分析师人数的增加,概率无限接近 1。但是,选出来的分析师其实是打酱油的,他对未来的预测不能做任何保证。上面这个例子就是多重比较。这一情况和决策树选取分割点类似,需要在每个变量的每一个值中选取一个作为分割的代表,所以选出一个噪音分割标准的概率是很大的。

优化方案

1:修剪枝叶

决策树过渡拟合往往是因为太过 “茂盛”,也就是节点过多,所以需要裁剪(Prune Tree)枝叶。裁剪枝叶的策略对决策树正确率的影响很大。主要有两种裁剪策略。

前置裁剪在构建决策树的过程时,提前停止。那么,会将切分节点的条件设置的很苛刻,导致决策树很短小。结果就是决策树无法达到最优。实践证明这中策略无法得到较好的结果。

后置裁剪决策树构建好后,然后才开始裁剪。采用两种方法:1)用单一叶节点代替整个子树,叶节点的分类采用子树中最主要的分类;2)将一个字数完全替代另外一颗子树。后置裁剪有个问题就是计算效率,有些节点计算后就被裁剪了,导致有点浪费。

2:K-Fold Cross Validation

首先计算出整体的决策树 T,叶节点个数记作 N,设 i 属于 [1,N]。对每个 i,使用 K-Fold Validataion 方法计算决策树,并裁剪到 i 个节点,计算错误率,最后求出平均错误率。这样可以用具有最小错误率对应的 i 作为最终决策树的大小,对原始决策树进行裁剪,得到最优决策树。

3:Random Forest

Random Forest 是用训练数据随机的计算出许多决策树,形成了一个森林。然后用这个森林对未知数据进行预测,选取投票最多的分类。实践证明,此算法的错误率得到了经一步的降低。这种方法背后的原理可以用 “三个臭皮匠定一个诸葛亮” 这句谚语来概括。一颗树预测正确的概率可能不高,但是集体预测正确的概率却很高。

准确率估计

决策树 T 构建好后,需要估计预测准确率。直观说明,比如 N 条测试数据,X 预测正确的记录数,那么可以估计 acc = X/N 为 T 的准确率。但是,这样不是很科学。因为我们是通过样本估计的准确率,很有可能存在偏差。所以,比较科学的方法是估计一个准确率的区间,这里就要用到统计学中的置信区间。

设 T 的准确率 p 是一个客观存在的值,X 的概率分布为 X ~ B(N,p),即 X 遵循概率为 p,次数为 N 的二项分布(Binomial Distribution),期望 E(X) = N*p,方差 Var(X) = N*p*(1-p)。由于当 N 很大时,二项分布可以近似有正太分布(Normal Distribution)计算,一般 N 会很大,所以 X ~ N(np,n*p*(1-p))。可以算出,acc = X/N 的期望 E(acc) = E(X/N) = E(X)/N = p,方差 Var(acc) =Var(X/N) = Var(X) / N2= p*(1-p) / N,所以 acc ~ N(p,p*(1-p)/N)。这样,就可以通过正太分布的置信区间的计算方式计算执行区间了。

正太分布的置信区间求解如下:

1)将 acc 标准化,即

2)选择置信水平α= 95%,或其他值,这取决于你需要对这个区间有多自信。一般来说,α越大,区间越大。

3)求出α/2 和 1-α/2 对应的标准正太分布的统计量

(均为常量)。然后解下面关于 p 的不等式。acc 可以有样本估计得出。即可以得到关于 p 的执行区间

部分资料参考自网络,感谢广大的互联网!

原文发布于微信公众号 - AI研习社(okweiwu)

原文发表时间:2017-06-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨熹的专栏

自己写个 Prisma

Sirajology的视频链接 前一段时间特别火的 Prisma 大家都玩了么,看了这篇文章后,你也可以自己写一个 Prisma 迷你版了。 ? 这个 idea...

41050
来自专栏机器学习之旅

总结:常见算法工程师面试题目整理(一)

最近抽风,出去面试了不少公司,和不少算法工程师招聘的朋友有所交流,整理了相关比较有意思的题目,供大家参考:

14840
来自专栏机器学习算法工程师

【TPAMI重磅综述】 SIFT与CNN的碰撞:万字长文回顾图像检索任务十年探索历程(下篇)

本文是《SIFT Meets CNN: A Decade Survey of Instance Retrieval》的下篇。在上 篇中概述了图像检索任务极其发...

18830
来自专栏AI研习社

使用深度学习来理解道路场景

语义分割是深度学习的方法之一,通过语义分割,我们可以对图片中的每一个像素赋予含义,即将像素划分到一个预先设定的类中。从上边的 GIF 图可以看出,我们在语义切分...

13320
来自专栏云时之间

关于决策树的一些学习

最近学习了一段时间的决策树算法,但是感觉并没有达到自己预期的想法,所以这几天参考了一些决策树方面的资料,来将自己的学习的过程的笔记记录在这里,来加深理解和请教别...

384150
来自专栏新智元

100页的机器学习入门书:只要有基础数学知识就能看懂!(免费下载)

书名The Hundred-Page Machine Learning Book,作者Andriy Burkov是Gartner的机器学习团队leader,人工...

36720
来自专栏小詹同学

深度学习神经网络第①篇——感知器及其Python实现

感知器是由美国计算机科学家罗森布拉特(F.Roseblatt)于1957年提出的。感知器可谓是最早的人工神经网络。单层感知器是一个具有一层神经元、采用阈值激活函...

17140
来自专栏用户3246163的专栏

4.4 Bond Risk 债券风险

Interest rate factor 是影响利率曲线上各个独立利率的random variables

42230
来自专栏量子位

怎样构建深度学习模型?六步走,时刻小心过拟合 | 入门指南

12720
来自专栏数据科学与人工智能

【算法】从头开始编写任何机器学习算法的6个步骤:感知器案例研究

有些算法比其他算法更复杂,所以从一些简单的算法开始,从一些非常简单的算法开始,比如单层感知器。

15530

扫码关注云+社区

领取腾讯云代金券