Las respuestas existentes no son erróneas, pero creo que la explicación podría ser un poco más intuitiva. Aquí hay tres ideas clave.
1. Predicciones asintóticas
En la regresión logística utilizamos un modelo lineal para predecir $\mu$ , las probabilidades logarítmicas de que $y=1$
$$ \mu = \beta X $$
A continuación, utilizamos la función logística/logarítmica inversa para convertir esto en una probabilidad
$$ P(y=1) = \frac{1}{1 + e^{-\mu}} $$
Es importante destacar que esta función nunca alcanza valores de $0$ o $1$ . En su lugar, $y$ se acerca cada vez más a $0$ como $\mu$ se vuelve más negativa, y más cerca de $1$ más positiva.
2. Separación perfecta
A veces, se dan situaciones en las que el modelo quiere predecir $y=1$ o $y=0$ . Esto ocurre cuando es posible trazar una línea recta a través de sus datos de forma que cada $y=1$ a un lado de la línea, y $0$ por el otro. Esto se llama separación perfecta .
Separación perfecta en 1D
En 2D
Cuando esto ocurre, el modelo intenta predecir lo más cercano a $0$ y $1$ como sea posible, prediciendo valores de $\mu$ que sean lo más bajos y altos posible. Para ello, debe establecer los pesos de regresión, $\beta$ lo más grande posible.
La regularización es una forma de contrarrestarlo: el modelo no puede establecer $\beta$ infinitamente grande, así que $\mu$ no puede ser infinitamente alto o bajo, y la predicción $y$ no puede acercarse tanto a $0$ o $1$ .
3. La separación perfecta es más probable con más dimensiones
En consecuencia, la regularización adquiere mayor importancia cuando se dispone de muchos predictores.
Para ilustrarlo, he aquí de nuevo los datos trazados anteriormente, pero sin los segundos predictores. Vemos que ya no es posible trazar una línea recta que separe perfectamente $y=0$ de $y=1$ .
Código
# https://stats.stackexchange.com/questions/469799/why-is-logistic-regression-particularly-prone-to-overfitting
library(tidyverse)
theme_set(theme_classic(base_size = 20))
# Asymptotes
mu = seq(-10, 10, .1)
p = 1 / (1 + exp(-mu))
g = ggplot(data.frame(mu, p), aes(mu, p)) +
geom_path() +
geom_hline(yintercept=c(0, 1), linetype='dotted') +
labs(x=expression(mu), y='P(y=1)')
g
g + coord_cartesian(xlim=c(-10, -9), ylim=c(0, .001))
# Perfect separation
x = c(1, 2, 3, 4, 5, 6)
y = c(0, 0, 0, 1, 1, 1)
df = data.frame(x, y)
ggplot(df, aes(x, y)) +
geom_hline(yintercept=c(0, 1), linetype='dotted') +
geom_smooth(method='glm',
method.args=list(family=binomial), se=F) +
geom_point(size=5) +
geom_vline(xintercept=3.5, color='red', size=2, linetype='dashed')
## In 2D
x1 = c(rnorm(100, -2, 1), rnorm(100, 2, 1))
x2 = c(rnorm(100, -2, 1), rnorm(100, 2, 1))
y = ifelse( x1 + x2 > 0, 1, 0)
df = data.frame(x1, x2, y)
ggplot(df, aes(x1, x2, color=factor(y))) +
geom_point() +
geom_abline(intercept=1, slope=-1,
color='red', linetype='dashed') +
scale_color_manual(values=c('blue', 'black')) +
coord_equal(xlim=c(-5, 5), ylim=c(-5, 5)) +
labs(color='y')
## Same data, but ignoring x2
ggplot(df, aes(x1, y)) +
geom_hline(yintercept=c(0, 1), linetype='dotted') +
geom_smooth(method='glm',
method.args=list(family=binomial), se=T) +
geom_point()