Python中国社区  »  机器学习算法

一文带你读懂机器学习和数据科学的决策树

数盟 • 1 周前 • 16 次点击  

本文为 AI 研习社编译的技术博客,原标题 :

A Guide to Decision Trees for Machine Learning and Data Science

作者 | George Seif

翻译 | 姚秀清

校对 | 酱番梨        整理 | 菠萝妹

原文链接:

https://towardsdatascience.com/a-guide-to-decision-trees-for-machine-learning-and-data-science-fe2607241956

注:本文的相关链接请点击文末【阅读原文】进行访问


决策树是一类非常强大的机器学习模型,在高度可解释的同时又在许多任务中有非常良好的表现。 决策树在ML模型的特殊之处在于它清晰的信息表示结构。 决策树通过训练学到的“知识”直接形成层次结构。 知识结构以这样的方式保存和显示,即使非专家也可以容易地理解。


  生活中的决策树

你以前可能用过决策树来决定你的生活。 例如,决定本周末你应该做什么活动。 这可能取决于你是否愿意和朋友一起出去或独自度过周末; 在这两种情况下,你的决定还取决于天气。 如果天气晴朗,你可以和朋友一起踢足球。 如果结束下雨了,你会去看电影。 如果你的朋友根本不露面,那么无论天气如何,你会选择玩电子游戏!

这是决策树应用在现实生活中的例子。 我们已经构建了一颗树来模拟一组顺序的,层次化的决策,最终导致一些结果。 请注意,为了保持树的小巧,我们还选择了相当“高级”的决策。 例如,如果我们为天气设置了许多可能的选项,例如25度晴天,25度下雨,26度晴天,26度下雨,27度晴天...... 等等,我们的树会很大! 确切的温度确实有点相关,我们只想知道是否可以外出。

机器学习中决策树的概念是相同的。 我们想要构建一个具有一组层次的决策树,并给出最终结果,比如说分类或回归预测。 将选择决策使得树尽可能小,同时旨在实现高的分类和回归准确性。


  机器学习中的决策树

通过两个步骤来创建决策树模型:归纳和剪枝。 归纳是我们实际构建树的方法,即根据我们的数据设置所有分层决策边界。 由于训练决策树的性质,它们可能容易出现严重的过拟合。 修剪是从决策树中删除不必要的结构,有效地降低了对抗过拟合的复杂性,并使其更容易解释。


引言

从高层次来看,创建决策树需要经过4个主要步骤:

  1. 从训练数据集开始,该数据集应具有一些特征变量,分类或回归输出。

  2. 确定数据集中“最佳特征”以分割数据; 更多关于我们如何定义“最佳功能”的方法

  3. 将数据拆分为包含最佳特征的可能值子集。 这种分割基本上定义了树上的节点,即每个节点是基于我们数据中某个特征的分割点。

  4. 通过使用从步骤3创建的数据子集递归地生成新的树节点。我们保持分割直到达到一个点,在该点我们通过一些方法,优化了最大精度,同时最小化了分裂/节点的数量。

第1步很简单,只需要收集你的数据集!

对于步骤2,通常使用贪婪算法来选择要使用的特征和特定的分割方法,来最小化成本函数。 如果我们思考它一秒钟,那么在构建决策树时的拆分相当于划分特征空间。 我们将迭代地尝试不同的分割点,然后在最后选择成本最低的分割点。 当然,我们可以做一些聪明的事情,比如只在我们的数据集范围内进行拆分。 这将使我们免于浪费计算来测试那些质量比较差的分裂点。

对于回归树,我们可以使用简单的平方差作为我们的成本函数:

Y是我们的基本事实,Y-hat是我们预测的值; 我们对数据集中的所有样本求和以获得总误差。 对于分类,我们使用基尼指数:

其中pk是特定预测节点中分类k的训练实例的比例。 理想情况下,节点的错误值应为零,这意味着每个拆分在100%的时间内输出单个分类。 这正是我们想要的,因为我们知道,一旦我们到达那个特定的决策节点,无论我们是在决策边界的一边还是另一边,我们的输出究竟是什么。

在我们的数据集中具有单个分类的概念被称为信息增益。 看看下面的例子。

如果我们选择一个分区,其中每个输出根据输入数据混合了类别,那么我们实际上根本没有获得任何信息; 我们不知道特定节点即特征是否对我们分类数据有任何影响! 另一方面,如果我们的分割对每个输出类别的百分比都很高,那么我们已经获得了在特定特征变量上以特殊方式分割的信息来给我们一个特定的输出!

现在我们可以继续分割, 分割和分割 ,直到我们的树有数千个分支......但这不是一个好主意! 我们的决策树将是巨大的,缓慢的,并且会过度拟合我们的训练数据集。 因此,我们将设置一些预定义的停止标准来停止树的构造。

最常见的停止方法是对分配给每个叶节点的训练示例的数量使用最小计数。 如果计数小于某个最小值,则不接受拆分,并将该节点作为最终叶节点。 如果我们所有的叶子节点都成为最终节点,则停止训练。 较小的最小计数将为你提供更精细的分割和更多信息,但也容易过拟合你的训练数据。 太小的分钟计数,你可能会停止提前。 因此,最小值通常基于数据集设置,具体取决于每个类中预计有多少个示例。


剪枝

由于训练决策树的性质,它们可能容易出现严重的过拟合。 为每个节点设置最小实例数的正确值可能具有挑战性。 大多数情况下,我们可能只是使最小值非常小,这将导致存在许多分裂和非常大的复杂树。 关键是这些分裂中的大多数将最终变得多余,并且不会提高模型的准确性。

剪枝是一种去除这种分裂冗余的技术,即修剪树中不必要的分裂。 从高级别开始, 剪枝将树的一部分从严格决策边界压缩为更平滑和更通用的树,从而有效地降低树的复杂性。 决策树的复杂性定义为树中的分裂数。

一种简单而高效的修剪方法是遍历树中的每个节点,并评估将其移除到成本函数上的效果。 如果它变化不大,那就修剪掉!


  Scikit Learn实例

很容易在Scikit Learn中使用内置的分类和回归决策树的类! 首先加载数据集并初始化我们的决策树以进行分类。


Scikit Learn还允许我们使用graphviz库可视化我们的树。 它提供了一些选项,有助于可视化决策节点和分割模型来简化学习,这对理解它的工作方式非常有用! 下面我们将根据功能名称为节点着色,并显示每个节点的类和功能信息。

你可以在Scikit Learn中为决策树模型设置几个参数。 以下是一些有趣的尝试以获得更好的结果:

  • max_depth:我们将停止拆分节点的树的最大深度。 这类似于控制深度神经网络中的最大层数。 较低的值会使你的模型更快但不准确; 更高的值可以给你准确性,但风险是过拟合,并且可能会很慢。

  • min_samples_split:拆分节点所需的最小样本数。 我们讨论了决策树的这一方面,以及如何将其设置为更高的值将有助于减轻过拟合。

  • max_features:查找最佳分割点时要考虑的特征数。 更高则意味着可能更好的结果,不过训练则需要更长的时间。

  • min_impurity_split:树木扩张早期停止的阈值。 如果节点的不纯度高于阈值,则节点将分裂。 这可用于权衡对抗过拟合(高值,小树)与高精度(低值,大树)。

  • presort:是否预先分配数据以加快拟合数据中最佳分割的发现。 如果我们事先对每个特征的数据进行排序,我们的训练算法将更容易找到分离的合适值。


  实际应用决策树的技巧

以下是一些决策树的优缺点,它们可以帮助你确定它是否适合你的问题,以及一些如何有效应用它们的提示:

优点:

  • 易于理解和解释。 在每个节点,我们都能够确切地看到我们的模型做出了什么决定。 在实践中,我们将能够完全理解我们的准确度和误差来自何处,模型可以很好地处理哪种类型的数据,以及输出如何受到特征值的影响。 Scikit learn的可视化工具是可视化和理解决策树的绝佳选择。

  • 需要很少的数据准备。 许多ML模型可能需要大量数据预处理,例如标准化,并且可能需要复杂的正则化方法。 另一方面,在调整了一些参数后,决策树可以很好地开箱即用。

  • 使用树进行推理的成本只有用于训练树的数据点的数量的对数。 这是一个巨大的优势,因为它意味着拥有更多数据不一定会对我们的推理速度产生巨大影响。

缺点:

  • 由于训练的性质,过拟合在决策树中很常见。 通常建议执行某种类型的降维,例如PCA,使得树不必在如此多的特征上被拆分

  • 出于与过拟合的情况类似,决策树也容易变得偏向于在数据集中占多数的类别。 不过进行某种类的平衡(例如类权重,采样或专门的损失函数)总是一个好主意。


  推荐阅读

如果您想了解更多关于使用Scikit Learn进行机器学习的知识,建议你使用Hands-On Machine Learning with Scikit-Learn and TensorFlow这本书进行动手学习,尤其是动手编码和练习!


  准备学习?

在Twitter上关注我,我发布所有关于最新和最好的AI,技术和科学的内容!


想要继续查看该篇文章相关链接和参考文献?

长按链接点击打开或点击底部【阅读原文】:

https://ai.yanxishe.com/page/TextTranslation/1323


AI研习社每日更新精彩内容,观看更多精彩内容:

从语言学角度看词嵌入模型

深度网络揭秘之深度网络背后的数学

如何将深度学习应用于无人机图像的目标检测

Python高级技巧:用一行代码减少一半内存占用


等你来译:

社会扩展性:加密货币中的最重要概念?

25个能放到数据湖中的语音研究数据集

让你的电脑拥有“视力”,用卷积神经网络就可以!

让神经网络说“我不知道”——用Pyro/PyTorch实现贝叶斯神经网络

【AI求职百题斩】已经悄咪咪上线啦,还不赶紧来答题?!

点击 阅读原文 查看本文更多内容


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/5X0OZxftKY
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/27557
 
16 次点击  
分享到微博