数据科学决策树

sklearn文档 — 1.10. 决策树

2017-05-19  本文已影响1300人  HabileBadger
原文章为scikit-learn中"用户指南"-->"监督学习的第十节:Decision Trees"######

决策树(Decision Trees ,DTs)是一组用于分类回归的无参监督学习。它们的目标是创建一个模型,然后这个模型通过从数据特征学习出一套简单的决策规则后,来预测出目标值。

以下方的实例为例子,决策树从数据特征中近似地获得一条由一组** 如果...就...否则... **这样的决策规则组成的正弦曲线。随着树的深度增加,其决策规则和拟合模型就会变得越来越复杂。

决策树的优点有:

然后其缺点也有:

1.10.1. 分类#

DecisionTreeClassifier 是一个有能力从数据集产生多元分类的分类器。跟其他分类器一样,DecisionTreeClassifier需要两个输入数组:携带训练数据的稀疏或密集的数组** X ,尺寸为[样本数量, 特征数量],和一个为X提供类标签的整数数组 Y **,尺寸为[样本数量]。

>>> from sklearn import tree
>>> X = [[0, 0], [1, 1]]
>>> Y = [0, 1]
>>> clf = tree.DecisionTreeClassifier()
>>> clf = clf.fit(X, Y)

模型在拟合过后,这个模型就能够用来预测样本的类:

>>> clf.predict([[2., 2.]])
array([1])

另一种预测方法能够输出每个类的对应概率,其中这个概率指的是在同一个叶子节点中,训练样本对应各类的分数:

>>> clf.predict_proba([[2., 2.]])
array([[ 0., 1.]])

DecisionTreeClassifier是一个有能力处理二元分类(也就是只有[-1, 1]的标签)和多元分类(标签的范围是[0, ..., K-1])的一个分类器。

在使用Sklearn的鸢尾花数据库上,我们可以使用下列步骤来构造出一个树:

>>> from sklearn.datasets import load_iris
>>> from sklearn import tree
>>> iris = load_iris()
>>> clf = tree.DecisionTreeClassifier()
>>> clf = clf.fit(iris.data, iris.target)

在这个模型经过训练之后,我们可以使用 export_graphviz 导出函数来将其导出成 Graphviz 格式的文件。

然后下面代码展示了如何在经过鸢尾花数据库上的树的导出:

>>> with open("iris.dot", 'w') as f:
... f = tree.export_graphviz(clf, out_file=f)

然后我们可以使用 Graphviz 的 dot 工具来创建一个PDF文件(或者是其他支持的文件格式): dot -Tpdf iris.dot -o iris.pdf。

>>> import os
>>> os.unlink('iris.dot')

另一种方法是,如果我们已经安装了 pydotplus这个Python模块,我们可以在Python中直接生成PDF文件(或者是其他受支持的文件格式):

>>> import pydotplus 
>>> dot_data = tree.export_graphviz(clf, out_file=None) 
>>> graph = pydotplus.graph_from_dot_data(dot_data) 
>>> graph.write_pdf("iris.pdf") 

export_graphviz导出器也支持一些"艺术性"的功能,包括为他们的分类添加颜色(或者是回归中的值)或者是突出想要显示变量 与 类名。IPython notebooks 同样能够使用 Image() 方法来渲染并在行内显示。

>>> from IPython.display import Image 
>>> dot_data = tree.export_graphviz(clf, out_file=None,  feature_names=iris.feature_names,  class_names=iris.target_names,  filled=True, rounded=True,  special_characters=True) 
>>> graph = pydotplus.graph_from_dot_data(dot_data) 
>>> Image(graph.create_png()) 

示例
在鸢尾花数据集上描绘出树的决策边界

1.10.2. 回归


决策树同样能够用来处理回归问题,使用DecisionTreeRegressor这个类.
跟分类中的设置一样,这个类的拟合函数也需要两个数组(** X y ),只不过这里的 y **是浮点数数组而不是整数数组:
>>> from sklearn import tree
>>> X = [[0, 0], [2, 2]]
>>> y = [0.5, 2.5]
>>> clf = tree.DecisionTreeRegressor()
>>> clf = clf.fit(X, y)
>>> clf.predict([[1, 1]])
array([ 0.5])

示例
决策树回归

1.10.3. 多输出值问题
一个多输出值问题是一种会在预测结果中,产出多个输出值的监督学习问题,其中他的** y 与之前的格式有所不同,变成一种尺寸为[样本数量, 输出值的数量]的二维数组。
当输出值之间没有什么关联时,简单的方法就是建立
n 个独立的模型来进行预测,即使用这些模型去预测出 n 个输出值。但是,因为这些输出值都是拥有同一个输入,所以你很难去说这些值之间是没有任何关联的,因此另一种更好的方式是去建立一个有能力同时预测出 n 个输出值的模型。
这个方法有两个优点,第一个是它只需要很少的训练时间(相比之前的
n **个模型来说),因为它只有一个估计器。然后,生成结果的泛化精度也会有所增加。
对普通的决策树来说,使用一种策略就能够容易地让它支持多输出值的问题。
只需要进行下列的改变就可以了:

DecisionTreeClassifierDecisionTreeRegressor这两个模块都内置提供了使用这种策略来处理多输出值问题。如果一个决策树在拟合一个尺寸为[样本数量, 输出值的数量]的输出数组** Y ** ,那么估计结果将会是:

在回归中使用多输出树的例子,可以从这篇 多输出树回归 获得参考。在这篇例子,** X 是一个单精度的实数值然后 Y 则是 X **的正弦值或余弦值。

在分类中使用多输出树的例子,可以从这篇 使用多值输出估计器的脸部补全 获得参考。在这篇例子里,X是上半脸的像素点,而Y则是对应脸部的下半脸。

例子

引用

1.10.4. 复杂度#

一般来说,构造一个二叉树的时间复杂度是** O(样本数量 * 特征数量 * log(样本数量)) ,然后它的查询时间是 O(log(样本数量)) 。尽管这个树的构造算法是尽量往平衡树的方向来生成的,但是在事实上一般是做不到平衡的。所以这里假设这棵树的子树已经能够近似的看成是一颗平衡树了,然后每个节点的开销则通过 O(特征数量) 搜索的组合来找出一个能够极大的降低熵的特征。因此每个节点的开销为 O(特征数量 · 样本数量 · log(样本数量)) ,然后可以导出一整棵树的开销(通过合计每个节点的开销)为 O(特征数量 · 样本数量^2 · log(样本数量)) **

Scikit-learn实现了一个更有效的来构造决策树的方法。一个原始的实现方式(也就是上面提到的那样)会为每一个新的分割点,来沿着其特征以重新计算类标签的直方图(处理分类问题)或均值(处理回归问题)。对所有的相关样本的特征进行预分类和在训练时固定类标签的数量会把决策树的每个节点的复杂度降低为** O(特征数量 · log(样本数量)) ,然后整个树的开销则变成了 O(特征数量 · 样本数量 · log(样本数量)) **。在基于树的算法里都有开启这个方法的选项。在默认情况下是设置为梯度增强,因为这样会加速训练过程,不过把它关闭或者设置成其他算法则会降低训练的速度,因为树的训练深度增加了。

1.10.5. 实用技巧#

1.10.6. 树的各种算法:ID3,C4.5,C5.0 和 CART#

决策树究竟有哪些算法?他们之间又有什么不一样?而SKlearn又实现了哪些算法呢?
ID3(Iterative Dichotomiser 3,迭代二叉树 第3代)为罗斯·昆兰在1986年所开发的。这个算法创建了一个多叉树,并(以一种贪婪的方式)寻找每个节点上的分类特征,并为分类目标获取出最大的信息收益。一般这种算法生成的树都会"生长"到最大尺寸,所以经常需要一个修剪阶段来提高其应用在新数据上的能力。

C4.5 是 ID3 算法的后继者,它通过动态地定义离散参数(基于数值变量),将连续的属性值转化为一组间距离散来取消特征必须是分类型的这一约束条件。C4.5将经过训练的树(即经过ID3算法输出的多叉树)转化为一个"如果...即..."的规则组。然后这些规则组将会通过评估后,以确定其排序位置。如果树的准确度没有提高,那么将会通过去除一些规则来完成修剪操作。

C5.0 是昆兰根据其所有权下对该算法的最新版本。比起C4.5,它占用的内存更少,建立出的规则组规模更小,但精准度更高。

CART (Classification and Regression Trees,分类与回归树)跟 C4.5 相比很相似,但是其不同点在于它(在回归问题)支持数值的目标变量和不需要计算规则组。CART 通过在每个节点上使用特征和阈值来产生出最大的信息收益。

scikit-learn 中使用的CART算法是经过优化后的版本。

1.10.7. 数学公式#

给定一个训练向量 ** xi ∈ R^n, i = 1,..., ι ** 和 标签向量** y ∈ R^ι **,然后决策树递归地分割这两组空间,使得拥有相同标签的向量组组合在一起。

然后让** m 点上的数据用 Q 表示。对每一个候选组 θ = (j, t_m) 关联一个特征 j 和阈值 t_m ,然后将原来的数据 Q 分割为 Q_left(θ) Q_right(θ) **两个子集。

不纯度** m 则通过不纯度函数 H() **来计算出,而这一函数取决于要解决的任务来决定(分类或回归)

为** k 类在节点 m **中与观测值的比例。

然后常见的计算不纯度的方法有:基尼

和 错分类

1.10.7.2. 回归标准##

如果目标是一个连续值,那么在节点** m 上,可以表示在区域 R_m 里有 N_m **个观测值,然后常见的最小化方式是使用均方误差

引用


(在尝试翻译这篇文档的时候难免会因为各种问题而出现错翻,如果发现的话,烦请指出,谢谢> <)

上一篇下一篇

猜你喜欢

热点阅读