单x对应多真实y值的多项式回归R²分数计算及报错排查
嘿,这个问题我之前做实验数据分析时也碰到过,咱们一步步捋清楚~
为啥会报这个错?
首先得明确:sklearn的r2_score(y_true, y_pred)有个硬性要求——两个输入的样本数量必须完全一致,每一个真实值都得对应一个预测值。你现在的情况是,有13个独特的x点(对应13个预测值y_pred),但每个x下有多个真实观测值y_true,加起来总共48个,两者数量不匹配,自然就抛出了样本数不一致的错误。
你的拟合思路错了吗?
完全没问题!单个x对应多个y是非常常见的场景(比如同一实验参数下做了多次重复测量,得到多个数据点),这种情况下做多项式回归是完全合理的,只是计算R²的方式不能直接用默认的方法,得做一点调整。
正确计算R²的两种实用方法
下面给你两种可行的方案,附代码示例,你可以根据自己的需求选:
方法1:先对每个x的真实值求均值,再算R²
这种方法适合你想评估模型对「x对应的真实均值」的拟合效果,毕竟同一x下的多个y可能是带噪声的重复测量,均值更能代表真实趋势。
import numpy as np from sklearn.metrics import r2_score # 模拟你的数据结构(替换成你自己的数据即可) x = np.array([1,1,1,2,2,3,3,3,3]) # 9个真实值,3个独特x y_true = np.array([5,6,7,8,9,10,11,12,13]) y_pred = np.array([6,8.5,11.5]) # 3个独特x对应的预测值 # 步骤1:按x分组,计算每个x对应的y_true均值 unique_x, indices = np.unique(x, return_inverse=True) y_true_mean = np.bincount(indices, weights=y_true) / np.bincount(indices) # 步骤2:计算R² r2_mean = r2_score(y_true_mean, y_pred) print(f"基于均值的R²分数:{r2_mean:.4f}")
方法2:把预测值重复到和真实值同长度,再算R²
如果你想评估模型对所有原始数据点的整体拟合程度(包括重复测量的噪声),可以把每个x对应的预测值重复,和该x下的所有真实值一一对应,这样两者数量就一致了。
# 沿用上面的变量 # 步骤1:扩展y_pred到和y_true相同长度 y_pred_expanded = y_pred[indices] # 步骤2:计算R² r2_full = r2_score(y_true, y_pred_expanded) print(f"基于全数据点的R²分数:{r2_full:.4f}")
怎么选这两种方法?
- 要是你更关注模型对趋势的拟合准确度(比如实验的真实效应),选方法1;
- 要是你想衡量模型对所有观测数据的适配程度(包括随机噪声),选方法2。
内容的提问来源于stack exchange,提问作者doyz
相关产品推荐
相关产品推荐

