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

使用sklearn.metrics.mean_squared_error计算DataFrame逐行均方误差(MSE)的异常问题咨询

嗨,我明白你的困惑了!问题出在sklearn.metrics.mean_squared_error的设计逻辑上——它的作用是计算整个数据集的平均均方误差,而不是逐行返回每个对应元素的平方误差结果。

为什么你的代码只返回一个值?

当你传入两个单列DataFrame时,mean_squared_error会先计算所有对应位置元素的平方误差(即(真实值-预测值)²),然后对这些值取平均值,最终返回一个标量(单个数值),而不是像逐行相乘那样保留每行的运算结果。

如何得到逐行的对应元素误差结果?

你想要的其实是每个对应行元素的平方误差(因为单个样本的MSE本质就是该样本的平方误差,没有平均步骤),直接用Pandas的元素级运算就能实现,和你熟悉的逐行相乘逻辑完全一致:

# 计算逐行的平方误差(也就是你期望的"逐行MSE"结果)
row_wise_mse = (train_df_test.iloc[:, :1] - ideal_df_test.iloc[:, :1]) ** 2

举个直观的示例帮你理解:

import pandas as pd
from sklearn.metrics import mean_squared_error

# 构造测试数据
train_df_test = pd.DataFrame({'y1': [10, 20]}, index=[-20.00, -19.99])
ideal_df_test = pd.DataFrame({'y1': [12, 18]}, index=[-20.00, -19.99])

# 你的原代码:返回整体平均MSE
overall_mse = mean_squared_error(train_df_test.iloc[:, :1], ideal_df_test.iloc[:, :1])
print(overall_mse)  # 输出:4.0(计算逻辑:((10-12)² + (20-18)²)/2 = (4+4)/2)

# 逐行计算的结果(符合你的预期)
row_wise_mse = (train_df_test.iloc[:, :1] - ideal_df_test.iloc[:, :1]) ** 2
print(row_wise_mse)
# 输出:
#           y1
# -20.00     4
# -19.99     4

简单来说,sklearn的mean_squared_error是用来评估整体模型性能的指标函数,而不是做逐元素运算的工具。如果需要逐行的对应误差,直接用Pandas的基础元素运算就可以啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:22:40