- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 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])
主要区别:
我手动计算的结果?
41.741738189299873
因此,我们有一场比赛。
关于python - 为什么手动计算的MSE与sklearn中的LassoCV.mse_path不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49004835/
我是一名优秀的程序员,十分优秀!