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
相关产品推荐
相关产品推荐

