如何正确理解并解读非线性回归中的负R²分数
技术百科
碧海醫心
发布时间:2026-01-18
浏览: 次 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 或分段函数);
- 对比线性基线(如 Lin
earRegression)的 R²,确认非线性是否真有增益;
- 可视化残差图(y_data_norm - y_pred_fitted vs x_data_norm),识别系统性偏差模式。
总之,R² 为负不是 sklearn 的异常,而是模型失效的明确信号。它敦促我们回归数据本质——检验假设、迭代函数形式、验证预测一致性,而非机械套用指标。
# 的是
# 才是
# 您的
# 但在
# 更大
# 最优
# red
# 您对
# 真有
# 平方和
# 均值
# 线性回归
# sklearn
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win10怎样卸载iTunes_Win10卸载iT
- 零基础学会Python自动化办公_高效处理Exce
- Windows 11登录时提示“用户配置文件服务登
- c++中如何使用std::variant_c++1
- PHP主流架构怎么部署到Docker_容器化流程【
- PythonPandas数据分析项目教程_时间序列
- Windows10电脑怎么设置电源按钮_Win10
- 如何在Golang中验证模块完整性_Golangg
- c# Task.ConfigureAwait(tr
- Flask 表单数据通过 SMTP 发送邮件的完整
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- Win11怎么设置DNS服务器_Windows11
- Win11怎么设置虚拟桌面 Win11新建多桌面切
- 如何在Golang中操作嵌套切片指针_Golang
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- Windows笔记本无法进入睡眠模式怎么办?(电源
- mac本地php环境如何开启curl_curl扩展
- 电脑无法识别U盘怎么办 Windows磁盘管理与驱
- 短链接怎么自定义还原php_修改解码规则适配需求【
- Windows10如何更改系统字体大小_Win10
- Windows如何拦截2345弹窗广告_Windo
- php在Linux怎么部署_LNMP环境搭建PHP
- Windows10如何查看保存的WiFi密码_Wi
- 如何使用Golang实现路由参数绑定_使用Mux和
- C++中的std::shared_from_thi
- php下载安装选zip还是msi格式_两种安装包对
- Python迭代器生成器进阶教程_节省内存与懒加载
- Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱
- 如何在Golang中写入XML文件_生成符合规范的
- 电脑的“网络和共享中心”去哪了_Windows 1
- MAC怎么解压RAR格式文件_MAC第三方解压工具
- 如何使用Golang实现文件加密_Golang c
- php本地部署后session无法保存_sessi
- Windows10如何更改鼠标图标_Win10鼠标
- Mac如何调整Dock栏大小和位置_Mac程序坞个
- Win11怎么设置默认邮件客户端 Win11修改M
- PHP的Workerman对架构扩展有啥帮助_应用
- 如何在Golang中处理二进制数据_Golang
- php485能和物联网模块通信吗_php485对接
- Win11怎么关闭资讯和兴趣_Windows11任
- MySQL 中使用 IF 和 CASE 实现查询字
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- 如何高效删除 NumPy 二维数组中所有元素相同的
- Windows执行文件被SmartScreen拦截
- c# Task.Yield 的作用是什么 它和Ta
- 如何在 Go 中创建包含映射(map)的切片(sl
- Win11怎么关闭触摸键盘图标_Windows11
- Python列表推导式与字典推导式教程_简化代码高
- c++ std::atomic如何保证原子性 c+
- Win11怎么开启远程桌面连接_Windows11


QQ客服