如何在 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中进行字典向量化后预测单个新样本?