Decision Trees (DT)是用于分类和回归的非参数监督学习方法。 目标是创建一个模型,通过学习从数据特征推断出的简单决策规则来预测目标变量的值。
例如,在下面的例子中,决策树从数据中学习用一组if-then-else决策规则逼近正弦曲线。 树越深,决策规则越复杂,模型也越复杂。
决策树的优点:
- 易于理解和解释。树可以被可视化。
- 需要很少的数据准备。其他技术通常需要数据标准化,需要创建虚拟变量,并删除空白值。但请注意,该模块不支持缺少的值。
- 使用树(即,预测数据)的成本在用于训练树的数据点的数量上是对数级别的。
- 能够处理数字和分类数据。其他技术通常专门用于分析只有一种变量的数据集。查看更多信息的算法。
- 能够处理多输出问题
- 使用白盒模型。如果一个给定的情况在一个模型中是可观察的,那么这个条件的解释可以用布尔逻辑来解释。相反,在黑盒模型(例如,在人造神经网络中),结果可能更难以解释。
- 可以使用统计测试来验证模型。这可以说明模型的可靠性
- 即使其假设受到数据生成的真实模型的某些违反,也能很好地执行。
决策树的缺点:
- 决策树学习者可以创建过于复杂的树,不能很好地概括数据。这被称为过度拟合。修剪(目前不支持)等机制,设置叶节点所需的最小样本数或设置树的最大深度是避免此问题所必需的。
- 决策树可能是不稳定的,因为数据的小变化可能导致生成完全不同的树。通过在集合(ensemble)中使用决策树可以缓解这个问题。
- 学习最优决策树的问题在最优化的几个方面甚至简单的概念上都被认为是NP完全的。因此,实际的决策树学习算法基于启发式算法,例如在每个节点处进行局部最优决策的贪婪算法。这样的算法不能保证返回全局最优的决策树。这可以通过在集合学习器(ensemble learner)中训练多个树来减轻,其中特征和样本随机地被替换。
- 有些概念很难学,因为决策树不能很容易地表达它们,比如XOR,奇偶校验或多路复用器问题。
- 决策树学习者如果某些类占主导地位,就会创建偏向性树。因此建议在拟合决策树之前平衡数据集。
Classification
DecisionTreeClassifier是一个能够对数据集进行多类分类的类。
与其他分类器一样,DecisionTreeClassifier采用两个数组作为输入:保存训练样本的大小为[n_samples,n_features]的稀疏或密集数组X,以及保存类标签的整数值数组Y [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])分类的能力。
使用Iris数据集,我们可以构建一棵树,如下所示:
>>> 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格式导出树。 如果您使用conda软件包管理器,则可以使用graphviz二进制文件和python软件包进行安装
conda install python-graphviz
或者,可以从graphviz项目主页下载graphviz的二进制文件,并使用pip安装graphviz从pypi安装Python包装程序。
下面是在整个Iris数据集上训练的上述树的graphviz输出示例; 结果保存在一个输出文件iris.pdf中:
>>> import graphviz >>> dot_data = tree.export_graphviz(clf, out_file=None) >>> graph = graphviz.Source(dot_data) >>> graph.render("iris")
export_graphviz导出器还支持各种美观的选项,包括按类别(或回归值)着色节点,并根据需要使用显式变量和类名称。 Jupyter笔记本也自动内联这些图。
>>> 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 = graphviz.Source(dot_data) >>> graph
经过拟合后,模型可以用来预测样本的类别:
>>> clf.predict(iris.data[:1, :]) array([0])
或者,可以预测每个类的概率,这是叶子节点中同一类的训练样本的比值:
>>> clf.predict_proba([[2., 2.]]) array([[ 0., 1.]])
Examples:
未完待续。。。
详见:http://scikit-learn.org/stable/modules/tree.html