学习机器学习中的决策树

115 阅读8分钟

决策树

机器学习中第一个基于树的算法的直觉和实现

Article

简介

正如我们所知,监督式机器学习在数据集上附加了标签,并将回归和分类问题作为其子集。决策树是一种特殊的算法,可以用于回归(预测一个数字)和分类任务

用于回归任务的决策树被称为连续变量决策树,用于分类的决策树被称为分类变量决策树。决策树的名字来自于这样一个事实,即它有一个树状结构,从根节点开始,进一步分裂成分支,这使我们能够直观地看到模型如何做出决策以及它的决策过程。下面几节详细描述了该算法的工作原理

决策树的结构

我们事先提到,决策树有一个树状结构,由许多部分组成。从上图来看,决策树最顶端的部分是根节点,它由 整个人口组成,并被进一步分割成更小的分支。根节点的分裂产生了两个子分支,称为 决策节点和叶节点。决策节点是树做出决定的地方,由许多子分支组成,而叶子节点包含决策节点做出的决定的输出不包含任何进一步的分支

决策树可以有尽可能多的分支,基于决策所要达到的背景。决策树如何工作的一个非常简单的解释是,它提出一个简单的问题,根据答案,它分裂成更小的树来寻找答案的解决方案。

有一些与决策树相关的术语,其中一些我们之前已经提到过了。

  • 根节点:决策树的起点,由整个人口组成
  • 决策节点:当节点可以进一步分割成更小的节点或子节点时
  • 叶子节点:决策的最终输出,并且节点不能进一步拆分
  • 分割:当决策节点可以根据给定条件进一步分割成更小的节点时
  • 修剪:删除子节点的过程,这与拆分正好相反
  • 父结点/子结点:最上面的节点(根节点)是父节点,其他任何节点都是子节点,因为它来自根节点。

决策树的步骤

前面提到,决策树可用于分类和回归任务,但它主要用于分类任务,所以文章的其余部分将集中讨论分类。在进行分类时,预测一个特定数据集的类别,决策树算法从根节点开始进行。以下是决策树在做决策时经历的步骤。

  • 决策从根节点开始,根节点包含整个群体
  • 使用一种叫做 "属性选择 "的技术来确定群体(数据集)中的最佳属性。
  • 然后,根节点被分割成包含数据集中的最佳属性的子节点。
  • 生成包含最佳属性的决策树节点。
  • 通过使用数据集中的子节点生成新的决策树,迭代地重复这个过程,直到达到一个停止标准,即不能再对称为叶子节点的节点进行分割。

考虑到上图,让我们假设我们想根据水果的特征来确定可用的水果类型。使用决策树来解决这个问题,我们从根节点开始,也就是水果的颜色。
根据条件,根节点被进一步分割成下一个决策节点,在这种情况下,红色或绿色,所以如果颜色是红色,那么它就是一个叶子节点,表示决策的输出(苹果)。如果是绿色,那么决策节点就会根据条件进一步拆分。如果水果的大小是大的,那么就是苹果,如果是小的,那么就是青柠。所以苹果和青柠是叶子节点,是输出,它们不能进一步拆分。

属性选择措施

我相信到目前为止,这一切都很好,除了我们不知道该算法如何选择最佳属性的事实。这时,前面提到的属性选择度量(ASM)就会出现,它可以让我们选择数据集中每个特征的最佳属性。对于决策树,有两种流行的技术,它们是:

  • 信息增益
  • 基尼指数

信息增益

这个信息增益是指在目标变量中获得的关于一个类别的信息量。使用获得的信息量,节点被分割并用于建立决策树。决策树总是试图将这个信息增益属性最大化,拥有最高信息增益的节点首先被拆分,换句话说,在达成决策时为我们提供最有用信息的节点首先被拆分。在我们继续前进之前,让我们来谈谈熵。

熵是对数据集中的无序性、不纯性或不确定性的一种衡量。熵可以在数学上表示为。

其中p(i)是数据集中某类(i)的概率。假设在一个数据集中有100个反应,其中有两个类别,是或不是,p(i)可以是其中之一,如果有60个数据点属于是,那么p(yes)是6/10,p(no)是4/10。

因此,信息增益也可以在数学上表示为 。

吉尼指数

基尼指数是 衡量从整个数据集中随机选择的数据点被错误地识别的频率。与高基尼指数相比,低的基尼指数总是被优先考虑。基尼指数创建了二元分割,不能用于创建2个以上的分割。吉尼指数在数学上可以表示为。

其中p(i)是某一节点上属于某一特定类别的数据点的比例。

决策树的实现

我们使用python程序软件来实现一个特定数据集的简单决策树。我们使用的是非常流行的鸢尾花数据集,该数据集由若干具有某些特征的鸢尾花组成,如萼片长度和花瓣宽度,我们要根据这些特征来预测鸢尾花的类型。python的一个优点是,有几个库可以帮助我们轻松完成机器学习任务。因此,我们导入必要的库

from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

我们导入决策树算法来建立和训练模型,导入matplotlib来帮助我们用几行代码可视化我们的数据,导入plot tree来绘制决策树的过程,导入train test split来把我们的数据分成训练和测试,这样我们就用其中的一部分来训练,其余的用来评估我们的模型有多好,最后导入准确率得分来计算模型到底有多好。

X = data.drop(columns=['Species'])
y = data['Species']
X_train, X_test, y_train, y_test= train_test_split(X, y, test_size= 0.2, random_state=0)  

我们首先将我们的数据分为X和Y,X包含所有的特征,除了目标标签是物种,而Y只包含目标标签。

然后我们将数据分成80%用于训练,20%用于测试,并将其分为四组,即输入训练数据(X_train)、输入测试数据(X_test)、输出训练数据(y_train)和输出测试数据(y_test)。

Dt_gini = DecisionTreeClassifier(criterion='gini')
Dt_entropy = DecisionTreeClassifier(criterion='entropy')

然后我们实例化我们的决策树模型,并将其存储在Dt的别名中,Dt_gini是使用基尼指数的模型,Dt_entropy是使用熵的模型。我们将在以后对这两者进行比较。

Dt_entropy.fit(X_train,y_train)
Dt_gini.fit(X_train,y_train)

然后,我们通过将X与y进行拟合来训练我们的基尼和熵模型。

pred_gini = Dt_gini.predict(X_test)
pred_entropy = Dt_entropy.predict(X_test)

训练结束后,我们需要测试,看看我们的模型有多好,所以我们调用predict函数,并将两个模型的pred_gini和pred_entropy存储起来。

accuracy_score(y_test,pred_gini)
accuracy_score(y_test,pred_entropy)

然后,我们通过调用准确度分数函数来检查我们的准确度,计算我们的模型在预测鸢尾花的种类方面有多准确。两个模型都给出了96.7%的准确率,这意味着两个模型都能很好地预测,最终意味着在使用鸢尾花的特征如花瓣的长度和宽度时,使用基尼指数和熵的决策树算法可以以96.7%的准确率对物种进行分类。

plt.figure(figsize=(9,9))
plot_tree(Dt_gini,
          filled = True,max_depth=3,
          rounded=True,
        );

plt.figure(figsize=(9,9))
plot_tree(Dt_entropy,
          filled = True,max_depth=3,
          rounded=True,
        );

现在,我们必须可视化我们的决策树是如何对虹膜数据集做出决定的。我们除了用matplotlib来构建外,还用绘图树来得到树。

两个模型的决策树,有3个决策(来自max_depth=3)。根节点包含了样本的总数,数值是指3个类中每个类的样本数。
因此,我们可以清楚地看到决策树是如何使用基尼系数和熵进行分割的。最后,在最后一个节点上,数值表示决策树分配的类别,基尼系数和熵都输出了相同的类别,所以看一下,对于绿色方框,它表示输出的是第二类,紫色方框表示决定是第三类。

结论

我们详细研究了决策树,它们的结构,直观的描述,以及如何使用python实现它们。决策树是强大的分类算法,因为它们既能提供出色的准确性,又能解释它们如何得出决策。然而,决策树可以包含多个分割点,这使得它很复杂,而且它有一个主要的责任,即过拟合