【发布时间】:2018-02-27 09:05:21
【问题描述】:
我正在 python 中使用套索,但有一个问题让我感到困惑。 在下面example中,我的代码如下:
kf = KFold(10,random_state=0,shuffle=False)
model_lassocv = LassoCV(cv=kf).fit(X, y)
model_lassocv.mse_path_ 给出数组([[ 5747.95194531, 4590.75732123, ...]])。
我手动计算了 mse:
from sklearn import linear_model
from sklearn.model_selection import cross_val_predict, cross_val_score
lasso = linear_model.Lasso(alpha = model_lassocv.alphas_[0])
predict = cross_val_predict(lasso, X, y, cv=kf)
metrics.mean_squared_error(y_pred=predict[0:44],y_true=y[0:44])
# 0:44 is the first test set according to KFold function
# and result here gives 5625 instead of 5747.95
然而,
cross_val_score(lasso,X,y, cv=kf, scoring="neg_mean_squared_error")
给出与 model_lassocv.mse_path_ 相同的结果,但否定结果除外。
对不起,我的误导性问题。我想知道为什么metrics.mean_squared_error 返回与mse_path_ 不同的结果。如果我没有误解KFold 的分区,那么 10 倍 CV 中的第一个测试集是 0:44。并且由metrics.mean_squared_error 计算的第一个 alpha(在我的情况下为 2.14804358)的第一个测试集中的交叉验证预测和真实值的 MSE 返回 5625,而 LassoCV 的 mse_path_ 返回 5747。
【问题讨论】:
-
您能举个 X 和 Y 的例子,以便我们检查结果吗?
-
我相信这是在这里讨论的:github.com/scikit-learn/scikit-learn/issues/2439我想如果你想让两者匹配,使用
make_scorer并通过greater_is_better = True -
嗯,
mse_path_属性提供了在建模过程中测试的不同 alpha 的 MSE。您必须找到模型选择的 alpha,然后找到该 alpha 值对应的 MSE。至于MSE的负值,开发者就是这么设计的。这就是为什么评分被称为neg_mean_squared_error。在之前版本的 sklearn 中,neg不在评分描述中,这导致用户感到困惑。 -
@Mabel Villalba 很抱歉,下面的链接中提供了示例。
-
@Scratch'N'Purr 我收到了您的消息,但问题可能存在误导。我对 neg_mean_squared_error 和 mse_path_ 的结果很满意,它们是一样的。我自己计算的MSE是使用lassoCV结果中的第一个alpha,这个MSE应该是5747.95194531(对于第一个alpha和10倍CV中的第一个测试集)。但是我得到 5625。这让我很困惑。
标签: python machine-learning scikit-learn