我們知道廣義線性模型包括了一維連續因變量、多維連續因變量、非負次數因變量、二元離散因變量、多元離散因變等的回歸模型。然而LASSO對以上的數據類型都適合,也可以說LASSO 回歸的特點是在擬合廣義線性模型的同時進行變量篩選(variable selection)和複雜度調整(regularization)。變量篩選是指不把所有的變量都放入模型中進行擬合,而是有選擇的把變量放入模型從而得到更好的性能參數。複雜度調整是指通過一系列參數控制模型的複雜度,從而避免過度擬合(Overfitting)。總的來說LASSO對數據的要求很低。對於線性模型來說,複雜度與模型的變量數有直接關係,變量數越多,模型複雜度就越高。 更多的變量在擬合時往往可以給出一個看似更好的模型,但是同時也面臨過度擬合的危險。此時如果用全新的數據去驗證模型(validation),通常效果很差。 一般來說,變量數大於數據點數量很多,或者某一個離散變量有太多獨特值時,都有可能過度擬合。
今天我們給大家介紹下在R語言如何實現LASSO模型構建,其中有兩個包是可以實現的(glmnet和lars)。因為glmnet涉及範圍涉及廣義線性模型,我們就主要介紹下lars是怎麼實現LASSO的。包的安裝我就不多講了,install.pacakges(),你懂的。
首先我們看下其函數lars()。該函數提供了通過回歸變量x和因變量y求解其回歸模型。
其中主要的參數:
1. type 模型的類型。Lar-最小角回歸,forward.stagewise-無窮小逐步回歸,stagewise-逐步回歸。
2. normalize 表示是否對變量進行歸一化,當為TRUE時,程序將對x和y進行L2正則化。
3. intercept表示是否對變量進行中心化,當為TRUE時,程序將對x和y分別減去其均值。
diabetes數據中含有三個變量x,x2,y,其中x是一個有422X10維的矩陣,y是一422維個向量 ,x2是由x得到的 422X64維矩陣。
示例程序:
library(lars)
data(diabetes)
attach(diabetes)
object1
plot(object)
圖中橫坐標代表的beta值或者步數,豎坐標代表的變量的參數。
接下來就是模型的優化,用到的函數是cv.lars()。其主要的功能是確定最優解的步數,或者beta值。
其中主要的參數:
K 交叉驗證的次數,默認10倍交叉驗證。
type同lars指的模型的類型。
mode 指用到的參數指標。step即按步數step去選擇所需的參數,fraction即按照path中的橫坐標|beta|/max|beta|去選擇所需變量,fraction默認為0:100:1即 index=seq(from=0,to=1,length=100)。
程序實例:
cv_sol
均方誤差MSE分析圖為:
然後就是獲取最優最優回歸係數(使得均方誤差MSE最小)。
fra=cv_sol$index[which.min(cv_sol$cv)]
接下來就是通過上面得到的fra,獲取對應的參數值
object$beta[fra,]
最後就是模型的預測功能,我們用到的函數是predict。
其主要參數:
object表示我們通過lars計算得到的包含了解路徑信息的返回參數;
type當type為"fit"時, 可以給定一個新預測樣本自變量數據,則該函數返回通過lars回歸模型得到的預測值;當type為"coefficient"時,則不需要輸入新數據, 該函數返回模型的回歸係數相當於cv.lars。
mode表示我們輸入的模型的參數類型,同cv.lars函數。
S表示通過cv.lars確定的最優解步數或者beta值。
示例程序:
res=predict(object,newx=x[1:5,],s=fra,type="fit", mode="step")
如上圖得到我們想要的預測結果。
歡迎大家學習交流!