回归类的模型评估指标R2

本文探讨了机器学习中R2评分可能出现负值的情况,通过数学推导和例子解释了当模型预测效果比平均值还差时,R2得分可以为负,并指出负的R2意味着模型对数据的拟合非常糟糕。建议在遇到负R2时,首先检查建模和数据处理过程,然后考虑尝试其他算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来看一组代码:

import numpy as np
rng = np.random.RandomState(42)
X = rng.randn(100, 80)
y = rng.randn(100)
cross_val_score(LR(), X, y, cv=5, scoring='r2')

运行结果

array([-179.12952605,   -5.692624  ,  -15.61747513,  -78.68042858,
        -59.5311006 ])

sklearn真的是设置了太多障碍,均方误差是负的,R2也是负的,这个名字里都带平方了,居然是负的,无论如何,再来看看的计算公式:
R2=1−∑i=0m(yi−y^i)2∑i=0m(yi−yˉi)2=1−RSS∑i=0m(yi−yˉi)2R^2=1-\large{\frac{\sum_{i=0}^m(y_i-\hat{y}_i)^2}{\sum_{i=0}^m(y_i-\bar{y}_i)^2}}\small=1-\large{\frac{RSS}{\sum_{i=0}^m(y_i-\bar{y}_i)^2}}R2=1i=0m(yiyˉi)2i=0m(yiy^i)2=1i=0m(yiyˉi)2RSS
第一次学习机器器学习或者统计学的,可能会感觉没什么问题了, 是1减一个数,后面的部分只要大于1的话完全可以小于0。但是学过机器器学习,尤其是在统计学上有基础的可能会坐不住了:这不对啊!
一直以来,众多的机器学习教材中都有这样的解读:除了RSS之外,还有平方和ESS(Explained Sum of Squares,也叫做SSR回归平方和)以及总离差平方和TSS(Total Sum of Squares,也叫做SST总离差平方和)。
平方和ESS定义了预测值和样本均值之间的差异,而总离差平方和定义了真实值和样本均值之间的差异(就是R2中的分母),两个指标分别写作:
TSS=∑i=0m(yi−yˉi)2TSS=\sum_{i=0}^m(y_i-\bar{y}_i)^2TSS=i=0m(yiyˉi)2
ESS=∑i=0m(y^i−yˉi)2ESS=\sum_{i=0}^m(\hat{y}_i-\bar{y}_i)^2ESS=i=0m(y^

### 关于回归模型中 R² 指标的定义、计算方法及其含义 #### 定义 R² 是一种用于衡量回归模型拟合优度的统计量,其全称为决定系数(Coefficient of Determination)。它表示因变量的总变异中有多少比例能够通过自变量的变化来解释。换句话说,R² 反映了模型对数据的解释能力。 #### 计算方法 R² 的计算基于两个主要部分:残差平方和(RSS, Residual Sum of Squares)以及总平方和(TSS, Total Sum of Squares)。具体公式如下: \[ R^2 = 1 - \frac{RSS}{TSS} \] 其中, - \( RSS = \sum_{i=1}^{n}(y_i - \hat{y}_i)^2 \),即预测值与实际值之间的差异平方和[^2]; - \( TSS = \sum_{i=1}^{n}(y_i - \bar{y})^2 \),即实际值与其平均值之间的差异平方和[^3]。 当模型完全无法解释任何变化时,\( RSS = TSS \),此时 \( R^2 = 0 \);而当模型完美拟合数据时,\( RSS = 0 \),则 \( R^2 = 1 \)[^1]。 #### 含义 R² 值介于 0 和 1 之间,数值越大表明模型对数据的解释能力越强。如果 R² 接近 1,则说明大部分因变量的变异性都可以由自变量解释;反之,若 R² 较低,则意味着模型未能很好地捕捉到数据中的模式或关系[^1]。 需要注意的是,尽管高 R² 表明良好的拟合效果,但它并不能单独作为判断模型质量的标准。过高的 R² 可能暗示过度拟合现象的存在,在这种情况下,虽然训练集上的表现很好,但在测试集上可能泛化性能较差。 以下是 Python 中实现 R² 计算的一个简单例子: ```python from sklearn.metrics import r2_score # 实际值 y_true = [3, -0.5, 2, 7] # 预测值 y_pred = [2.5, 0.0, 2, 8] r_squared = r2_score(y_true, y_pred) print(f'R-squared value: {r_squared}') ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值