sklearn中K-Fold Cross Validation中每个折叠的预测值

Posted

技术标签:

【中文标题】sklearn中K-Fold Cross Validation中每个折叠的预测值【英文标题】:Predicted values of each fold in K-Fold Cross Validation in sklearn 【发布时间】:2019-01-14 01:39:11 【问题描述】:

我使用 python sklearn 对一个数据集执行了 10 倍交叉验证,

result = cross_val_score(best_svr, X, y, cv=10, scoring='r2')
print(result.mean())

我已经能够得到 r2 分数的平均值作为最终结果。我想知道是否有办法打印出每个折叠的预测值(在本例中为 10 组值)。

【问题讨论】:

【参考方案1】:

我相信您正在寻找cross_val_predict 函数。

【讨论】:

是的!谢谢。我想知道我是否可以分别打印出每个折叠的结果 我知道它对所有折叠都有预测。我想知道是否有办法分别打印出每个折叠的结果。例如,第 1 折:....,第 2 折:...... .....等【参考方案2】:

一个迟到的答案,只是为了添加到@jh314,cross_val_predict 确实返回了所有预测,但我们不知道每个预测属于哪个折叠。为此,我们需要提供折叠,而不是整数:

import seaborn as sns
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_predict, StratifiedKFold 

iris = sns.load_dataset('iris')
X=iris.iloc[:,:4]
y=(iris['species'] == "versicolor").astype('int')

rfc = RandomForestClassifier()
skf = StratifiedKFold(n_splits=10,random_state=111,shuffle=True)

pred = cross_val_predict(rfc, X, y, cv=skf)

现在我们遍历 Kfold 对象并提取每个折叠对应的预测:

fold_pred = [pred[j] for i, j in skf.split(X,y)]
fold_pred

[array([0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0]),
 array([0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0]),
 array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1]),
 array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]),
 array([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0]),
 array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0]),
 array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]),
 array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]),
 array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0]),
 array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0])]

【讨论】:

不错的方法!请问在这种情况下是否可以提取错误分类或分类实例的真实索引?我没有找到这个问题的答案! ***.com/questions/66686327/… 是否可以使用 kfold.split(X, y, groups=None) ?或任何解决方法,例如 sample_indices_ 或其他? 请看看这个问题...***.com/questions/67956643/…【参考方案3】:

要打印每个折叠的预测,

for k in range(2,10):
    result = cross_val_score(best_svr, X, y, cv=k, scoring='r2')
    print(k, result.mean())
    y_pred = cross_val_predict(best_svr, X, y, cv=k)
    print(y_pred)

【讨论】:

这执行与print(result) 相同的功能。我想为每个折叠单独打印它们 @KrishiH result 给你分数,而y_pred 给你预测。请检查。 我认为你不明白我的问题。 y_pred 返回所有预测。我想分别打印每个折叠的预测。 @KrishiH 添加cv 作为cross_val_predict 的参数给出了预测。谢谢!

以上是关于sklearn中K-Fold Cross Validation中每个折叠的预测值的主要内容,如果未能解决你的问题,请参考以下文章

在 K-Fold Cross 验证中的 keras 中在哪里创建模型对象?

由于不可克隆性,将 KerasRegressor 与 cross_validate 一起使用失败

我在 k-fold cross_validation 中使用相同的 Tfidf 词汇吗

K-fold Cross-Validation - 在每次折叠后初始化网络?

如何使用 sklearn python 预测未来的数据帧?

交叉验证(cross validation)是什么?K折交叉验证(k-fold crossValidation)是什么?