
r²分数并非总在0–1之间;当模型拟合效果比简单用均值预测更差时,r²会为负值——这表明当前非线性函数形式或参数初值严重偏离数据规律。
在使用 sklearn.metrics.r2_score 评估非线性回归模型(如您对 kc_house_data 构建的指数型函数)时,出现负值(如 -59.51)并非报错,而是模型性能的客观警示。R² 的数学定义为:
[ R^2 = 1 - \frac{\sum_i (y_i - \hat{y}_i)^2}{\sum_i (y_i - \bar{y})^2} ]
其中分母是“基准误差”(用目标变量均值 $\bar{y}$ 预测的残差平方和),分子是模型预测残差平方和。只有当分子 0;若模型预测比直接输出均值还差(即残差更大),则 R²
在您的代码中,问题根源在于:
函数形式与数据不匹配:
您定义的 log(a, Beta_1, Beta_2, Beta_3) = Beta_1 * (Beta_2^a) + Beta_3 是严格单调指数增长函数,但房价与归一化“combined”特征之间通常存在复杂非线性关系(如饱和、局部极值、异方差),强行用单指数拟合极易产生系统性偏差。未使用拟合后的最优参数进行预测:
您调用 curve_fit 得到了最优参数 popt,但在计算 R² 前却用初始猜测值(beta_1=1, beta_2=1.5, beta_3=0.1)生成了 y_pred,而最终 r2_score 中的 y 实际是用 *popt 在新 x 上预测的拟合曲线(且 x 范围 [4,12] 与原始 x_data_norm 不一致)。这导致 y_data_norm 和 y 完全不对应,R² 失去可比性。
✅ 正确做法应为:
# 确保预测值与真实值维度、顺序严格一致
y_pred_fitted = log(x_data_norm, *popt) # 使用拟合参数,在原始x上预测
r2 = r2_score(y_data_norm, y_pred_fitted)
print(f"Correct R²-score: {r2:.4f}") # 才是模型真实解释力⚠️ 更关键的是:负 R² 提示需重新审视建模策略:
- 检查特征工程是否合理(如 "combined" 是简单线性叠加,可能掩盖交互效应);
- 尝试更稳健的非线性模型(如梯度提升树 XGBRegressor、核岭回归 KernelRidge 或分段函数);
- 对比线性基线(如 LinearRegression)的 R²,确认非线性是否真有增益;
- 可视化残差图(y_data_norm - y_pred_fitted vs x_data_norm),识别系统性偏差模式。
总之,R² 为负不是 sklearn 的异常,而是模型失效的明确信号。它敦促我们回归数据本质——检验假设、迭代函数形式、验证预测一致性,而非机械套用指标。










