决策树对鸢尾花数据两特征组合分类python代码的结果_《Scikit-Learn与TensorFlow机器学习实用指南》六章·决策树·学习笔记(一)...

82bf205026e108ff085b285dfc1dd69e.png

一、简介

和支持向量机一样, 决策树是一种多功能机器学习算法, 即可以执行分类任务也可以执行回归任务, 甚至包括多输出(multioutput)任务.

它是一种功能很强大的算法,可以对很复杂的数据集进行拟合。例如,在第二章中我们对加利福尼亚住房数据集使用决策树回归模型进行训练,就很好的拟合了数据集(实际上是过拟合)。

决策树也是随机森林的基本组成部分(见第7章),而随机森林是当今最强大的机器学习算法之一。

在本章中,我们将首先讨论如何使用决策树进行训练,可视化和预测。

然后我们会学习在 Scikit-learn 上面使用 CART 算法,并且探讨如何调整决策树让它可以用于执行回归任务。

最后,我们当然也需要讨论一下决策树目前存在的一些局限性。

二、决策树的训练和可视化

为了理解决策树,我们需要先构建一个决策树并亲身体验它到底如何进行预测。

接下来的代码就是在我们熟知的鸢尾花数据集上进行一个决策树分类器的训练。

from sklearn.datasets import load_iris

from sklearn.tree import DecisionTreeClassifier

iris = load_iris()

X = iris.data[:, 2:] # petal length and width y = iris.target

tree_clf = DecisionTreeClassifier(max_depth=2)

tree_clf.fit(X, y)

你可以通过使用export_graphviz()方法,通过生成一个叫做iris_tree.dot的图形定义文件将一个训练好的决策树模型可视化。

from sklearn.tree import export_graphviz

export_graphviz(

tree_clf,

out_file=image_path("iris_tree.dot"),

feature_names=iris.feature_names[2:],

class_names=iris.target_names,

rounded=True,

filled=True

)

然后,我们可以利用graphviz package [1] 中的dot命令行,将.dot文件转换成 PDF 或 PNG 等多种数据格式。例如,使用命令行将.dot文件转换成.png文件的命令如下:

[1] Graphviz是一款开源图形可视化软件包,http://www.graphviz.org/。

$ dot -Tpng iris_tree.dot -o iris_tree.png

我们的第一个决策树如图 6-1。

af0df3b6a9a46f8d6f4430750966b648.png
图6-1. 鸢尾花决策树

2.1 开始预测

现在让我们来看看在图 6-1 中的树是如何进行预测的。假设你找到了一朵鸢尾花并且想对它进行分类,你从根节点开始(深度为 0,顶部):该节点询问花朵的花瓣长度是否小于 2.45 厘米。如果是,您将向下移动到根的左侧子节点(深度为 1,左侧)。 在这种情况下,它是一片叶子节点(即它没有任何子节点),所以它不会问任何问题:你可以方便地查看该节点的预测类别,决策树预测你的花是 Iris-Setosa(class = setosa)。

现在假设你找到了另一朵花,但这次的花瓣长度是大于 2.45 厘米的。你必须向下移动到根的右侧子节点(深度为 1,右侧),而这个节点不是叶节点,所以它会问另一个问题:花瓣宽度是否小于 1.75 厘米? 如果是,那么你的花很可能是一个 Iris-Versicolor(深度为 2,左)。 如果不是,那很可能一个 Iris-Virginica(深度为 2,右),真的是太简单了,对吧!

决策树的众多特性之一就是, 它不需要太多的数据预处理, 尤其是不需要进行特征的缩放或者归一化。

节点的samples属性统计出它应用于多少个训练样本实例。

例如,我们有一百个训练实例是花瓣长度大于 2.45 里面的(深度为 1, 右侧),在这 100 个样例中又有 54 个花瓣宽度小于 1.75cm(深度为 2,左侧)。

节点的value属性告诉你这个节点对于每一个类别的样例有多少个。

例如:右下角的节点中包含 0 个 Iris-Setosa,1 个 Iris-Versicolor 和 45 个 Iris-Virginica。

最后,节点的Gini属性用于测量它的纯度:如果一个节点包含的所有训练样例全都是同一类别的,我们就说这个节点是纯的(Gini=0)。

例如,深度为 1 的左侧节点只包含 Iris-Setosa 训练实例,它就是一个纯节点,Gini 指数为 0。

公式 6-1 显示了训练算法如何计算第i个节点的 gini 分数 G(i)。例如, 深度为 2 的左侧节点基尼指数为:

5f4aa12282ed9ce7fd1db8741cbe4a13.png

公式6-1. Gini分数

a4bc19142e30887bb30bcab487147879.png

P(i,k)是第i个节点中训练实例为的k类实例的比例

Scikit-Learn 用的是 CART 算法, CART 算法仅产生二叉树:每一个非叶节点总是只有两个子节点(只有是或否两个结果)。然而,像 ID3 这样的算法可以产生超过两个子节点的决策树模型。

图 6-2 显示了决策树的决策边界。粗的垂直线代表根节点(深度为 0)的决策边界:花瓣长度为 2.45 厘米。由于左侧区域是纯的(只有 Iris-Setosa),所以不能再进一步分裂。然而,右边的区域是不纯的,所以深度为 1 的右边节点在花瓣宽度为 1.75 厘米处分裂(用虚线表示)。又由于max_depth设置为 2,决策树在那里停了下来。但是,如果将max_depth设置为 3,两个深度为 2 的节点,每个都将会添加另一个决策边界(用虚线表示)。

58a2724697511dad70c695210c2f598a.png
图6-2. 决策树的决策边界

模型小知识:白盒与黑盒

正如我们看到的一样,决策树非常直观,它的决策很容易解释。这种模型通常被称为白盒模型。相反,随机森林或神经网络通常被认为是黑盒模型。他们能做出很好的预测,并且您可以轻松检查它们做出这些预测过程中计算的执行过程。然而,人们通常很难用简单的术语来解释为什么模型会做出这样的预测。例如,如果一个神经网络说一个特定的人出现在图片上,我们很难知道究竟是什么导致了这一个预测的出现:

模型是否认出了那个人的眼睛? 她的嘴? 她的鼻子?她的鞋?或者是否坐在沙发上? 相反,决策树提供良好的、简单的分类规则,甚至可以根据需要手动操作(例如鸢尾花分类)。

2.2估计分类概率

决策树还可以估计某个实例属于特定类k的概率:首先遍历树来查找此实例的叶节点,然后它返回此节点中类k的训练实例的比例。

例如,假设你发现了一个花瓣长 5 厘米,宽 1.5 厘米的花朵。相应的叶节点是深度为 2 的左节点,因此决策树应该输出以下概率:Iris-Setosa 为 0%(0/54),Iris-Versicolor 为 90.7%(49/54),Iris-Virginica 为 9.3%(5/54)。当然,如果你要求它预测具体的类,它应该输出 Iris-Versicolor(类别 1),因为它具有最高的概率。我们了测试一下:

>>> tree_clf.predict_proba([[5, 1.5]])

array([[ 0. , 0.90740741, 0.09259259]])

>>> tree_clf.predict([[5, 1.5]])

array([1])

完美!请注意,估计概率在任何地方都是相同的, 除了图 6-2 中右下角的矩形部分,例如花瓣长 6 厘米和宽 1.5 厘米(尽管在这种情况下它看起来很可能是 Iris-Virginica)。

2.3 CART 训练算法

Scikit-Learn 用分类回归树(Classification And Regression Tree,简称 CART)算法训练决策树(也叫“增长树”)。这种算法思想真的非常简单:

首先使用单个特征k和阈值t(k)(例如,“花瓣长度≤2.45cm”)将训练集分成两个子集。它如何选择k和t(k)呢?它寻找一对k和t(k),能够产生最纯粹的子集(通过子集大小加权计算)。算法尝试最小化的损失函数,如公式 6-2所示。

5b444573fefb003c6d43db9693440eb7.png
公式6-2. CART进行分类的损失函数

当它成功的将训练集分成两部分之后, 它将会继续使用相同的递归式逻辑继续的分割子集,然后是子集的子集。当达到预定的最大深度之后将会停止分裂(由max_depth超参数决定),或者是它找不到可以继续降低不纯度的分裂方法的时候。几个其他超参数(之后介绍)控制了其他的停止生长条件(min_samples_split,min_samples_leaf,min_weight_fraction_leaf,max_leaf_nodes)。

警告
正如所见,CART 算法是一种贪婪算法:它贪婪地搜索最高级别的最佳分割方式,然后在每个深度重复该过程。 它不检查分割是否能够在几个级别中的全部分割可能中找到最佳方法。贪婪算法通常会产生一个相当好的解决方法,但它不保证这是全局中的最佳解决方案。

不幸的是,找到最优树是一个 NP 完全问题:它需要 O(exp(m)) 时间,即使对于相当小的训练集也会使问题变得棘手。 这就是为什么我们必须设置一个“合理的”(而不是最佳的)解决方案。

2.4 计算复杂度

在建立好决策树模型后, 做出预测需要遍历决策树, 从根节点一直到叶节点。决策树通常近似左右平衡,因此遍历决策树需要经历大致 O(log(2,m)) 个节点。由于每个节点只需要检查一个特征的值,因此总体预测复杂度仅为 O(log(2,m)),与特征的数量无关。 所以即使在处理大型训练集时,预测速度也非常快。

然而,训练算法的时候(训练和预测不同)需要比较所有特征(如果设置了max_features会更少一些)。这就使得训练复杂度为 O(n x mlog(m)) 。对于小训练集(少于几千例),Scikit-Learn 可以通过预先设置数据(presort = True)来加速训练,但是这对于较大训练集来说会显着减慢训练速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值