邏輯迴歸
1.普通邏輯迴歸
在邏輯迴歸中,當變量個數相對觀測較大時,很容易發生完全分離或者準完全分離的現象,這時候沒有唯一的極大似然估計,因此參數估計的方差極大。
> dat=read.csv("https://raw.githubusercontent.com/happyrabbit/DataScientistR/master/Data/sim1_da1.csv")
> fit=glm(y~.,dat,family="binomial")
Warning messages:
1: glm.fit:算法沒有聚合
2: glm.fit:擬合機率算出來是數值零或一
>
如上,該算法沒有聚合,就是完全分離了的情況,這時收縮方法可以解決這個問題。
2.收縮邏輯迴歸
在邏輯迴歸的似然函數後添加罰函數來收縮參數估計
> dat=read.csv("https://raw.githubusercontent.com/happyrabbit/DataScientistR/master/Data/sim1_da1.csv")
> trainx=dplyr::select(dat,-y)
> trainy=dat$y
> fit=glmnet(as.matrix(trainx),trainy,family="binomial")
如上,並沒有錯誤信息。
我們繪製參數收縮的路徑圖,提取對應的參數估計,並進行預測。
> plot(fit,xvar="dev")
>
> levels(as.factor(trainy))
[1] "0" "1"
> newdat=as.matrix(trainx[1:3,])
> predict(fit,newdat,type="link",s=c(2.833e-02,3.110e-02))
1 2
1 0.1943472 0.1442796
2 -0.9913159 -1.0076600
3 -0.5840566 -0.5496074
> cvfit=cv.glmnet(as.matrix(trainx),trainy,family="binomial",type.measure = "class")
> plot(cvfit)
>
上面使用的是誤判率作爲標準,進行10層交互校驗。
#最小誤判率的調優參數取值
> cvfit$lambda.min
[1] 0.0004726514
#距離最小誤判率的一個標準差的調優參數取值
> cvfit$lambda.lse
NULL
>
收縮多項迴歸
> library(glmnet)
> dat=read.csv("https://raw.githubusercontent.com/happyrabbit/DataScientistR/master/Data/SegData.csv")
> trainx=dat[,grep("Q",names(dat))]
> trainy=dat$segment
> fit=glmnet(as.matrix(trainx),trainy,family="multinomial")
> plot(fit,xvar="lambda",label=T,type.coef="2norm")
也可以用cv.glment()函數進行交互效應
> cvfit=cv.glmnet(as.matrix(trainx),trainy,family="multinomial")
Warning messages:
1: In doTryCatch(return(expr), name, parentenv, handler) :
display list redraw incomplete
2: In doTryCatch(return(expr), name, parentenv, handler) :
invalid graphics state
3: In doTryCatch(return(expr), name, parentenv, handler) :
invalid graphics state
> plot(cvfit)
同樣可以得到最優lambda取值,並用其擬合模型
> cvfit$lambda.min
[1] 0.0004697201
> newdat=matrix(sample(1:9,60,replace=T),nrow=6)
> predict(cvfit,newdat,s="lambda.min",type="class")
1
[1,] "Conspicuous"
[2,] "Conspicuous"
[3,] "Conspicuous"
[4,] "Conspicuous"
[5,] "Conspicuous"
[6,] "Price"
泊松收縮回歸
泊松迴歸處理的是因變量爲計數的情況。
> library(glmnet)
> dat=read.csv("https://raw.githubusercontent.com/happyrabbit/DataScientistR/master/Data/SegData.csv")
> trainx=dat[,grep("Q",names(dat))]
> trainy=dat$store_trans
> fit=glmnet(as.matrix(trainx),trainy,family="poisson")
> plot(fit,label=T)
>
我們可以使用cv.glment()函數進行交互校驗
> cvfit=cv.glmnet(as.matrix(trainx),trainy,family="poisson")
> plot(cvfit)
>
這裏用來調優的準則是泊松離差。
當然也可以得到最優lambda取值,然後用該取值擬合模型
> coef(fit,s=cvfit$lambda.min)
11 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) 0.143412732
Q1 -0.004219577
Q2 0.111675071
Q3 .
Q4 -0.001634939
Q5 0.122729313
Q6 0.319613267
Q7 -0.019542550
Q8 0.026830491
Q9 0.020186677
Q10 .
由上可見,喜歡買同一個服裝品牌 的,明確表明喜歡實體店購買以及由明確風格偏好的 人更多地關顧實體店。