展开

决策树

最后发布时间 : 2023-04-23 08:45:39 浏览量 :

决策树是一种用于分类和回归的非参数监督学习方法。目标是创建一个模型,通过学习从数据特征推断的简单决策规则来预测目标变量的值。树可以看作是分段常数近似。

例如,在下面的例子中,决策树从数据中学习,用一组if-then-else决策规则来近似正弦曲线。树越深,决策规则就越复杂,模型就越适合。

生信小木屋

  • 决策树的一些优点是:
    • 简单易懂。树木可以被可视化。
    • 几乎不需要准备数据。其他技术通常需要数据规范化,需要创建伪变量并删除空白值。但是请注意,此模块不支持缺少的值。
    • 使用树的成本(即预测数据)是用于训练树的数据点数量的对数。
    • 能够处理数字和分类数据。然而,scikit学习实现目前不支持分类变量。其他技术通常专门用于分析只有一种类型变量的数据集。有关详细信息,请参阅算法。
    • 能够处理多输出问题。
    • 使用白盒模型。如果给定的情况在模型中是可观察的,那么对条件的解释很容易用布尔逻辑来解释。相比之下,在黑盒模型中(例如,在人工神经网络中),结果可能更难解释。
    • 可以使用统计测试来验证模型。这样就有可能考虑到模型的可靠性。
    • 即使生成数据的真实模型在某种程度上违反了它的假设,它也能很好地执行。
  • 决策树的缺点包括:
    • 决策树学习者可以在复杂的树上创建不能很好地概括数据的树。这被称为过度拟合。修剪、设置叶节点所需的最小样本数或设置树的最大深度等机制对于避免这个问题是必要的。
    • 决策树可能是不稳定的,因为数据的微小变化可能会导致生成完全不同的树。通过在集合中使用决策树来缓解这个问题。
    • 决策树的预测既不是平滑的,也不是连续的,而是如上图所示的分段常数近似。因此,它们不擅长外推。
    • 众所周知,学习最优决策树的问题在几个最优性方面是NP完全的,甚至对于简单的概念也是如此。因此,实际的决策树学习算法是基于启发式算法,例如贪婪算法,其中在每个节点处做出局部最优决策。这样的算法不能保证返回全局最优的决策树。这可以通过在集成学习器中训练多棵树来缓解,其中特征和样本是通过替换随机采样的。
    • 有些概念很难学习,因为决策树不容易表达它们,例如XOR、奇偶校验或多路复用器问题。
    • 如果某些类占主导地位,决策树学习者会创建有偏见的树。因此,建议在与决策树拟合之前对数据集进行平衡。

分类

DecisionTreeClassifier是一个能够在数据集上执行多类分类的类。
与其他分类器一样,DecisionTreeClassifier采用两个数组作为输入:一个是稀疏或密集的形状(n_samples,n_features)数组X,用于保存训练样本,另一个是整数值形状(n_amples,)数组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])分类。
经过训练后,可以使用plot_tree函数绘制树:

tree.plot_tree(clf)
[Text(0.5, 0.75, 'X[1] <= 0.5\ngini = 0.5\nsamples = 2\nvalue = [1, 1]'),
 Text(0.25, 0.25, 'gini = 0.0\nsamples = 1\nvalue = [1, 0]'),
 Text(0.75, 0.25, 'gini = 0.0\nsamples = 1\nvalue = [0, 1]')]

生信小木屋