R語言如何和什麼時候使用glmnet嶺迴歸

這裏向您展現如何在R中使用glmnet包進行嶺迴歸(使用L2正則化的線性迴歸),並使用模擬來演示其相對於普通最小二乘迴歸的優點。框架

嶺迴歸

當迴歸模型的參數被學習時,嶺迴歸使用L2正則化來加權/懲罰殘差。在線性迴歸的背景下,它能夠與普通最小二乘法(OLS)進行比較。OLS定義了計算參數估計值(截距和斜率)的函數。它涉及最小化平方殘差的總和。L2正則化是OLS函數的一個小增長,以特定的方式對殘差進行加權以使參數更加穩定。結果一般是一種適合訓練數據的模型,不如OLS更好,但因爲它對數據中的極端變異(例如異常值)較不敏感,因此通常性更好。函數

包package

咱們將在這篇文章中使用如下軟件包:學習

library(tidyverse)library(broom)library(glmnet)

與glmnet的嶺迴歸

glmnet軟件包提供了經過嶺迴歸的功能glmnet()。重要的事情要知道:測試

它不須要接受公式和數據框架,而須要一個矢量輸入和預測器矩陣。spa

您必須指定alpha = 0嶺迴歸。code

嶺迴歸涉及調整超參數lambda。glmnet()會爲你生成默認值。另外,一般的作法是用lambda參數來定義你本身(咱們將這樣作)。對象

如下是使用mtcars數據集的示例:

由於,與OLS迴歸不一樣lm(),嶺迴歸涉及調整超參數,lambda,glmnet()爲不一樣的lambda值屢次運行模型。咱們能夠自動找到最適合的lambda值,cv.glmnet()以下所示:ip

cv_fit <- cv.glmnet(x, y, alpha =0, lambda = lambdas)

cv.glmnet() 使用交叉驗證來計算每一個模型的歸納性,咱們能夠將其視爲:it

plot(cv_fit)

clipboard.png

R語言如何和什麼時候使用glmnet嶺迴歸

曲線中的最低點指示最佳的lambda:最好使交叉驗證中的偏差最小化的lambda的對數值。咱們能夠將這個值提取爲:class

opt_lambda <- cv_fit$lambda.minopt_lambda#> [1] 3.162278

咱們能夠經過如下方式提取全部擬合的模型(如返回的對象glmnet()):

這是咱們須要預測新數據的兩件事情。例如,預測值並計算咱們訓練的數據的R 2值:

y_predicted <- predict(fit, s = opt_lambda, newx = x)# Sum of Squares Total and Errorsst <- sum((y - mean(y))^2)sse <- sum((y_predicted - y)^2)# R squaredrsq <-1- sse / sstrsq#> [1] 0.9318896

最優模型已經在訓練數據中佔93%的方差。

Ridge v OLS模擬

經過產生比OLS更穩定的參數,嶺迴歸應該不太容易過分擬合訓練數據。所以,嶺迴歸可能預測訓練數據不如OLS好,但更好地推廣到新數據。當訓練數據的極端變化很大時尤爲如此,當樣本大小較低和/或特徵的數量相對於觀察次數較多時這趨向於發生。

下面是我建立的一個模擬實驗,用於比較嶺迴歸和OLS在訓練和測試數據上的預測準確性。

我首先設置了運行模擬的功能:

可視化結果...
對於不一樣數量的訓練數據(對多個特徵進行平均),兩種模型對訓練和測試數據的預測效果如何?

clipboard.png

R語言如何和什麼時候使用glmnet嶺迴歸

根據假設,OLS更適合訓練數據,但Ridge迴歸更好地概括爲新的測試數據。此外,當訓練觀察次數較少時,這些影響更爲明顯。

對於不一樣的相對特徵比例(平均數量的訓練數據),兩種模型對訓練和測試數據的預測效果如何?

clipboard.png

R語言如何和什麼時候使用glmnet嶺迴歸

再一次地,OLS在訓練數據上表現稍好,但Ridge在測試數據上更好。當特徵的數量相對於訓練觀察的數量相對較高時,效果更顯着。

下面的圖有助於將Ridge對OLS的相對優點(或劣勢)可視化爲觀察值和特徵的數量:

R語言如何和什麼時候使用glmnet嶺迴歸

clipboard.png

這顯示了綜合效應:當訓練觀察數量較低和/或特徵數目相對於訓練觀察數目較高時,Ridge迴歸更好地轉移到測試數據。OLS在相似條件下的訓練數據上表現略好,代表它比使用脊線正則化時更容易過分訓練數據。

相關文章
相關標籤/搜索