python - cross_val_score 和 cross_val_predict 的区别

标签 python machine-learning scikit-learn regression cross-validation

我想评估一个使用交叉验证的 scikitlearn 构建的回归模型,我很困惑,我应该使用 cross_val_scorecross_val_predict 这两个函数中的哪一个。 一种选择是:

cvs = DecisionTreeRegressor(max_depth = depth)
scores = cross_val_score(cvs, predictors, target, cv=cvfolds, scoring='r2')
print("R2-Score: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

另一个,使用标准 r2_score 的 cv 预测:

cvp = DecisionTreeRegressor(max_depth = depth)
predictions = cross_val_predict(cvp, predictors, target, cv=cvfolds)
print ("CV R^2-Score: {}".format(r2_score(df[target], predictions_cv)))

我会假设这两种方法都是有效的并且给出相似的结果。但这只是小 k 折的情况。虽然 r^2 对于 10-fold-cv 大致相同,但在使用“cross_vall_score”的第一个版本的情况下,对于更高的 k 值,它变得越来越低。第二个版本基本上不受折叠次数变化的影响。

这种行为是预料之中的吗?我对 SKLearn 中的 CV 缺乏了解吗?

最佳答案

cross_val_score 返回测试折叠的分数,其中 cross_val_predict 返回测试折叠的预测 y 值。

对于 cross_val_score(),您使用的是输出的平均值,这将受到折叠次数的影响,因为它可能会有一些折叠,这可能会有很高的错误(不正确拟合) ).

然而,对于输入中的每个元素,cross_val_predict() 返回该元素在测试集中时获得的预测。 [请注意,只能使用将所有元素分配给测试集一次的交叉验证策略]。所以折叠次数的增加,只是增加了测试元素的训练数据,对其结果可能影响不大。

编辑(评论后)

请查看以下有关 cross_val_predict 工作原理的答案:

How is scikit-learn cross_val_predict accuracy score calculated?

我认为 cross_val_predict 会过拟合,因为随着折叠数的增加,更多的数据将用于训练,而更少的数据将用于测试。所以得到的标签更依赖于训练数据。同样如上所述,对一个样本的预测只进行一次,因此它可能更容易受到数据拆分的影响。 这就是为什么大多数地方或教程都推荐使用 cross_val_score 进行分析。

关于python - cross_val_score 和 cross_val_predict 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43613443/

相关文章:

python - Keras 多 GPU 模型对于自定义模型失败

python - sklearn LogisticRegression predict_proba() 在使用 sample_weight 参数时给出错误的预测

python - 为什么权重不会改变 sci-kit 学习包中的 K 均值聚类中心位置?

python - 二维零数组

Python Altair 绘制两个偏差标准

machine-learning - MXNet 是否使用 Nvidia 的 NCCL 库进行多 GPU 通信?

python - 加载 CNN 模型并预测 CSV 文件

python - 如何用 pandas 按顺序标记编码多个类别(多行)?

python - TfidfVectorizer - 归一化偏差

python - 在 python 列表中查找具有最小总和的元组