sklearn中K-Fold交叉验证的每个折叠的预测值

6

我使用Python的sklearn对一个数据集进行了10折交叉验证。

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

我已经能够得到r2分数的平均值作为最终结果。我想知道是否有一种方法可以打印出每个折叠(在这种情况下是10组值)的预测值。

3个回答

3

可以的!谢谢。我想知道是否可以单独打印每个折叠的结果。 - Krishi H
我知道它有所有折叠的预测结果。我想知道是否有一种方法可以单独打印出每个折叠的结果。例如,第1个折叠:{....},第2个折叠:{......} .....等等。 - Krishi H

3

晚些回答,只是补充@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])]

不错的方法!请问在这种情况下是否有可能提取出被错误分类或正确分类实例的真实索引?我找不到这个问题的答案!https://stackoverflow.com/questions/66686327/how-do-i-get-misclassified-instances-and-their-indices-for-each-fold-cross-valid - DOT
使用kfold.split(X, y, groups=None)是否可以实现?或者有没有其他解决方法,例如sample_indices_或其他? - DOT
请看这个问题... https://stackoverflow.com/questions/67956643/not-getting-indices-of-misclassified-instances-during-kfold-cross-validation - DOT

0

为了打印每个折叠的预测结果,

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)执行相同的功能。我想为每个fold单独打印它们。 - Krishi H
@KrishiH result 给出了分数,而 y_pred 给出了预测结果。请检查一下。 - Van Peer
1
我认为你没有理解我的问题。y_pred 返回的是所有预测值。我想要单独打印每个折叠的预测值。 - Krishi H
@KrishiH 在 cross_val_predict 中添加 cv 作为参数即可得到预测结果。谢谢! - Van Peer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接