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=1−SSE/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)。