如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

Posted

技术标签:

【中文标题】如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?【英文标题】:How do I output the regression prediction from each tree in a Random Forest in Python scikit-learn? 【发布时间】:2014-01-04 03:05:33 【问题描述】:

除了组合预测之外,还有没有办法从随机森林中的每棵树中获取预测?我想输出列表中的所有预测,而不是查看整个树。我知道我可以使用 apply 方法获取叶子索引,但我不确定如何使用它从叶子中获取值。

编辑:这是我到目前为止从下面的 cmets 得到的。之前我不清楚可以调用 estimators_ 属性中的树,但似乎可以在使用该属性的每棵树上使用 predict 方法。不过,这是最好的方法吗?

numberTrees = 100
clf = RandomForestRegressor(n_estimators=numberTrees)
clf.fit(X,Y)
for tree in range(numberTrees):
    print(clf.estimators_[tree].predict(val.irow(1)))

【问题讨论】:

+1 - 你也可以用列表理解很好地做同样的事情:per_tree_pred = [tree.predict(X) for tree in clf.estimators_] 如果你想匹配模型的并行作业行为,只需复制predict 的源代码,并省略最后一步平均预测! 【参考方案1】:

我很确定你所拥有的一切都是你能做到的最好的。如您所述,predict() 返回整个 RF 的预测,但不返回其组件树的预测。它可以返回一个矩阵,但这仅适用于同时学习多个目标的情况。在这种情况下,它会为每个目标返回一个预测,而不是返回每棵树的预测。您可以使用predict.all = True 在 R 的随机森林中获得单个树的预测,但 sklearn 没有。如果你尝试使用apply(),你会得到一个叶子索引矩阵,然后你仍然需要遍历树来找出那个树/叶子组合的预测是什么。所以我认为你所拥有的已经是最好的了。

【讨论】:

感谢您的回复。这似乎是任何使用 scikit-learn 中的集成方法的人都会使用的东西,所以我很惊讶我没有从其他人那里得到更多的输入。我特别感兴趣的是了解如何使用 RF 进行具有 2 个或更多答案的预测。所以,我正在绘制每棵树的预测以查看结果的分布。【参考方案2】:

我遇到了同样的问题,我不知道您是如何使用print(clf.estimators_[tree].predict(val.irow(1))) 得到正确答案的。它给了我随机数而不是实际的课程。在阅读了 SKlearn 中的源代码后,我意识到我们实际上必须在代码中使用predict_proba() 而不是 predict,它会根据clf.classes_ 中的顺序为您提供树预测的类。例如:

tree_num = 2
tree_pred = clf.estimators_[tree_num].predict_proba(data_test)
print clf.classes_  #gives you the order of the classes
print tree_pred  #gives you an array of 0 with the predicted class as 1
>>> ['class1','class2','class3']
>>> [0, 1, 0]

您还可以对您的数据使用 cls.predict_proba(),它通过树的累积为您提供每个类别预测的概率,并让您摆脱自己遍历每棵树的痛苦:

x = clf.predict_proba(data_test) # assume data_test has two instances
print rfc.classes_
print x
>>> ['class1', 'class2', 'class3']
>>> [[0.12 ,  0.02,  0.86], # probabilities for the first instance
     [0.35 ,  0.01,  0.64]]  # for the second instance

【讨论】:

嗨,也许是一个后续问题,是否还有像所有这些树的标准差/方差这样的东西?即让我知道我的预测有多可靠? @HME 最好在单独的帖子中提出后续问题,以帮助可能遇到相同问题的其他人找到它们。对您的问题的简短回答:sklearn 随机森林回归器中的一种方法是“得分”,它给出了数据,而真实的类给出了决定系数。在这里查看:scikit-learn.org/stable/modules/generated/…【参考方案3】:

我最近做的就是修改sklearn源代码得到它。 sklearn 包内 sklearn.ensemble.Randomforestregressor

有一个功能,如果您添加打印,您将看到每棵树的单独结果。您可以将其更改为返回并获取每棵树的单独结果。

def _accumulate_prediction(predict, X, out, lock):
    """
    This is a utility function for joblib's Parallel.

    It can't go locally in ForestClassifier or ForestRegressor, because joblib
    complains that it cannot pickle it when placed there.
    """
    prediction = predict(X, check_input=False)
    print(prediction)
    with lock:
        if len(out) == 1:
            out[0] += prediction
        else:
            for i in range(len(out)):
                out[i] += prediction[i]

这有点复杂,因为你必须修改 sklearn 源代码

【讨论】:

【参考方案4】:

我不能 100% 确定您到底想要什么,但 Scikit-learns Random Forest Regressor 中还有其他一些方法很可能会返回您想要的,特别是 predict 方法!此方法返回一个预测值数组。您所说的获取均值是 score 方法,它只是使用 predict 方法返回 R 平方行列式的系数。

【讨论】:

随机森林是一种集成方法,可以平均来自许多决策树的预测。 predict 方法给出了所有树的预测的平均值,但我想查看给定输入的所有预测。例如,如果我在随机森林回归器中使用 10 个估计器,我希望看到来自 10 棵树的预测,而不是 predict 方法给出的平均值。 @chunky 我知道随机森林是什么,这很奇怪,因为根据文档,predict 似乎会给出每棵树的预测数组,这就是你要求。我已经有几个月没有使用随机森林了,现在无法为您测试,但根据文档,您描述的是分数,而不是预测。 score 输出平均值,predict 输出基于所有树的所有预测的数组 Score 返回 R^2 值,这根本不是我想要的。根据文档,预测返回“输入样本的预测回归目标被计算为 森林中树木的平均预测回归目标”。它返回所有树预测的平均值。我不想要预测的平均值,而是预测本身。 啊.. 我想我现在已经接近了。我在随机森林上使用预测来获得森林中树木的平均预测。我只需要在每棵树上使用 predict 方法。它看起来像这样。clf = RandomForestRegressor(); clf.fit(X,Y); for tree in range(numberTrees): print(clf.estimators_[tree].predict(val.irow(1))) 不过,我不确定这是否是最好的方法。 我的意思是这样做,但我仍然不明白当它返回每棵树上的预测数组时,你实际上是如何从 predict 中获取值的......所以理论上 predict 返回一个数组你在 for 循环中所做的事情。也许你没有使用最新版本的 Scikit learn。

以上是关于如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 虚拟环境中导入 scikit-learn?

如何在 Python 中使用带有 Keras 的 scikit-learn 评估指标函数?

如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

python - 如何在python scikit-learn中进行字典向量化后预测单个新样本?

如何在 python scikit-learn 中更改精度和召回的阈值?

如何在 python Scikit-learn 中获得凝聚聚类“质心”