Kaggle房价数据集非线性回归r2_score为负的原因咨询
问题:非线性回归R²得分为负数的原因分析
我用Kaggle的kc_house_data数据集做分析,构建了非线性回归模型,用sklearn.metrics的r2_score评估时得到-59.51的结果,正常R²应该在0到1之间,想知道原因。
实现代码
df["combined"] = bedrooms_norm + bathrooms_norm + sqftliving_norm + sqftabove_norm + long_norm + lat_norm + sqftliving15_norm +yrbuilt_norm + grade_norm + floors_norm + sqftbasement_norm+condition_norm cdf = df[["combined", "price"]] def log(a, Beta_1, Beta_2, Beta_3): y = (Beta_1 * (np.power(Beta_2, a)) + Beta_3) return y beta_3 = 0.10 beta_2 = 1.5 beta_1 = 1 x_data, y_data = (df["combined"].values, df["price"].values) x_data_norm = x_data / max(x_data) y_data_norm = y_data / max(y_data) y_pred = log(x_data_norm, beta_1, beta_2, beta_3) from scipy.optimize import curve_fit popt, pcov = curve_fit(log, x_data_norm, y_data_norm) x = np.linspace(4, 12, 21613) x = x / max(x) plt.figure(figsize=(8,5)) y = log(x, *popt) plt.plot(x_data_norm, y_data_norm, 'ro', label='data') plt.plot(x, y, linewidth=3.0, label='fit') plt.legend(loc='best') plt.ylabel('price') plt.xlabel('combined') plt.show() from sklearn.metrics import r2_score print("R2-score: %.2f" % r2_score(y_data_norm , y))
运行结果
R2-score: -59.51
原因分析
R²为负的核心问题是预测值和真实值的对应关系完全错位,具体拆解:
计算R²时用错了预测数据
你用np.linspace(4,12,21613)生成了一套全新的x序列,基于这个x算出的拟合曲线y,和原始数据的y_data_norm(对应原始的x_data_norm)完全不匹配——相当于拿一条拟合线的点去和原始散点硬凑,结果必然偏离到离谱。模型拟合环节的其他问题
- 你定义的
log函数实际是指数形式(Beta_1 * Beta_2^a + Beta_3),和函数名的“log”无关,模型形式可能完全不符合房价数据的分布规律; - 手动初始化的beta值可能离最优解太远,导致
curve_fit拟合失败,得到的popt参数根本无法贴合数据; - 把多个归一化特征直接相加得到
combined,这种简单拼接会丢失特征间的交互信息,也会让模型难以捕捉有效规律。
- 你定义的
修复步骤
修正R²计算的对应关系
用原始的x_data_norm代入拟合后的模型生成预测值,再和y_data_norm对比:# 替换原来的y和r2计算代码 y_pred = log(x_data_norm, *popt) print("R2-score: %.2f" % r2_score(y_data_norm, y_pred))优化模型与特征
- 验证模型形式:如果坚持用非线性模型,先通过可视化确认数据是否符合你定义的指数形式,或者换用更适配房价数据的模型(比如对数变换后的线性回归、多项式回归);
- 改进特征处理:不要直接相加特征,考虑保留多特征输入(非线性模型也支持多特征),或者尝试特征交叉、PCA降维等方式组合特征。
内容的提问来源于stack exchange,提问作者fateme
相关产品推荐
相关产品推荐

