如何实现计算y_true与多个y_pred的RMSE(仅用有效数据行)
问题描述
现有如下DataFrame df:
date y_true y_pred1 y_pred2 0 2017/1/31 NaN 15.57 NaN 1 2017/2/28 -2.35 15.57 6.64 2 2017/3/31 15.57 6.64 7.61 3 2017/4/30 6.64 7.61 10.28 4 2017/5/31 NaN 7.61 6.34 5 2017/6/30 10.28 6.34 4.88 6 2017/7/31 6.34 4.88 7.91 7 2017/8/31 6.34 7.91 6.26 8 2017/9/30 7.91 6.26 11.51 9 2017/10/31 6.26 11.51 10.73 10 2017/11/30 11.51 10.73 10.65 11 2017/12/31 NaN 32.05 NaN
需要编写函数one_to_multi_rmse,分别计算y_pred1、y_pred2与y_true的RMSE,要求仅在y_true和对应y_pred均为有效值的行上计算,且函数可一次性返回多个RMSE值。现有代码框架如下:
from sklearn.metrics import mean_squared_error def one_to_multi_rmse(y_true, y_pred): rms = mean_squared_error(y_true, y_pred, squared=False) ... return dir_acc_ratio one_to_multi_rmse(df['y_true'], df[['y_pred1','y_pred2']])
期望输出格式示例:
[0.76, 0.82] # 示例数据,仅展示格式
解决方案
直接修改函数实现,通过过滤有效数据、逐列计算RMSE来满足需求,完整代码如下:
from sklearn.metrics import mean_squared_error def one_to_multi_rmse(y_true, y_pred): rmse_list = [] # 遍历每个预测列 for pred_col in y_pred.columns: # 筛选出y_true和当前预测列都不为空的行 valid_mask = y_true.notna() & y_pred[pred_col].notna() # 提取有效数据 true_vals = y_true[valid_mask] pred_vals = y_pred[pred_col][valid_mask] # 计算RMSE并加入结果列表 rmse = mean_squared_error(true_vals, pred_vals, squared=False) rmse_list.append(rmse) return rmse_list # 调用函数 result = one_to_multi_rmse(df['y_true'], df[['y_pred1','y_pred2']]) print(result)
核心逻辑说明
- 用
notna()判断数据有效性,通过&得到同时满足y_true和对应预测列非空的掩码; - 对每个预测列单独处理,只使用有效数据计算RMSE;
- 最终返回包含所有RMSE值的列表,完全匹配期望输出格式。
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

