决策树是一类非常强大的机器学习模型,在高度可解释的同时又在许多任务中有非常良好的表现。 决策树在ML模型的特殊之处在于它清晰的信息表示结构。 决策树通过训练学到的“知识”直接形成层次结构。 知识结构以这样的方式保存和显示,即使非专家也可以容易地理解。 生活中的决策树你以前可能用过决策树来决定你的生活。 例如,决定本周末你应该做什么活动。 这可能取决于你是否愿意和朋友一起出去或独自度过周末; 在这两种情况下,你的决定还取决于天气。 如果天气晴朗,你可以和朋友一起踢足球。 如果结束下雨了,你会去看电影。 如果你的朋友根本不露面,那么无论天气如何,你会选择玩电子游戏! 这是决策树应用在现实生活中的例子。 我们已经构建了一颗树来模拟一组顺序的,层次化的决策,最终导致一些结果。 请注意,为了保持树的小巧,我们还选择了相当“高级”的决策。 例如,如果我们为天气设置了许多可能的选项,例如25度晴天,25度下雨,26度晴天,26度下雨,27度晴天...... 等等,我们的树会很大! 确切的温度确实有点相关,我们只想知道是否可以外出。 机器学习中决策树的概念是相同的。 我们想要构建一个具有一组层次的决策树,并给出最终结果,比如说分类或回归预测。 将选择决策使得树尽可能小,同时旨在实现高的分类和回归准确性。 机器学习中的决策树通过两个步骤来创建决策树模型:归纳和剪枝。 归纳是我们实际构建树的方法,即根据我们的数据设置所有分层决策边界。 由于训练决策树的性质,它们可能容易出现严重的过拟合。 修剪是从决策树中删除不必要的结构,有效地降低了对抗过拟合的复杂性,并使其更容易解释。 引言 从高层次来看,创建决策树需要经过4个主要步骤:
第1步很简单,只需要收集你的数据集! 对于步骤2,通常使用贪婪算法来选择要使用的特征和特定的分割方法,来最小化成本函数。 如果我们思考它一秒钟,那么在构建决策树时的拆分相当于划分特征空间。 我们将迭代地尝试不同的分割点,然后在最后选择成本最低的分割点。 当然,我们可以做一些聪明的事情,比如只在我们的数据集范围内进行拆分。 这将使我们免于浪费计算来测试那些质量比较差的分裂点。 对于回归树,我们可以使用简单的平方差作为我们的成本函数: Y是我们的基本事实,Y-hat是我们预测的值; 我们对数据集中的所有样本求和以获得总误差。 对于分类,我们使用基尼指数: 其中pk是特定预测节点中分类k的训练实例的比例。 理想情况下,节点的错误值应为零,这意味着每个拆分在100%的时间内输出单个分类。 这正是我们想要的,因为我们知道,一旦我们到达那个特定的决策节点,无论我们是在决策边界的一边还是另一边,我们的输出究竟是什么。 在我们的数据集中具有单个分类的概念被称为信息增益。 看看下面的例子。 如果我们选择一个分区,其中每个输出根据输入数据混合了类别,那么我们实际上根本没有获得任何信息; 我们不知道特定节点即特征是否对我们分类数据有任何影响! 另一方面,如果我们的分割对每个输出类别的百分比都很高,那么我们已经获得了在特定特征变量上以特殊方式分割的信息来给我们一个特定的输出! 现在我们可以继续分割, 分割和分割 ,直到我们的树有数千个分支......但这不是一个好主意! 我们的决策树将是巨大的,缓慢的,并且会过度拟合我们的训练数据集。 因此,我们将设置一些预定义的停止标准来停止树的构造。 最常见的停止方法是对分配给每个叶节点的训练示例的数量使用最小计数。 如果计数小于某个最小值,则不接受拆分,并将该节点作为最终叶节点。 如果我们所有的叶子节点都成为最终节点,则停止训练。 较小的最小计数将为你提供更精细的分割和更多信息,但也容易过拟合你的训练数据。 太小的分钟计数,你可能会停止提前。 因此,最小值通常基于数据集设置,具体取决于每个类中预计有多少个示例。 剪枝 由于训练决策树的性质,它们可能容易出现严重的过拟合。 为每个节点设置最小实例数的正确值可能具有挑战性。 大多数情况下,我们可能只是使最小值非常小,这将导致存在许多分裂和非常大的复杂树。 关键是这些分裂中的大多数将最终变得多余,并且不会提高模型的准确性。 剪枝是一种去除这种分裂冗余的技术,即修剪树中不必要的分裂。 从高级别开始, 剪枝将树的一部分从严格决策边界压缩为更平滑和更通用的树,从而有效地降低树的复杂性。 决策树的复杂性定义为树中的分裂数。 一种简单而高效的修剪方法是遍历树中的每个节点,并评估将其移除到成本函数上的效果。 如果它变化不大,那就修剪掉! Scikit Learn实例很容易在Scikit Learn中使用内置的分类和回归决策树的类! 首先加载数据集并初始化我们的决策树以进行分类。 Scikit Learn还允许我们使用graphviz库可视化我们的树。 它提供了一些选项,有助于可视化决策节点和分割模型来简化学习,这对理解它的工作方式非常有用! 下面我们将根据功能名称为节点着色,并显示每个节点的类和功能信息。 你可以在Scikit Learn中为决策树模型设置几个参数。 以下是一些有趣的尝试以获得更好的结果:
以下是一些决策树的优缺点,它们可以帮助你确定它是否适合你的问题,以及一些如何有效应用它们的提示: 优点:
缺点:
|
|