1. 程式人生 > >R語言解決Lasso問題----glmnet包(廣義線性模型)

R語言解決Lasso問題----glmnet包(廣義線性模型)

        Lasso迴歸複雜度調整的程度由引數lambda來控制,lambda越大模型複雜度的懲罰力度越大,從而獲得一個較少變數的模型。Lasso迴歸和bridge迴歸都是Elastic Net廣義線性模型的特例。除了引數lambda,還有引數alpha,控制對高相關性資料時建模的形狀。Lasso迴歸,alpha=1(R語言glmnet的預設值),brigde迴歸,alpha=0,一般的elastic net 0<alpha<1.

     根據Hastie(斯坦福統計學家), Tibshirani和Wainwright的Statistical Learning with Sparsity(The Lasso and Generalizations),如下五類模型的變數選擇可採用R語言的glmnet包來解決。這五類模型分別是:

1. 二分類logistic迴歸模型

2. 多分類logistic迴歸模型

3.Possion模型

4.Cox比例風險模型

5.SVM

   下面介紹如何使用glmnet包來實現,以二元logistic迴歸模型為例:

    >library("glmnet") #載入該軟體包

    >cv.fit<-cv.glmnet(x,y,family="binomial") #x為輸入特徵,x應該是矩陣格式的,若非矩陣格式,採用as.matrix()轉換成矩陣格式,否則,會報如下錯誤:Error in lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs,  : 
  (串列)物件不能強制改變成'double'種類

。  其他模型familiy值不一樣,如cox風險比例模型是cox,possion是possion,多分類logistic是multinomial,廣義線性模型guassian,family還有一種選擇是mgaussian,不知是否是svm模型?

正確答案是:引數family規定了迴歸模型的型別:

----family="gaussian"適用於一維連續因變數

----family=mgaussian"適用於多維連續因變數

----family="poisson"適用於非負次數因變數(count)

----family="binomial"適用於二元離散因變數(binary)

----family="multinomial"適用於多元離散因變數(category)

    >plot(cv.fit)


cv.fit=cv.glmnet(x,y,family='binomial',type.measure="deviance")

這裡的type.measure是用來指定交叉驗證選取模型時希望最小化的目標參量,對與logistic迴歸有以下幾種選擇:

--------type.measure=deviance使用deviance,即-2log-likelihood(預設)

--------type.measure=mse使用擬合因變數與實際因變數的mean squred error

--------type.measure=mae使用mean absolute error

--------type.measure=class使用模型分類的錯誤率

--------type.measure=auc使用area under the ROC curve,是現在最流行的綜合考量模型效能的一種引數

>cv.fit$lambda.min  #最佳lambda值

>cv.fit$lambda.1se#指在lambda.min一個標準差範圍內得到的最簡單模型的那一個lambda值。因為lambda值達到一定大小之後,繼續增加模型自變數個數及縮小lambda值,並不能顯著提高模型效能,lambda.lse給出的就是一個具備優良效能但是自變數個數最少的模型。

>fit<-glmnet(x0,y0,family="binomial")

>plot(fit)


>coefficients<-coef(fit,s=cv.fit$lambda.min)
>Active.Index<-which(coefficients!=0)     #係數不為0的特徵索引
>Active.coefficients<-coefficients[Active.Index]   #係數不為0的特徵係數值

statistical learning with sparsity