【发布时间】:2019-04-30 14:57:12
【问题描述】:
在sklearn.model_selection.cross_val_predictpage 中声明:
为每个输入数据点生成交叉验证的估计值。它是 不适合将这些预测传递到评估指标中。
谁能解释一下这是什么意思?如果这给出了每个 Y(真实 Y)的 Y(y 预测)估计值,为什么我不能使用这些结果计算 RMSE 或决定系数等指标?
【问题讨论】:
标签: python scikit-learn cross-validation
在sklearn.model_selection.cross_val_predictpage 中声明:
为每个输入数据点生成交叉验证的估计值。它是 不适合将这些预测传递到评估指标中。
谁能解释一下这是什么意思?如果这给出了每个 Y(真实 Y)的 Y(y 预测)估计值,为什么我不能使用这些结果计算 RMSE 或决定系数等指标?
【问题讨论】:
标签: python scikit-learn cross-validation
为了更清楚一点,如果您考虑非线性评分函数(例如最大绝对误差)而不是平均绝对误差之类的东西,则更容易理解差异。
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) 将是模型的最大绝对误差分数的不合理且过于悲观的表征。
【讨论】:
这似乎是基于样本的分组和预测方式。来自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
【讨论】: