决策树
决策树(DTS)是一个非参数监督学习用于方法分类和回归。我们的目标是创建一个预测通过学习从数据推断出功能简单的决策规则的目标变量的值的典范。
例如,在下面的例子中,决策树从数据学习来近似正弦曲线与一组,如果 - 则 - 否则决策规则。的树越深,越复杂决策规则和钳工模型。
决策树的一些优点是:
- 简单的理解和解释。树可以可视化。
- 只需要很少的数据准备。其它技术通常需要数据归一化,虚设变量需要被创建和被删除的空白值。但是请注意,该模块不支持缺失值。
- 使用树的成本(即,预测的数据)是在用于训练树数据点的数目的对数。
- 能够同时处理数字和分类 数据。其它技术通常专门分析仅具有一种类型的变量的数据集。见算法,以获取更多信息。
- 能够处理多输出的问题。
- 采用了白色盒子模型。如果给定的情况是在一个模型中观察到,对于病情的解释很容易被布尔逻辑解释。与此相反,在黑盒模型(例如,在一个人工神经网络),结果可能更难以解释。
- 可以使用统计测试来验证模型。这使得有可能考虑了模型的可靠性。
- 性能良好,即使其假设一定程度上被从其中产生的数据的真实模型侵犯。
决策树的缺点包括:
- 决策树学习者可以创建过于复杂的树木不一概而论数据良好。这就是所谓的过拟合。机制,例如修剪(目前尚不支持),设置在叶节点所需的样本的最小数目或设置树的最大深度是必要的,以避免此问题。
- 决策树可以是不稳定的,因为在数据的微小变化可能导致生成一个完全不同的树。这个问题是通过使用合奏内决策树减轻。
- 学习最佳决策树的问题是已知的NP完全下最优的几个方面,甚至简单的概念。因此,实际的决策树学习算法是基于启发式算法如贪婪算法,其中局部最优决策是在每个节点进行。这种算法不能保证返回全局最优决策树。这可以通过在合奏学习者,其中的功能和样本被随机地与替换采样训练多个树来减轻。
- 有概念是很难学习,因为决策树不要轻易表达出来,如XOR,奇偶校验或多路复用器的问题。
- 决策树学习者创造偏见的树木,如果一些类占据主导地位。因此建议对数据集之前与决策树嵌合平衡。
1.10.1。分类
DecisionTreeClassifier
能够对数据集执行多类分类的一类。
与其他分类,DecisionTreeClassifier
需要输入两个数组:一个数组X,疏或密,规模 抱着训练样本,整数值,大小的列Y ,抱着类标签的训练样本:[n_samples, n_features]
[n_samples]
>>> 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])的分类。
使用虹膜数据,我们可以构造一个树如下:
>>> from sklearn.datasets import load_iris
>>> from sklearn import tree
>>> iris = load_iris()
>>> clf = tree.DecisionTreeClassifier()
>>> clf = clf.fit(iris.data, iris.target)
经过培训后,我们可以导出树的Graphviz使用的格式export_graphviz
导出。下面是培训了整个虹膜数据集的树的例子出口:
>>> from sklearn.externals.six import StringIO
>>> 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')
另外,如果我们有Python模块pydot
安装,我们可以直接在Python中生成PDF文件(或任何其他支持的文件类型):
>>> from sklearn.externals.six import StringIO
>>> import pydot
>>> dot_data = StringIO()
>>> tree.export_graphviz(clf, out_file=dot_data)
>>> graph = pydot.graph_from_dot_data(dot_data.getvalue())
>>> graph.write_pdf("iris.pdf")
该export_graphviz
出口还支持多种美学选项,其中包括他们的阶级着色节点(或价值回归),如果需要使用显式的变量和类名。IPython的笔记本电脑也可以使用使这些地块内嵌图像()函数:
>>> from IPython.display import Image
>>> dot_data = StringIO()
>>> tree.export_graphviz(clf, out_file=dot_data,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True,
special_characters=True)
>>> graph = pydot.graph_from_dot_data(dot_data.getvalue())
>>> Image(graph.create_png())
被装配后,该模型然后可以用于预测类样品:
>>> clf.predict(iris.data[:1, :])
array([0])
可替代地,每个类的概率可以预测,这是在一个叶同一类的训练样本的比例:
>>> clf.predict_proba(iris.data[:1, :])
array([[ 1., 0., 0.]])
例子:
- 绘制决策树的决定表面上的虹膜数据集
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为大小的2D阵列。[n_samples, n_outputs]
当在输出端之间没有相关性,一个非常简单的方法来解决这类问题是要建立n个独立的模型,即一个用于每个输出,然后使用这些模型来独立地预测n个输出端中的每一个。但是,因为它很可能是有关同一输入的输出值本身相关,一个常常更好的方式是建立能够同时预测所有n个输出端的一个单一的模式。首先,它要求,因为只有一个估计器被内置下的训练时间。其次,将所得估计的泛化精度可能往往增加。
关于决策树,这种策略可以容易地用于支持多输出的问题。这需要以下变化:
- 在叶商店n个输出值,而不是1;
- 使用计算所有n个输出平均降幅分割标准。
该模块通过实现双方这一战略提供了多路输出的问题,支持DecisionTreeClassifier
和 DecisionTreeRegressor
。如果决策树是适合的输出数组Y规格上则所得估计会:[n_samples, n_outputs]
- 输出n_output在值
predict
;- 输出经类概率n_output阵列的列表
predict_proba
。
回归使用多输出树是体现在 多路输出决策树回归。在这个例子中,输入X为一个单一的实际值与输出Y的X的正弦和 余弦
分类使用多输出树是表现在 面对完成了多路输出的估计。在这个例子中,输入X的面的上半部和输出Y的像素被这些面的下半部分的像素。
例子:
- 多路输出决策树回归
- 面完成具有多输出估计
参考文献:
- M. Dumont等, 随机子窗口和多输出随机树快多类图像标注,国际会议计算机视觉理论与应用2009
1.10.4。复杂性
在一般情况下,在运行时间成本来构造一个平衡二叉树是 与查询时间 。虽然树构建算法试图产生平衡树,他们不会永远是平衡的。假设该子树保持大致平衡,在每个节点处的费用由搜索通过寻找能够提供在熵最大减少的特征。这具有的成本 在每个节点,从而导致在整个树的总费用(通过求和每个节点的成本)的 。
Scikit学习提供了决策树的结构的更有效的实现。一个天真实现(如上所述)将重新计算在类标签直方图(分类用)或装置(回归),用于沿一给定功能的每个新的分割点。预分类的特征在所有相关样品,和保持一个运行标签数量,将在每一个节点,以减少复杂性,这导致总费用。这是所有基于树算法的一个选项。默认情况下它是开启了梯度推进,其中一般来说它使训练速度快,但关闭了所有其它的算法,因为它往往训练很深的树时,放慢训练。
1.10.5。在实际使用技巧
- 决策树往往在数据过度拟合了大量的功能。得到的样品的右侧比为特征数是重要的,因为在高维空间几个样品树很可能过度拟合。
- 考虑进行降维(PCA, ICA,或特征选择)中预先给你的树发现有歧视性的特点更好的机会。
- Visualise你的树,你是通过训练
export
功能。使用max_depth=3
作为初始树的深度来获取树是如何装修你的数据的感觉,再增加深度。- 请记住,填充树所需的样本数加倍为每个附加级的树生长到。使用
max_depth
来控制树的大小,以防止过 度拟合。- 使用
min_samples_split
或min_samples_leaf
在一个叶节点,以控制样本的数目。一个非常小的数量通常意味着树会过度拟合,而大量将防止树借鉴的数据。尝试min_samples_leaf=5
作为初始值。两者之间的主要区别在于,min_samples_leaf
保证在一个叶样品的最小数目,而min_samples_split
可以创建任意小叶子,虽然min_samples_split
更常见在文献中。- 培训以防止树从往那占主导类被偏置前平衡你的数据集。类平衡可以通过取样样品从每个类数目相同,或优选通过样品重量(总和正常化来完成
sample_weight
)对于每个类为相同的值。还要注意的是基于重量的修剪前的标准,如min_weight_fraction_leaf
,那么将是朝向主导类比是不知道样品的重量,如标准偏差较小min_samples_leaf
。- 如果样本被加权,它会更容易使用基于权重的修剪预准则如优化的树结构
min_weight_fraction_leaf
,这确保叶节点至少包含样本权的总体总和的一小部分。- 所有的决策树使用
np.float32
阵列内部。如果训练数据不是在此格式中,数据集的副本将被制成。- 如果输入矩阵X是非常稀疏,建议将其转换为稀疏 调用预测之前。训练时间可以是数量级相比时特征具有在大多数样本的零值的密集矩阵为稀疏矩阵输入快。
csc_matrix` before calling fit and sparse ``csr_matrix
1.10.6。树算法:ID3,C4.5,C5.0和CART
什么是所有不同的决策树算法和他们如何各不相同?哪一个是scikit学习的实施?
ID3(迭代Dichotomiser 3)由罗斯·昆兰在1986年开发的。该算法创建了一个多路树,找到每个节点(即贪婪地)中的分类功能,将产生分类目标最大的信息增益。树木生长至它们的最大尺寸,然后修剪步骤通常 适用于改进树的推广到看不见数据的能力。
C4.5的前身是ID3和删除的功能,必须通过动态定义离散属性(基于数值变量)类别的分区连续属性值转换成一组离散的时间间隔的限制。C4.5转换训练有素树木(即ID3算法的输出)成组的如果 - 那么规则。然后每个规则的这些准确性进行评估,以决定它们应该被应用顺序。修剪是,如果该规则的精度提高,没有它删除规则的前提进行。
C5.0是专有许可证下昆兰的最新版本发布。它使用较少的内存,并同时更加准确的建立比C4.5小的规则集。
CART(分类和回归树)非常相似C4.5,但不同之处在于,它支持数值目标变量(回归),不计算规则集。CART构建使用功能和阈值产生在每一个节点上最大的信息增益二叉树。
scikit学习使用CART算法的优化版本。
1.10.7。数学公式
给定的训练矢量,I = 1,...,l和一个标签矢量 ,决策树递归分割,使得具有相同的标签样品被分组在一起的空间。
让在节点的数据被表示。对于每一个候选分割包括功能和阈值,将数据划分为 与子集
在杂质用杂质函数被计算 ,这取决于任务的选择得到解决(分类或回归)
选择杂质最小化的参数
递归为子集和 直到到达最大允许深度, 或。
1.10.7.1。分类标准
如果目标是一个分类结果承担值0,1,...,K-1,为节点,表示区域与 观察,让
是类k观测点中的比例
杂质的常用措施是基尼
交叉熵
和误分类
1.10.7.2。回归标准
如果目标是一个连续的值,则节点,表示区域与观察,一个共同的标准,以减少是均方误差