【机器学习】12. 线性回归 Residual 残差系数 R方

Sum of Squares Total (SST)
单个数据点(观测值)于响应变量的均值差的平方和。

Sum of Squares Regression (SSR)
预测值ŷi与响应变量均值差的平方和。

Sum of Squares Error (SSE)
预测值ŷi与观测值差的平方和。

R 2 = 1 − S S E / S S T = S S R / S S T R^2 = 1 - SSE/SST = SSR / SST R2=1SSE/SST=SSR/SST

SST = SSE + SSR

SSE = 0 -> R2 = 1 模型是好的

SSE = SST -> R2 = 0 预测值等于平均值,这个模型完全没用,直接算平均值好了

SSE > SST -> R2 < 0 预测值还不如平均值

这里的R方,有个比较有趣的结论,是本人在调用sklearn后R方为负数情况下思考的。R方在实际应用中,确实可能小于0,但是在数学和统计学的角度来说,SSE是不会大于SST的。

SSE ≤ SST , because a model can‘t introduce more variation than originally present in the data.
回归模型至少与均值模型一样好:在使用回归模型时,模型会尝试找到一条最佳拟合的直线或曲线,以尽量减少观测值和预测值之间的差异(SSE)。一个合理的回归模型应该至少比均值模型更好,或与其相当。
最差的情况是模型根本没有任何解释能力,此时
SSE=SST,即模型和均值模型一样糟糕。
但通常情况下,回归模型至少可以解释部分变异性,因此 SSE ≤ SST。

为什么 SSE > SST 不可能发生:
总变异 (SST) 包括了所有观测值相对于均值的偏差,而 残差平方和 (SSE) 是模型预测值与观测值之间的误差。因此,SST 是“总的变异”,而 SSE 是“模型无法解释的那部分变异”。最糟糕的情况是模型完全无法解释数据中的变异性,这时候 SSE = SST。

如果出现 SSE > SST 的情况,意味着模型拟合的误差比直接用均值预测的误差还要大,这不仅没有减少误差,反而引入了更多的误差,违背了模型拟合的基本目标。

R方为负数的案例

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

# Set random seed for reproducibility
np.random.seed(42)

# Generate random data for original X
X = np.random.rand(100, 1)  # 100个样本的特征

# Generate y values that are independent of X
y = np.random.rand(100) * 1000 + 5000  # 随机生成 y 值,范围大

# Fit a linear regression model
model = LinearRegression()
model.fit(X, y)

# Generate a new set of X values that are independent from the original
X_new = np.random.rand(100, 1) * 100  # 新生成的 X 值,范围为 0-100

# Make predictions using the new X values
y_pred = model.predict(X_new)

# Calculate R²
r2 = r2_score(y, y_pred)
print(f"R²: {r2}")


但是,在实战中,确实会有R方<0的情况。
为什么会得到负的 R² 值

  • 完全独立的 y 值:y 是随机生成的,与 X 完全无关。这意味着无论如何拟合模型,模型都无法捕捉到 y 中的任何变异。

  • 新 X 值的引入:通过使用一个与原始 X 完全独立的新 X 值进行预测,模型预测的输出与实际 y 值之间的差异会显著增加。这导致模型预测效果变得很糟糕。

  • 残差平方和 (SS_res):由于 y 的随机性,模型的预测值(即 y_pred)与实际 y 值之间的差异会很大,导致残差平方和 (SS_res) 变得很高。

  • 结果:因为 SS_res 相对于 SS_tot 的值非常高,导致 R² 计算结果小于 0。负的 R² 值表明模型的表现甚至比简单使用均值来预测更糟糕(即 SS_res 大于 SS_tot)。

在Scikit-learn中,线性回归模型并不直接提供残差分析的功能,但我们可以通过一些法来进行线性回归模型的残差分析。以下是使用Scikit-learn进行线性回归残差分析的一般步骤: 1. 导入必要的库和模块: ```pythonimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegression``` 2. 准备数据: 假设我们有自变量X和因变量y,可以使用Numpy库生成随机数据进行演示: ```python#生成随机数据np.random.seed(0) X = np.random.rand(100,1) y =2 +3 * X + np.random.randn(100,1) ``` 3. 拟合线性回归模型: ```python# 创建线性回归模型对象model = LinearRegression() # 拟合模型model.fit(X, y) ``` 4. 计算残差: ```python# 预测y_pred = model.predict(X) # 计算残差residuals = y - y_pred``` 5. 进行残差分析: ```python# 绘制残差图plt.scatter(y_pred, residuals) plt.xlabel('Predicted values') plt.ylabel('Residuals') plt.axhline(0, color='red', linestyle='--') plt.title('Residual Plot') plt.show() ``` 在残差图中,我们希望看到残差分布在0附近,且没有明显的模式或趋势。 此外,你还可以使用其他法来进行进一步的残差分析,如绘制残差的直图、Q-Q图来检查残差的正态性,或者进行统计检验来评估残差的同差性和独立性。 请注意,Scikit-learn是一个机器学习库,主要用于建模和预测任务。如果需要更详细的统计分析和残差诊断,建议使用专门的统计分析库,如statsmodels。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值