【问题标题】:mean squared error in scikit learn RidgeCVscikit learn RidgeCV中的均方误差
【发布时间】:2017-07-04 16:50:30
【问题描述】:

我的问题是:在sklearn中,RidgeCV给出的cv_values_是怎么计算出来的?为什么与metrics.mean_squared_error 的输出不同?

例如,

X = [1,2,3,4,5,6,7,8,9,10]
X = np.array(X).reshape(-1,1)
y = np.array([1,3.5,4,4.9,6.1,7.2,8.1,8.9,10,11.1])
ax.plot(X, y, 'o')
ax.plot(X, X+1, '-') # help visualize

假设我们在 X 和 y 上训练 Ridge 模型

from sklearn.linear_model import RidgeCV
from sklearn.metrics import mean_squared_error
model = RidgeCV(alphas = [0.001], store_cv_values=True).fit(X, y)

现在

的输出
mean_squared_error(y_true=y, y_pred=model.predict(X))

0.1204000013110009,而

的输出
model.cv_values_.mean()

0.24472577167818438

为什么会有这么大的差异?我错过了什么明显的东西吗?

【问题讨论】:

  • 如果答案解决了您的问题,请告诉我。

标签: scikit-learn mse mean-square-error


【解决方案1】:

来自官网link

cv_values_

每个 alpha 的交叉验证值如果 store_cv_values=True 和 cv=None)。调用 fit() 后,该属性将包含 均方误差(默认)或 {loss,score}_func 函数的值(如果在构造函数中提供)。

当你打电话给你的情况

model = RidgeCV(alphas = [0.001], store_cv_values=True).fit(X, y)

你有:cv=None

cv=None 表示您使用 Leave-One-Out 交叉验证。

所以cv_values 使用 Leave-One 交叉验证存储每个样本的均方误差。在每个折叠中,您只有 1 个测试点,因此 n = 1。因此,cv_values_ 将为您提供训练数据集中每个点的平方误差,当它是测试折叠的一部分时。

最后,这意味着当您调用model.cv_values_.mean() 时,您会得到这些单个错误的平均值(每个点的每个错误的平均值)。要查看这些单独的错误,您可以使用print(model.cv_values_)

个体表示下式中n=1:

另一方面,mean_squared_error(y_true=y, y_pred=model.predict(X)) 表示您将 n=10 置于此等式中。

所以两个结果会有所不同。

【讨论】:

  • 啊,我明白了。我确实阅读了 RidgeCV 的文档,但我没有考虑参与 MSE 计算的点数。谢谢!
  • 很高兴我能帮上忙
猜你喜欢
  • 2020-08-10
  • 2014-02-22
  • 2019-09-11
  • 2018-12-05
  • 2017-04-30
  • 2017-12-23
  • 2017-05-07
  • 2019-06-08
  • 2017-03-20
相关资源
最近更新 更多