先看一波過擬合:
圖中,紅色的線存在明顯的過擬合,綠色的線才是合理的擬合曲線,為了避免過擬合,我們可以引入正則化。
下面可以利用正則化來解決曲線擬合過程中的過擬合發(fā)生,存在均方根誤差也叫標(biāo)準(zhǔn)誤差,即為√[∑di^2/n]=Re,n為測量次數(shù);di為一組測量值與真值的偏差。
實際考慮回歸的過程中,我們需要考慮到誤差項,
這個和簡單的線性回歸的公式相似,而在正則化下來優(yōu)化過擬合這件事情的時候,會加入一個約束條件,也就是懲罰函數(shù):
這邊這個懲罰函數(shù)有多種形式,比較常用的有l(wèi)1,l2,大概有如下幾種:
講一下比較常用的兩種情況,q=1和q=2的情況:
q=1,也就是今天想講的lasso回歸,為什么lasso可以控制過擬合呢,因為在數(shù)據(jù)訓(xùn)練的過程中,可能有幾百個,或者幾千個變量,再過多的變量衡量目標(biāo)函數(shù)的因變量的時候,可能造成結(jié)果的過度解釋,而通過q=1下的懲罰函數(shù)來限制變量個數(shù)的情況,可以優(yōu)先篩選掉一些不是特別重要的變量,見下圖:
作圖只要不是特殊情況下與正方形的邊相切,一定是與某個頂點優(yōu)先相交,那必然存在橫縱坐標(biāo)軸中的一個系數(shù)為0,起到對變量的篩選的作用。
q=2的時候,其實就可以看作是上面這個藍色的圓,在這個圓的限制下,點可以是圓上的任意一點,所以q=2的時候也叫做嶺回歸,嶺回歸是起不到壓縮變量的作用的,在這個圖里也是可以看出來的。
lasso回歸:
lasso回歸的特色就是在建立廣義線型模型的時候,這里廣義線型模型包含一維連續(xù)因變量、多維連續(xù)因變量、非負次數(shù)因變量、二元離散因變量、多元離散因變,除此之外,無論因變量是連續(xù)的還是離散的,lasso都能處理,總的來說,lasso對于數(shù)據(jù)的要求是極其低的,所以應(yīng)用程度較廣;除此之外,lasso還能夠?qū)ψ兞窟M行篩選和對模型的復(fù)雜程度進行降低。這里的變量篩選是指不把所有的變量都放入模型中進行擬合,而是有選擇的把變量放入模型從而得到更好的性能參數(shù)。 復(fù)雜度調(diào)整是指通過一系列參數(shù)控制模型的復(fù)雜度,從而避免過度擬合(Overfitting)。 對于線性模型來說,復(fù)雜度與模型的變量數(shù)有直接關(guān)系,變量數(shù)越多,模型復(fù)雜度就越高。 更多的變量在擬合時往往可以給出一個看似更好的模型,但是同時也面臨過度擬合的危險。
lasso的復(fù)雜程度由λ來控制,λ越大對變量較多的線性模型的懲罰力度就越大,從而最終獲得一個變量較少的模型。除此之外,另一個參數(shù)α來控制應(yīng)對高相關(guān)性(highly correlated)數(shù)據(jù)時模型的性狀。 LASSO回歸α=1,Ridge回歸α=0,這就對應(yīng)了懲罰函數(shù)的形式和目的。我們可以通過嘗試若干次不同值下的λ,來選取最優(yōu)λ下的參數(shù),還可以結(jié)合CV選擇最優(yōu)秀的模型。
##讀取數(shù)據(jù)
setwd("~/Desktop")
library(glmnet)
train_origin<-read.table('trian.txt',header = T,fill = T)
test_origin<-read.table('test.txt',header = T,fill = T)
train_test1<-train_origin
train_test1<-train_test1[,-9]
train_test1$tag<-as.factor(train_test1$tag)
train_test1$risk_level<-as.factor(train_test1$risk_level)
x<-train_test1[,3:11]
y<-train_test1[,2]
## one hot encoding
x1<-model.matrix(~., x)
通常數(shù)據(jù)中會存在離散點,而lasso在R里面是通過數(shù)值矩陣來做輸入的,所以需要對原數(shù)據(jù)做一步預(yù)處理,不然這邊會拋錯誤;除此之外,如果數(shù)據(jù)之間差別的數(shù)量級較大,還需要進行標(biāo)準(zhǔn)化,R里面也是可以進行處理的,這邊就不贅述了,glmnet()函數(shù)中添加參數(shù)standardize = TRUE來實現(xiàn),scale()函數(shù)也可以實現(xiàn),自行選擇即可。
##模型訓(xùn)練
model = glmnet(x1, y, family="binomial", nlambda=50, alpha=1)
family里面是指選擇函數(shù)的類型:
family | explation |
gaussian | univariate |
mgaussian | multivariate |
poisson | count |
binomial | binary |
multinomial | category |
lambda是指隨機選擇λ,做lambda個模型;alpha是上述講到的α,選擇懲罰函數(shù),正常情況下,1是lasso,0是嶺回歸
這邊模型拓展可以交叉檢驗一下,有內(nèi)置的函數(shù):
cvmodel = cv.glmnet(x1, y, family = "binomial", type.measure = "class",nfolds=10)
這邊會多出來一個type.measure,這個type.measure是指期望最小化的目標(biāo)參量是什么,換句話說,就是衡量這個模型的指標(biāo)函數(shù)是啥:
type.measure | details |
deviance | -2倍的Log-likelihood |
mse | mean squred error |
mae | mean absolute error |
class | missclassification error |
auc | area under the ROC curve |
對于glmnet,可以通過plot(model)來觀察每個自變量的變化軌跡,cv.glmnet可以通過plot(cvmodel)
舉個plot(cvmodel)的例子:
可以通過c(cvfit$lambda.min, cvfit$lambda.1se)來看在所有的λ值中,得到最小目標(biāo)函數(shù)type.measure均值的cvfit$lambda.min,以及其所對應(yīng)的λ值cvfit$lambda.1se。
我們可以print(model),在實際的選擇模型中λ值的過程里,存在三個指標(biāo):df:自由度, %Dev:殘差被解釋的占比,也就是模型的好壞程度,Lambda也就是λ值所對應(yīng)的值,然后我們可以通過coef(fit, s=c(fit$lambda[35],0.002))得出當(dāng)時模型所對應(yīng)的系數(shù)。
最后,講一下elastic net
elastic net融合了l1范數(shù)和l2范數(shù)兩種正則化的方法,上面的嶺回歸和lasso回歸都可以看做它的特例:
elastic net對于p遠大于n,或者嚴(yán)重的多重共線性情況有明顯的效果,很好理解,當(dāng)alpha接近1時,elastic net表現(xiàn)很接近lasso,一般來說,elastic net是嶺回歸和lasso的很好的折中,當(dāng)alpha從0變化到1,目標(biāo)函數(shù)的稀疏解(部分變量的系數(shù)為0)也從0單調(diào)增加到lasso的稀疏解。
聯(lián)系客服