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

如何实现计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:15:37