决策树输出是预测还是类概率?

机器算法验证 分类 Python 随机森林 大车 决策理论
2022-03-07 10:41:58

随机森林通过聚合许多决策树的结果来工作。最近,我在阅读有关 RandomForest 如何聚合结果的文章,这让我怀疑决策树的结果是单个类预测还是每个类的概率。

文档predict_proba_ _

“输入样本的预测类别概率计算为森林中树木的平均预测类别概率。单棵树的类别概率是叶子中同一类别的样本的分数。”

关于“平均预测类别概率”的部分表明决策树是非确定性的。此外,Nando De Freitas 的讲座在这里也谈到了 30 分钟左右的班级概率。

我的问题是 -如何从单个决策树中获得类概率?

据我所知,sklearn 中 RandomForestClassifier 的默认值是确定性决策树(对于 ExtraTreesClassifier 之类的东西,情况并非如此)。那么,一棵树的这些“类概率”是从哪里来的呢?

2个回答

只需构建树,使叶子不仅包含单个类估计,还包含概率估计。这可以简单地通过运行任何标准的决策树算法并通过它运行一堆数据并计算预测标签在每个叶子中正确的时间部分来完成;这就是 sklearn 所做的。这些有时被称为“概率估计树”,虽然它们不能给出完美的概率估计,但它们可能很有用。在 00 年代初期,有很多工作对它们进行了调查,有时采用更奇特的方法,但 sklearn 中的简单方法很适合在森林中使用。

如果您不设置max_depth或类似的参数,那么树将始终保持分裂,直到每个叶子都是纯的,并且所有概率都将为 1(如 Soren 所说)。

请注意,这棵树不是不确定的;相反,给定一个输入,它会以概率的形式确定性地产生类别预测和置信度分数。

验证这是正在发生的事情:

>>> import numpy as np
>>> from sklearn.tree import DecisionTreeClassifier
>>> from sklearn.datasets import make_classification
>>> from sklearn.cross_validation import train_test_split

>>> X, y = make_classification(n_informative=10, n_samples=1000)
>>> Xtrain, Xtest, ytrain, ytest = train_test_split(X, y)

>>> clf = DecisionTreeClassifier(max_depth=5)
>>> clf.fit(Xtrain, ytrain)

>>> clf.predict_proba(Xtest[:5])
array([[ 0.19607843,  0.80392157],
       [ 0.9017094 ,  0.0982906 ],
       [ 0.9017094 ,  0.0982906 ],
       [ 0.02631579,  0.97368421],
       [ 0.9017094 ,  0.0982906 ]])

>>> from sklearn.utils import check_array
>>> from sklearn.tree.tree import DTYPE
>>> def get_node(X):
...     return clf.tree_.apply(check_array(X, dtype=DTYPE))
...
>>> node_idx, = get_node(Xtest[:1])
>>> ytrain[get_node(Xtrain) == node_idx].mean()
0.80392156862745101

(在尚未发布的 sklearn 0.17 中,此get_node助手可以替换为clf.apply。)

我没有太多使用随机森林的 sklearn 实现。[编辑] 似乎 sklearn 实际上提供了终端节点的完整概率状态。R,randomForest,没有。另请参阅此线程

因此取决于实现:预测概率是(a)所有树的平均终端叶概率或(b)投票任一类的树的比例。如果是袋外(OOB)预测,则仅在样本为 OOB 的树中。对于单个完全生长的树,我猜任何类的预测概率只能是 0 或 1,因为所有终端节点都是纯的(相同的标签)。如果单棵树没有完全生长和/或更多的树生长,则预测概率可以是从 0 到 1 的正有理数。