Supervised Learning-------Decision Trees
Decision Trees
Introduction
决策树是机器学习中的分类器,允许我们根据以前的数据进行预测。 它们就像是一系列连续的“if ... then”语句,您可以将新数据输入到结果中。
为了演示决策树,让我们看一个例子。 想象一下,我们想要预测迈克是否会在任何一天去购物。 我们可以看一下导致迈克前往商店的先前因素:
在这里,我们可以看到迈克的杂货供应量,天气以及迈克是否每天工作。 绿色的行是他去商店的日子,红色的日子是他没有的。 决策树的目标是尝试理解迈克为什么去商店,并在以后将其应用于新数据。
让我们将第一个属性划分为一个树。 迈克可以提供低,中或大量的供应:
在这里,我们可以看到迈克如果供应量很大,就不会去商店。 这被称为纯子集,仅具有正例或仅作为负例子的子集。 使用决策树,不需要进一步打破纯子集。
让我们打破中等供应量类别,看看Mike是否在那天工作:
在这里我们可以看到我们有两个更纯的子集,所以这个树是完整的。 我们可以用它们各自的答案替换任何纯子集 - 在这种情况下,是或否。
最后,让我们按照Weather属性拆分Low Supplies类别:
现在我们拥有了所有纯子集,我们可以创建最终的决策树:
Motivation
可以轻松创建,可视化和解释决策树。 因此,它们通常是用于建模数据集的第一种方法。 决策树的层次结构和分类性质使其实现非常直观。 决策树基于您拥有的数据点的数量以对数方式展开,这意味着较大的数据集将比其他分类器更少地影响树创建过程。 由于树结构,对数据点的分类也是以对数方式执行的。
Classification and Regression Trees
决策树算法也称为CART,或分类和回归树。 分类树(如上所示)用于从一组可能的值中获取结果。 回归树是一个决策树,其结果是连续值,例如汽车的价格。
Splitting (Induction)
决策树是通过分割称为归纳的过程创建的,但我们如何知道何时分裂? 我们需要一个递归算法来确定要拆分的最佳属性。 一种这样的算法是贪心算法:
1、从根开始,我们为每个属性创建一个拆分。
2、对于每个创建的拆分,计算拆分的成本。
3、选择成本最低的拆分。
4、递归到子树并继续步骤1。
重复此过程,直到所有节点具有与目标结果相同的值,或者拆分不向预测添加任何值。 该算法将根节点作为最佳分类器。
Cost of Splitting
拆分的成本由成本函数决定。 使用成本函数的目的是以可计算的方式分割数据并提供最多的信息增益。
对于那些提供答案而不是值的分类树,我们可以使用Gini杂质计算信息增益:
为了计算信息增益,我们首先计算根节点的Gini杂质。 我们来看看前面使用的数据:
我们的根节点是目标变量,迈克是否会去购物。 要计算其Gini杂质,我们需要找到每个结果的平方概率之和,并从一个结果中减去这个结果:
如果我们拆分第一个属性,供应,让我们计算基尼信息增益。 我们有三个不同的类别,我们可以分为 - 低,中,高。 对于其中的每一个,我们计算其基尼杂质:
如您所见,高耗材的杂质为0.这意味着如果我们拆分耗材并接收高输入,我们立即知道结果会是什么。 为了确定此分裂的基尼信息增益,我们计算根的杂质减去每个儿童杂质的加权平均值:
我们为每个可能的拆分继续这种模式,然后选择能够为我们提供最高信息增益值的拆分。 最大化信息增益使我们得到最极化的分裂,降低了新输入被错误分类的可能性。
Pruning
通过足够大的数据集创建的决策树可能最终导致过多的分裂,每个分裂的有用性降低。 一个非常详细的决策树甚至可能导致过度拟合,在前一个模块中讨论过。 因此,修剪决策树的不太重要的分裂是有益的。 修剪包括计算每个结束子树(叶子节点及其父节点)的信息增益,然后删除信息增益最小的子树:
如您所见,子树被更突出的结果取代,成为新的叶子。 可以重复此过程,直到达到所需的复杂程度,树高或信息增益量。 在构建树时可以跟踪和存储信息增益,以便在修剪时节省时间。 每个模型都应该使用自己的修剪算法来满足其需求。
Conclusion
决策树允许您快速有效地对数据进行分类。 因为他们将数据塑造成决策的层次结构,即使是非专家也很容易理解。 决策树是通过两步过程创建和完善的 - 归纳和修剪。 归纳涉及选择最佳属性以进行拆分,而修剪有助于过滤掉被认为无用的结果。 由于决策树的创建和理解非常简单,因此它们通常是用于建模和预测数据集结果的第一种方法。
Code Example
提供的代码decisiontrees.py采用本文档中讨论的示例,并从中创建决策树。 首先,定义每个类的每个可能选项。 稍后将使用它来拟合和显示我们的决策树:
接下来,我们创建了一个上面显示的数据集矩阵,并定义了每一行的结果:
遗憾的是,sklearn机器学习包无法根据分类数据创建决策树。 正在进行的工作允许这样做,但是现在我们需要另一种方法来用库来表示决策树中的数据。 一个天真的方法是枚举每个类别 - 例如,将晴天/下雨/阴天转换为0,1和2等值。虽然这样做有一些不幸的副作用,例如值可比(阳光充足) <下雨)和连续。 为了解决这个问题,我们对数据进行“热编码”:
一种热编码允许我们将分类数据转换为ML算法可识别的值,期望连续数据。 它的工作原理是将一个类分成每个选项,并用一个表示该选项是否存在。
既然我们有适合sklearn决策树模型的数据,我们只需将分类器拟合到数据中:
其余代码涉及创建一些随机预测输入以显示如何使用树。 我们以与上面数据相同的格式创建一组随机数据,然后将其传递给DecisionTreeClassifier的预测方法。 这为我们提供了一系列预测的目标变量 - 在这种情况下,对于迈克是否会去购物,是或否答案: