我刚刚开始使用机器学习,我无法理解线性回归模型中过度拟合是如何发生的。
考虑到我们只使用 2 个特征变量来训练模型,平面如何可能过度拟合到一组数据点?
我假设线性回归仅使用一条线来描述 2 个变量之间的线性关系和一个平面来描述 3 个变量之间的关系,我很难理解(或者更确切地说是想象)如何在一条线或一个平面上发生过度拟合?
我刚刚开始使用机器学习,我无法理解线性回归模型中过度拟合是如何发生的。
考虑到我们只使用 2 个特征变量来训练模型,平面如何可能过度拟合到一组数据点?
我假设线性回归仅使用一条线来描述 2 个变量之间的线性关系和一个平面来描述 3 个变量之间的关系,我很难理解(或者更确切地说是想象)如何在一条线或一个平面上发生过度拟合?
在线性回归中,当模型“太复杂”时会发生过拟合。这通常发生在与观察数量相比有大量参数的情况下。这样的模型不能很好地推广到新数据。也就是说,它将在训练数据上表现良好,但在测试数据上表现不佳。
一个简单的模拟可以证明这一点。这里我使用 R:
> set.seed(2)
> N <- 4
> X <- 1:N
> Y <- X + rnorm(N, 0, 1)
>
> (m0 <- lm(Y ~ X)) %>% summary()
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.2393 1.8568 -0.129 0.909
X 1.0703 0.6780 1.579 0.255
Residual standard error: 1.516 on 2 degrees of freedom
Multiple R-squared: 0.5548, Adjusted R-squared: 0.3321
F-statistic: 2.492 on 1 and 2 DF, p-value: 0.2552
请注意,我们获得了对 X 系数真实值的良好估计。注意调整后的 R 平方为 0.3321,这是模型拟合的指示。
现在我们拟合一个二次模型:
> (m1 <- lm(Y ~ X + I(X^2) )) %>% summary()
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -4.9893 2.7654 -1.804 0.322
X 5.8202 2.5228 2.307 0.260
I(X^2) -0.9500 0.4967 -1.913 0.307
Residual standard error: 0.9934 on 1 degrees of freedom
Multiple R-squared: 0.9044, Adjusted R-squared: 0.7133
F-statistic: 4.731 on 2 and 1 DF, p-value: 0.3092
现在我们有一个更高的调整 R 平方:0.7133,这可能会让我们认为模型要好得多。事实上,如果我们绘制两个模型的数据和预测值,我们会得到:
> fun.linear <- function(x) { coef(m0)[1] + coef(m0)[2] * x }
> fun.quadratic <- function(x) { coef(m1)[1] + coef(m1)[2] * x + coef(m1)[3] * x^2}
>
> ggplot(data.frame(X,Y), aes(y = Y, x = X)) + geom_point() + stat_function(fun = fun.linear) + stat_function(fun = fun.quadratic)
所以从表面上看,二次模型看起来要好得多。
现在,如果我们模拟新数据,但使用相同的模型来绘制预测,我们得到
> set.seed(6)
> N <- 4
> X <- 1:N
> Y <- X + rnorm(N, 0, 1)
> ggplot(data.frame(X,Y), aes(y = Y, x = X)) + geom_point() + stat_function(fun = fun.linear) + stat_function(fun = fun.quadratic)
显然二次模型做得不好,而线性模型仍然是合理的。但是,如果我们使用原始种子模拟更多具有扩展范围的数据,以便初始数据点与第一次模拟中的相同,我们会发现:
> set.seed(2)
> N <- 10
> X <- 1:N
> Y <- X + rnorm(N, 0, 1)
> ggplot(data.frame(X,Y), aes(y = Y, x = X)) + geom_point() + stat_function(fun = fun.linear) + stat_function(fun = fun.quadratic)
显然线性模型仍然表现良好,但二次模型在原始范围之外是没有希望的。这是因为当我们拟合模型时,与观察次数 (4) 相比,我们的参数 (3) 太多。
编辑:为了解决这个答案的评论中的查询,关于一个不包含高阶术语的模型。
情况是一样的:如果参数的数量接近观测值的数量,模型就会过拟合。在没有高阶项的情况下,当模型中的变量/特征的数量接近观测值的数量时,就会发生这种情况。
同样,我们可以通过模拟轻松地证明这一点:
在这里,我们模拟来自正态分布的随机数据数据,这样我们有 7 个观察值和 5 个变量/特征:
> set.seed(1)
> n.var <- 5
> n.obs <- 7
>
> dt <- as.data.frame(matrix(rnorm(n.var * n.obs), ncol = n.var))
> dt$Y <- rnorm(nrow(dt))
>
> lm(Y ~ . , dt) %>% summary()
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.6607 0.2337 -2.827 0.216
V1 0.6999 0.1562 4.481 0.140
V2 -0.4751 0.3068 -1.549 0.365
V3 1.2683 0.3423 3.705 0.168
V4 0.3070 0.2823 1.087 0.473
V5 1.2154 0.3687 3.297 0.187
Residual standard error: 0.2227 on 1 degrees of freedom
Multiple R-squared: 0.9771, Adjusted R-squared: 0.8627
我们获得了 0.86 的调整后 R 平方,这表明模型拟合良好。在纯随机数据上。模型严重过拟合。相比之下,如果我们将观察次数加倍至 14:
> set.seed(1)
> n.var <- 5
> n.obs <- 14
> dt <- as.data.frame(matrix(rnorm(n.var * n.obs), ncol = n.var))
> dt$Y <- rnorm(nrow(dt))
> lm(Y ~ . , dt) %>% summary()
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.10391 0.23512 -0.442 0.6702
V1 -0.62357 0.32421 -1.923 0.0906 .
V2 0.39835 0.27693 1.438 0.1883
V3 -0.02789 0.31347 -0.089 0.9313
V4 -0.30869 0.30628 -1.008 0.3430
V5 -0.38959 0.20767 -1.876 0.0975 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.7376 on 8 degrees of freedom
Multiple R-squared: 0.4074, Adjusted R-squared: 0.03707
F-statistic: 1.1 on 5 and 8 DF, p-value: 0.4296
..调整后的 R 平方下降至仅 0.037
当模型在训练数据上表现良好但在测试数据上表现不佳时,就会发生过度拟合。这是因为线性回归模型的最佳拟合线不是广义的。这可能是由于各种因素造成的。一些共同的因素是
因此,在构建模型之前,请确保您已经检查了这些因素以获得通用模型。
一般来说,当您想从有限数量的实际证据数据点中确定相当大量的参数时,过度拟合的一个方面是试图“从已知信息中发明信息”。
对于简单的线性回归y = ax + b
,有两个参数,因此对于大多数数据集,它会处于参数化状态,而不是过度参数化。但是,让我们看一下只有两个数据点的(退化)情况。在这种情况下,您总能找到一个完美的线性回归解决方案 - 但是,该解决方案是否一定有意义?可能不是。如果您将两个数据点的线性回归视为足够的解决方案,那将是过度拟合的主要示例。
这是xkcd 的 Randall Munroe 的线性回归过拟合的一个很好的例子,它说明了这个问题: