為什麼邏輯回歸在高維度上特別容易過擬合?
為什麼*“邏輯回歸的漸近性*”使它特別容易 在高維度上****過度擬合?(來源):
我了解LogLoss(交叉熵)隨著 $ y $ (真實概率)方法 $ 1-y' $ (預測概率):
但是為什麼這意味著*“邏輯回歸的漸近性質會在沒有正則化的情況下將****高維的損失推向 0 ”*?
在我看來,僅僅因為損失會迅速增長(如果我們非常接近錯誤且完全相反的答案),並不意味著它會因此嘗試完全插值數據。如果有的話,優化器會盡可能積極地避免進入損失的漸近部分(快速增長部分)。
現有的答案沒有錯,但我認為解釋可能更直觀一些。這裡有三個關鍵思想。
- 漸近預測 =======
在邏輯回歸中,我們使用線性模型來預測 $ \mu $ , 的對數機率 $ y=1 $
$$ \mu = \beta X $$
然後我們使用邏輯/逆對數函數將其轉換為概率
$$ P(y=1) = \frac{1}{1 + e^{-\mu}} $$
重要的是,這個函數實際上從未達到 $ 0 $ 或者 $ 1 $ . 反而, $ y $ 越來越接近 $ 0 $ 作為 $ \mu $ 變得更消極,更接近 $ 1 $ 因為它變得更加積極。
2.完美分離
有時,您最終會遇到模型想要預測的情況 $ y=1 $ 或者 $ y=0 $ . 當可以通過數據繪製一條直線時,就會發生這種情況,這樣每個 $ y=1 $ 在線的一側,並且 $ 0 $ 在另一。這稱為完美分離。
二維
發生這種情況時,模型會嘗試預測盡可能接近 $ 0 $ 和 $ 1 $ 盡可能,通過預測的值 $ \mu $ 盡可能低和高。為此,它必須設置回歸權重, $ \beta $ 盡可能大。
正則化是一種抵消這種情況的方法:不允許設置模型 $ \beta $ 無限大,所以 $ \mu $ 不能無限高或無限低,並且預測 $ y $ 不能靠近 $ 0 $ 或者 $ 1 $ .
- 更多維度更容易實現完美分離 ================
因此,當您有許多預測變量時,正則化變得更加重要。
為了說明,這裡再次繪製了之前繪製的數據,但沒有第二個預測變量。我們看到再也不可能畫出一條完美分隔的直線 $ y=0 $ 從 $ y=1 $ .
代碼
# 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()