我想使用交叉验证评估使用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))

另一种是将cv-predictions与标准r2_score结合使用:
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折小的情况。尽管10倍cv的r ^ 2大致相同,但在使用“cross_vall_score”的第一个版本的情况下,对于较高的k值,r ^ 2越来越低。第二个版本在很大程度上不受折叠数变化的影响。

这种行为是可以预期的吗?我对SKLearn中的简历缺乏了解吗?

最佳答案

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/

10-12 17:53