Scikit-Learn LOOCV 与手动执行会给出不同的结果,为什么?

问题描述 投票:0回答:2

所以我为一个小数据集构建了一个模型,由于它是一个小数据集,我对其准确性进行了留一交叉验证(LOOCV)检查。简而言之,我将手动删除一个样本,训练模型,预测留下的样本并保存预测并对所有样本重复该过程。然后我将使用预测列表和实际值来获取 RMSE 和 R2。 今天我发现有一个 Scikit-Learn 实现 sklearn.model_selection.LeaveOneOut,但是,当我尝试它时,它给了我不同的 RMSE 结果,并且拒绝使用 R 平方作为 LOOCV 方法中的准确性(它似乎计算每个样本的准确度,这不适用于 R2)。

这是代码的简短示例:

from numpy import mean
from numpy import std
from sklearn.datasets import make_blobs
from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier

cv = LeaveOneOut()
model = RandomForestRegressor(n_estimators=200, max_depth=6,n_jobs=40, random_state=0)

scores = cross_val_score(model, data2SN, labelCL, scoring='neg_root_mean_squared_error', cv=cv, n_jobs=-1)
# report performance
print('Accuracy: %.3f (%.3f)' % (mean(scores), std(scores)))

我的猜测是,我正在计算整个数据集的 RMSE,而 LOOCV 是针对每个样本计算的,最终我会取平均值,这就是导致两个代码输出之间存在差异的原因,但是,当我尝试计算失败的每个样本的 RMSE(引用此 TypeError:单例数组 3021.0 不能被视为有效集合)。 所以我不确定 LOOCV 中的 RMSE 是如何计算的。我不确定是否相信我的代码或只是盲目地使用 scikit-learn 实现。
我不知道该做什么,而 chatGPT 简直令人困惑,所以我的人类弟兄们请帮忙

python machine-learning scikit-learn metrics cross-validation
2个回答
0
投票

cross_val_score
平均跨折叠的分数,因此对于
cv=LeaveOneOut()
是的,它正在计算每行的分数(通过在所有其他行上训练的模型)。 对于 RMSE,这相当于 MAE; R2 就会失败。

您可以使用

cross_val_predict
获取单独的预测,然后立即对该集合进行评分,以重现您的手动工作。


0
投票

我刚刚遇到了同样的问题。 我的直觉是,结合 loocv 和 rmse 可能会产生误导,因为您将使用 rmse(训练)计算一条曲线,使用 MAE(验证)计算另一条曲线。因此,您失去了两条曲线之间的可解释性。如果您使用均方误差而不是均方根误差,则不会发生这种情况。大家觉得这个有道理吗?

© www.soinside.com 2019 - 2024. All rights reserved.