使用cross_val_predict sklearn计算评估指标

时间:2018-11-28 16:21:50

标签: python scikit-learn cross-validation

sklearn.model_selection.cross_val_predict page中指出:

  

为每个输入数据点生成交叉验证的估计。它是   不适合将这些预测传递到评估指标中。

有人可以解释什么意思吗?如果这样可以估算出每个Y(真实Y)的Y(预测y),为什么我不能使用这些结果来计算诸如RMSE或确定系数的指标?

2 个答案:

答案 0 :(得分:1)

它似乎基于样本的分组和预测方式。在cross_val_predict文档中链接的user guide中:

  

关于不正确使用cross_val_predict的警告

     

的结果   cross_val_predict可能与使用   cross_val_score,因为元素以不同的方式分组。的   函数cross_val_score取交叉验证折叠的平均值,   而cross_val_predict仅返回标签(或概率)   从几个不同的模型无法区分。因此,cross_val_predict   这不是适当的泛化误差度量。

cross_val_score似乎说它在所有折叠的平均范围内,而cross_val_predict则对单个折叠和不同的模型进行分组,但不是全部,因此不会也必须概括。例如,使用sklearn页面中的示例代码:

from sklearn import datasets, linear_model
from sklearn.model_selection import cross_val_predict, cross_val_score
from sklearn.metrics import mean_squared_error, make_scorer
diabetes = datasets.load_diabetes()
X = diabetes.data[:200]
y = diabetes.target[:200]
lasso = linear_model.Lasso()
y_pred = cross_val_predict(lasso, X, y, cv=3)

print("Cross Val Prediction score:{}".format(mean_squared_error(y,y_pred)))

print("Cross Val Score:{}".format(np.mean(cross_val_score(lasso, X, y, cv=3, scoring = make_scorer(mean_squared_error)))))

Cross Val Prediction score:3993.771257795029
Cross Val Score:3997.1789145156217

答案 1 :(得分:0)

仅需增加一点清晰度,如果考虑非线性评分函数(例如,最大绝对误差)而不是诸如均值绝对误差之类的东西,就更容易理解它们之间的差异。

cross_val_score()将计算3折中的每一个的最大绝对误差(假设3折交叉验证器),并报告3个这样的分数的总和(例如均值?)。也就是说,类似于(a,b,c)的平均值,其中a,b,c分别是3折的最大绝对误差。我认为将返回值确定为平均值或一般情况下估算器的最大绝对误差是安全的。

使用cross_val_predict(),您将获得与3折对应的3组预测,并且将这3组预测的总和(串联)取最大绝对误差与上述肯定不同。即使两种情况下的预测值相同,您最终得到的也是(a,b,c)的最大值。同样,max(a,b,c)将是模型的最大绝对误差得分的不合理且过于悲观的表征。