Ridge与RandomForest模型MSE/RMSE/MAE指标完全相同问题排查
问题描述
做回归预测任务时发现,其余对比模型的MSE、RMSE、MAE三项评估指标结果均存在差异,唯独Ridge模型与RandomForest模型的三项指标得分完全一致,相关实现代码与结果如下:
def metrics(valid, pred): mse = mean_squared_error(valid, pred) rmse = np.sqrt(mean_squared_error(valid, pred)) mae = mean_absolute_error(valid,pred) return mse, rmse, made model = Ridge().fit(X_train, y_train) y_pred = model.predict(X_test) df_models_temp = pd.DataFrame(data=[['Ridge', *metrics(y_test, y_pred)]], columns=['Model Name', 'MSE', 'RMSE', 'MAE']) df_models = df_models.append(df_models_temp, ignore_index=True) clf = RandomForestRegressor().fit(X_train, y_train) y_pred = model.predict(X_test) df_models_temp = pd.DataFrame(data=[['Random Forest', *metrics(y_test, y_pred)]], columns=['Model Name', 'MSE', 'RMSE', 'MAE']) df_models = df_models.append(df_models_temp, ignore_index=True)

问题原因
代码存在两处错误,直接导致两个模型指标完全一致:
- 训练完随机森林模型后,生成预测结果时错误调用了之前训练Ridge保存的
model对象,没有使用刚训练完成的随机森林实例clf,两次评估用的是完全相同的Ridge预测结果,指标自然完全相等。对应错误代码行为y_pred = model.predict(X_test),此处需要改为调用clf的预测方法。 - 自定义指标计算函数
metrics存在拼写错误:定义的平均绝对误差变量名为mae,返回时错写为made,代码运行时会直接触发变量不存在的报错,属于笔误。
修正后代码
import numpy as np import pandas as pd from sklearn.linear_model import Ridge from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error, mean_absolute_error def metrics(valid, pred): mse = mean_squared_error(valid, pred) rmse = np.sqrt(mse) mae = mean_absolute_error(valid, pred) return mse, rmse, mae # Ridge模型训练评估 model = Ridge().fit(X_train, y_train) y_pred = model.predict(X_test) df_models_temp = pd.DataFrame( data=[['Ridge', *metrics(y_test, y_pred)]], columns=['Model Name', 'MSE', 'RMSE', 'MAE'] ) df_models = pd.concat([df_models, df_models_temp], ignore_index=True) # 随机森林模型训练评估 clf = RandomForestRegressor().fit(X_train, y_train) # 核心修正:调用随机森林实例生成预测结果,不要复用Ridge的model对象 y_pred = clf.predict(X_test) df_models_temp = pd.DataFrame( data=[['Random Forest', *metrics(y_test, y_pred)]], columns=['Model Name', 'MSE', 'RMSE', 'MAE'] ) df_models = pd.concat([df_models, df_models_temp], ignore_index=True)
补充说明:Pandas 2.0及以上版本已经移除了
DataFrame.append()方法,替换为pd.concat()做数据拼接,可以避免版本兼容问题。
内容的提问来源于stack exchange,提问作者Ruslan Pylypyuk
相关产品推荐
相关产品推荐

