线性回归中的过拟合

数据挖掘 机器学习 统计数据 线性回归 过拟合
2021-09-14 02:57:04

我刚刚开始使用机器学习,我无法理解线性回归模型中过度拟合是如何发生的。

考虑到我们只使用 2 个特征变量来训练模型,平面如何可能过度拟合到一组数据点?

我假设线性回归仅使用一条线来描述 2 个变量之间的线性关系和一个平面来描述 3 个变量之间的关系,我很难理解(或者更确切地说是想象)如何在一条线或一个平面上发生过度拟合?

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 的线性回归过拟合的一个很好的例子,它说明了这个问题:

外推