這裏向您展現如何在R中使用glmnet包進行嶺迴歸(使用L2正則化的線性迴歸),並使用模擬來演示其相對於普通最小二乘迴歸的優點。框架
當迴歸模型的參數被學習時,嶺迴歸使用L2正則化來加權/懲罰殘差。在線性迴歸的背景下,它能夠與普通最小二乘法(OLS)進行比較。OLS定義了計算參數估計值(截距和斜率)的函數。它涉及最小化平方殘差的總和。L2正則化是OLS函數的一個小增長,以特定的方式對殘差進行加權以使參數更加穩定。結果一般是一種適合訓練數據的模型,不如OLS更好,但因爲它對數據中的極端變異(例如異常值)較不敏感,因此通常性更好。函數
咱們將在這篇文章中使用如下軟件包:學習
library(tidyverse)library(broom)library(glmnet)
glmnet軟件包提供了經過嶺迴歸的功能glmnet()。重要的事情要知道:測試
它不須要接受公式和數據框架,而須要一個矢量輸入和預測器矩陣。spa
您必須指定alpha = 0嶺迴歸。code
嶺迴歸涉及調整超參數lambda。glmnet()會爲你生成默認值。另外,一般的作法是用lambda參數來定義你本身(咱們將這樣作)。對象
由於,與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)
曲線中的最低點指示最佳的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%的方差。
經過產生比OLS更穩定的參數,嶺迴歸應該不太容易過分擬合訓練數據。所以,嶺迴歸可能預測訓練數據不如OLS好,但更好地推廣到新數據。當訓練數據的極端變化很大時尤爲如此,當樣本大小較低和/或特徵的數量相對於觀察次數較多時這趨向於發生。
下面是我建立的一個模擬實驗,用於比較嶺迴歸和OLS在訓練和測試數據上的預測準確性。
我首先設置了運行模擬的功能:
可視化結果...
對於不一樣數量的訓練數據(對多個特徵進行平均),兩種模型對訓練和測試數據的預測效果如何?
根據假設,OLS更適合訓練數據,但Ridge迴歸更好地概括爲新的測試數據。此外,當訓練觀察次數較少時,這些影響更爲明顯。
對於不一樣的相對特徵比例(平均數量的訓練數據),兩種模型對訓練和測試數據的預測效果如何?
再一次地,OLS在訓練數據上表現稍好,但Ridge在測試數據上更好。當特徵的數量相對於訓練觀察的數量相對較高時,效果更顯着。
下面的圖有助於將Ridge對OLS的相對優點(或劣勢)可視化爲觀察值和特徵的數量:
這顯示了綜合效應:當訓練觀察數量較低和/或特徵數目相對於訓練觀察數目較高時,Ridge迴歸更好地轉移到測試數據。OLS在相似條件下的訓練數據上表現略好,代表它比使用脊線正則化時更容易過分訓練數據。