Logistic邏輯回歸

在日常學習或工作中經(jīng)常會使用線性回歸模型對某一事物進行預測,例如預測房價、身高、GDP、學生成績等,發(fā)現(xiàn)這些被預測的變量都屬于連續(xù)型變量。然而有些情況下,被預測變量可能是二元變量,即成功或失敗、流失或不流失、漲或跌等,對于這類問題,線性回歸將束手無策。這個時候就需要另一種回歸方法進行預測,即Logistic回歸。

一、Logistic模型簡介

Logistic回歸模型公式如下:

xn的情況下,興趣變量y=1時的概率。顯然,該模型是一個非線性模型,具有S型分布

x<-seq(-10,10,0.01)

> y<-1/(1+exp(-x))

> library(ggplot2)

> ggplot(data=NULL,aes(x=x,y=y))+geom_line(col="red")

二、模型用途

Logistic模型主要有三大用途:

1)尋找危險因素,找到某些影響因變量的”壞因素”,一般可以通過優(yōu)勢比發(fā)現(xiàn)危險因素;

2)用于預測,可以預測某種情況發(fā)生的概率或可能性大??;

3)用于判別,判斷某個新樣本所屬的類別。

三、模型應用

下文使用Logistic模型對電信行業(yè)的客戶流失數(shù)據(jù)進行建模,數(shù)據(jù)來源為R中C50包自帶數(shù)據(jù)集churnTrain和churnTest。

使用C50包中自帶的電信行業(yè)客戶流失數(shù)據(jù)

library(C50)

data(churn)

?train<-churnTrain

test<-churnTest

str(train)

數(shù)據(jù)集中包含了19個變量,其中變量洲(state)、國際長途計劃(international_plan)、信箱語音計劃(voice_mail_plan)和是否流失(churn)為因子變量,其余變量均為數(shù)值變量,而且這里的區(qū)域編碼變量(area_code)沒有任何實際意義,故考慮排除該變量。

剔除無意義的變量

train<-train[,-3]

test<-test[,-3]

由于模型中,更關(guān)心的是流失這個結(jié)果(churn=yes),所以對該因子進行排序?

train$churn<-factor(train$churn,levels = c("no","yes"),order=TRUE)

test$churn <- factor(test$churn, ,levels = c('no','yes'), order = TRUE)?

構(gòu)建Logistic模型?

model<-glm(churn~.,data=train,family = "binomial")

> summary(model)

發(fā)現(xiàn)有很多變量并不顯著,故考慮剔除這些不顯著的變量,這里使用逐步回歸法進行變量的選擇(需要注意的是,Logistic為非線性模型,回歸系數(shù)是通過極大似然估計方法計算所得)

step函數(shù)實現(xiàn)逐步回歸法?

model2 <- step(object = model, trace = 0)?

summary(model2)?

從結(jié)果中發(fā)現(xiàn),所有變量的P值均小于0.05,通過顯著性檢驗,保留了相對重要的變量。模型各變量通過顯著性檢驗的同時還需確保整個模型是顯著的,只有這樣才能保證模型是正確的、有意義的,下面對模型進行卡方檢驗。

模型的顯著性檢驗?

anova(object = model2, test = 'Chisq')?注意c大寫

從上圖中可知,隨著變量從第一個到最后一個逐個加入模型,模型最終通過顯著性檢驗,說明由上述這些變量組成的模型是有意義的,并且是正確的。

雖然模型的偏回歸系數(shù)和模型均通過顯著性檢驗,但不代表模型能夠非常準確的擬合實際值,這就需要對模型進行擬合優(yōu)度檢驗,即通過比較模型的預測值與實際值之間的差異情況來進行檢驗。

Logistic回歸模型的擬合優(yōu)度檢驗一般使用偏差卡方檢驗、皮爾遜卡方檢驗和HL統(tǒng)計量檢驗三種方法,其中前兩種檢驗適合模型中只有離散的自變量,而后一種適合模型中包含連續(xù)的自變量。擬合優(yōu)度檢驗的原假設(shè)為“模型的預測值與實際值不存在差異”。

模型對樣本外數(shù)據(jù)(測試集)的預測精度?

prob<-predict(object =model2,newdata=test,type = "response")?

pred<-ifelse(prob>=0.5,"yes","no")

> pred<-factor(pred,levels = c("no","yes"),order=TRUE)

> f<-table(test$churn,pred)

> f

pred

no? ? ? yes

yes? 182? ? 42

no? 1408? ? 35

從上圖中我們發(fā)現(xiàn):

1).模型對非流失客戶(no)的預測還是非常準確的(1408/(1408+35)=97.6%);

2).模型對流失客戶(yes)的預測非常不理想(42/(182+42)=18.8%)

3).模型的整體預測準確率為87.0%((1408+42)/(1408+35+182+42)),還算說得過去。

模型對非流失客戶預測精準,而對流失客戶預測非常差,我認為的可能原因是模型對非平衡數(shù)據(jù)非常敏感。即構(gòu)建模型的訓練集中流失客戶為483例,而非流失客戶為2850例,兩者相差非常大。

上文對模型偏回歸系數(shù)、模型整體和模型擬合優(yōu)度進行了顯著性檢驗,結(jié)果均表明模型比較理想,同時也對模型的預測精度進行驗證,也說明了模型的整體預測能力比較理想。接下來我們通過另一種可視化的方法衡量模型的優(yōu)劣,即ROC曲線,該曲線的橫坐標和縱坐標各表示1-反例的覆蓋率正例的覆蓋率。

繪制ROC曲線?

library(pROC)

roc_curve <- roc(test$churn,prob)

names(roc_curve)

x <- 1-roc_curve$specificities

y <- roc_curve$sensitivities

library(ggplot2)

p <- ggplot(data = NULL, mapping = aes(x= x, y = y))

p + geom_line(colour = 'red') +geom_abline(intercept = 0, slope = 1)

+ annotate('text', x = 0.4, y = 0.5, label =paste('AUC=',round(roc_curve$auc,2)))

+ labs(x = '1-specificities',y = 'sensitivities', title = 'ROC Curve')

這里的AUC為ROC曲線和y=x直線之間的面積。在實際應用中,多個模型的比較可以通過面積大小來選擇更佳的模型,選擇標準是AUC越大越好。對于一個模型而言,一般AUC大于0.8就能夠說明模型是比較合理的了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容