只需构建树,使叶子不仅包含单个类估计,还包含概率估计。这可以简单地通过运行任何标准的决策树算法并通过它运行一堆数据并计算预测标签在每个叶子中正确的时间部分来完成;这就是 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。)