我在多篇文章中读到 R 平方总是随着特征的数量而增加,即使一个特征可能没有任何意义。
R平方的公式是
如果分母是常数,这意味着 R 平方只依赖于分子,所以基本上.
现在,如果我有一个真的不重要的新功能,那么该功能的 beta 系数不应该为零吗?如果它真的为零,它将如何真正影响 R 平方?
我在多篇文章中读到 R 平方总是随着特征的数量而增加,即使一个特征可能没有任何意义。
R平方的公式是
如果分母是常数,这意味着 R 平方只依赖于分子,所以基本上.
现在,如果我有一个真的不重要的新功能,那么该功能的 beta 系数不应该为零吗?如果它真的为零,它将如何真正影响 R 平方?
线性回归无法知道特征是否有意义。它将找到产生最小平方误差的β。即使数据只是噪音,这通常也不会为零。更多特征,无论重要性如何,都提供了更多描述目标变量的方式并获得了更低的误差。
这是一个示例,即使所有功能根本没有意义,您也可以看到这是正确的:
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
import numpy as np
import matplotlib.pyplot as plt
# generate data that is just noise
X = np.random.randn(100, 100)
y = np.random.randn(100, 1)
r2_scores = []
# fit 1-100 features on noise and calc r2
for i in range(1, X.shape[1]+1):
x = X[:,-i:]
lr = LinearRegression()
lr.fit(x.reshape(100, -1), y)
coef_sum = lr.coef_.sum()
r2 = r2_score(y, lr.predict(x.reshape(100, -1)))
coefs.append(lr.coef_)
r2_scores.append(r2)
plt.plot(r2_scores)
plt.xlabel('Number of features')
plt.ylabel('r2 score')
这会给你类似的东西:
您要避免的是包含一些功能,虽然它们在技术上确实改善了您的样本数据的结果,但它们不能很好地推广到其他保留集。当您说“如果我有一个真正不重要的新功能,那么该功能的 beta 系数应该为零” - 您是正确的,在这种情况下它不会对 R 平方产生影响。如果您包含一个不重要的特征并且系数不为零(这意味着由于一些随机噪声而不是底层的真实模式,它对样本数据很重要),那么 R 平方会增加,并且看起来您有一个更好的模型 - 但实际上你倾向于过度拟合并且你有一个不太健壮的模型。
您的文章提出的这一点指出了 R 平方评估标准的局限性:如果您添加更多的自由度(在这种情况下为输入变量),您的分数可能只会上升(也许不应该)。
另一方面,F 检验认识到 R 平方的这种限制,并通过添加一个自由度项来惩罚分数。因此,如果您仅通过添加新项看到 R 平方的边际收益,那么通过简单添加项(自由度上升)将受到更多惩罚。请参阅以下 statquest 以获得很好的解释(在视频结尾处进行 F 测试):https ://www.youtube.com/watch?v=nk2CQITm_eo&ab_channel=StatQuestwithJoshStarmer