gpt4 book ai didi

python - 为什么手动计算的MSE与sklearn中的LassoCV.mse_path不同

转载 作者:行者123 更新时间:2023-11-30 09:48:39 25 4
gpt4 key购买 nike

我正在 python 中使用 lasso,但是有一个问题让我感到困惑。以下example ,我的代码如下:

kf = KFold(10,random_state=0,shuffle=False)  
model_lassocv = LassoCV(cv=kf).fit(X, y)

model_lassocv.mse_path_ 给出 array([[ 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,而 mse_path_ LassoCV 返回 5747。

最佳答案

原因在于您手动执行模型拟合。 mse_path_ 属性中的 MSE 是 KFold 对象生成的每个折叠的 MSE。但是,在手动实现中,当您使用 cross_val_predict 时,您要求 sklearn 使用所有可用折叠来训练模型,而不是 LassoCv 实现中使用的特定折叠。我将使用 sklearn 提供的 boston 数据集提供正确的解决方案。

from sklearn.model_selection import cross_val_predict, cross_val_score, KFold
from sklearn.linear_model import LassoCV, Lasso
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_boston

X, y = load_boston(return_X_y=True)
kf = KFold(10, random_state=0, shuffle=False)

现在让我们看看折叠是什么样的:

for train_i, test_i in kf.split(X):
print(train_i, test_i)

(array([ 51, 52, 53, ... , 505], dtype=int64), array([ 0, 1, 2, ... , 50], dtype=int64)) ... (array([ ... ]))

为简洁起见,我只显示第一个折叠,其中训练集由索引从 51 到 505 组成,对于此折叠中的测试集,索引为从 0 到 50。

现在让我们使用 LassoCV 方法进行拟合:

model_lassocv = LassoCV(cv=kf).fit(X, y)
model_lassocv.mse_path_

MSE路径的结果:

  array([[  41.74173819,   29.78409579,   32.00672122,  191.68560655,
103.46618603, 172.62108062, 16.92365434, 181.06822315,
116.83656233, 35.92813347], [ ... ], ... ])

同样,为了简洁起见,我仅显示第一个 alpha 的所有 10 次折叠的 MSE。根据您的示例,您希望匹配 LassoCV 中使用的第一个 alpha 的第一个折叠的 MSE,因此就我而言,我想手动获取结果 = 41.74173819。

现在,这是我将通过手动实现执行的操作:

  lasso = Lasso(alpha = model_lassocv.alphas_[0])
lasso.fit(X[51:506], y[51:506])
predict = lasso.predict(X[0:51])
mean_squared_error(y_pred=predict, y_true=y[0:51])

主要区别:

  1. 我使用 KFold 对象识别的第一个折叠的训练集来拟合我的模型(还记得我说过第一个折叠训练的索引为 51-505 吗?)。
  2. 然后我根据第一次折叠的测试集生成我的预测。 (此处测试集的索引为0-50)

我手动计算的结果?

41.741738189299873

因此,我们有一场比赛。

关于python - 为什么手动计算的MSE与sklearn中的LassoCV.mse_path不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49004835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com