除了组合预测之外,还有什么方法可以从随机森林中的每棵树中获得预测吗?我想输出列表中的所有预测,而不是查看整个树。我知道我可以使用apply方法获得叶索引,但我不知道如何使用它从叶中获得值。
编辑:以下是我迄今为止从下面的评论中得到的内容。以前我不清楚是否可以调用estimators_attribute中的树,但似乎可以在使用该属性的每棵树上使用预测方法。这是最好的方法吗?
numberTrees = 100
clf = RandomForestRegressor(n_estimators=numberTrees)
clf.fit(X,Y)
for tree in range(numberTrees):
print(clf.estimators_[tree].predict(val.irow(1)))
我敢肯定,你所拥有的是你能做的最好的。正如你所指出的,predict()
返回了整个RF的预测,但没有返回其组件树的预测。它可以返回一个矩阵,但这仅适用于同时学习多个目标的情况。在这种情况下,它为每个目标返回一个预测,而不是为每个树返回预测。您可以使用predict.all = True
获得R的随机林中的单个树预测,但sklearn没有。如果你尝试使用apply()
,你会得到一个叶索引矩阵,然后你仍然需要在树上迭代,以找出对树/叶组合的预测。所以我认为你所拥有的是最好的。
我遇到了同样的问题,我不知道你是如何使用print(clf.estimators_[tree].predict(val.irow(1)))
得到正确答案的。它给我的是随机数,而不是实际的班级。在阅读了SKlearn中的源代码后,我意识到我们实际上必须使用predict_proba()
而不是在代码中预测,它为您提供了树根据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
我最近所做的是修改sklearn源代码以获得它sklearn.集成.随机森林回归器
有一个功能,如果您添加打印,您将看到每个树的单独结果。您可以将其更改为返回,并获得每棵树的单独结果。
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源代码
我不能100%确定你到底想要什么,但Scikit Learning Random Forest Regressor中还有其他一些方法,它们很可能会返回你想要的,特别是预测方法!此方法返回预测值的数组。你所说的关于得到平均值的是分数法,它简单地使用predict
方法来返回R平方行列式的系数。