You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lasso模型10折交叉验证训练集与测试集MAE计算正确性咨询

问题解答

1. 取绝对值操作的正确性

你对cross_val_score返回负值取绝对值的操作完全正确。
scikit-learn的评分规则默认是「值越高,模型效果越好」,而MAE(平均绝对误差)属于损失指标,数值越小效果越好,因此官方将其封装为neg_mean_absolute_error(负平均绝对误差)时,会主动对计算出的MAE取负,你通过np.absolute或者直接乘-1转回正值的操作是符合框架设计逻辑的,结果和真实MAE完全一致。

2. 代码实现的优化建议

你的基础逻辑符合要求,但有两处可以调整:

  • 你初始化的KFold实例默认未开启随机打乱,如果数据集本身是按标签/特征顺序排列的,会导致交叉验证的子集分布不均,建议添加shuffle=True和随机种子参数,保证结果可复现。
  • 常规模型评估流程中,测试集作为最终的留存集,不需要做交叉验证。如果练习要求必须对测试集拆分做交叉验证可以保留现有逻辑,否则更推荐的做法是:用训练集做交叉验证得到训练侧的泛化表现,再用全量训练集拟合模型,直接在测试集上做一次预测计算MAE即可。

优化后参考代码

import numpy as np
from sklearn.model_selection import train_test_split, KFold, cross_val_score
from sklearn import linear_model
from sklearn.metrics import mean_absolute_error

# 特征与标签拆分
x = df.drop(columns='target', axis=1)
y = df.target

# 全量数据集拆分训练集、测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=42)

# 初始化10折交叉验证,开启随机打乱保证分布均匀
cv = KFold(n_splits=10, shuffle=True, random_state=42)

model = linear_model.Lasso(alpha=0.42)

# 训练集10折交叉验证MAE
scores_train = np.abs(cross_val_score(model, x_train, y_train, cv=cv, scoring='neg_mean_absolute_error'))
print("训练集每折交叉验证MAE:", scores_train)
print("训练集交叉验证平均MAE:", scores_train.mean())

# 全量训练集拟合模型,计算测试集MAE
model.fit(x_train, y_train)
y_pred_test = model.predict(x_test)
test_mae = mean_absolute_error(y_test, y_pred_test)
print("测试集MAE:", test_mae)

内容的提问来源于stack exchange,提问作者jdomeneghini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 09:54:03