1. 程式人生 > >最詳細的基於R語言的Logistic Regression(Logistic迴歸)原始碼,包括擬合優度,Recall,Precision的計算

最詳細的基於R語言的Logistic Regression(Logistic迴歸)原始碼,包括擬合優度,Recall,Precision的計算

這篇日誌也確實是有感而發,我對R不熟悉,但實驗需要,所以簡單學了一下。發現無論是網上無數的教程,還是書本上的示例,在講Logistic Regression的時候就是給一個簡單的函式及輸出結果說明。從來都沒有講清楚幾件事情:

1. 怎樣用訓練資料訓練模型,然後在測試資料上進行驗證(測試資料和訓練資料可能有重合)?

2. 怎樣計算預測的效果,也就是計算Recall,Precision,F-measure等值?

3. 怎樣計算Nagelkerke擬合優度等評價指標?

2014年9月8日補充:還有一個問題忘記說了,怎麼樣確定Logistic Regression的閾值,對於下面這段程式碼來講,很簡單:調整0.5為其他值即可。

發現這些書本和一些寫部落格的朋友,腦子真是不清楚得可以。去看你的教程,不是光看看簡單的函式使用,或者聽你講講原理,還是希望能儘快並且正確地用起來。從我的經歷來看,已有的網上教程都做得太差了。

這裡我也不詳細介紹過程了,貼上有詳細註釋的程式碼,相信大家一看就明白:

rm(list=ls(all=TRUE))#首先刪除工作空間中所有物件
training=read.csv("training.csv",header=FALSE)
testing=read.csv("testing.csv",header=FALSE)#分別匯入訓練和測試資料
 
glm.fit=glm(V16~V7,data=training,family=binomial(link="logit"))#用訓練資料生成模型,這裡我是用第7列資料預測第16列
 
n=nrow(training)#訓練資料的行數,也就是樣本數量
 
R2<-1-exp((glm.fit$deviance-glm.fit$null.deviance)/n)#計算Cox-Snell擬合優度
cat("Cox-Snell R2=",R2,"\n")
 
R2<-R2/(1-exp((-glm.fit$null.deviance)/n))#計算Nagelkerke擬合優度,我們在最後輸出這個擬合優度值
 
p=predict(glm.fit,testing)#用模型對測試資料進行預測
p=exp(p)/(1+exp(p))#計算因變數的值
 
testing$V16_predicted=1*(p>0.5)#給test資料增加一列,也就是對V16的預測,當p>0.5時,預測值為1

true_value=testing[,16]
predict_value=testing[,17]#分別將16和17列取出來
 
retrieved=sum(predict_value)
precision=sum(true_value & predict_value)/retrieved
recall=sum(predict_value & true_value)/sum(true_value)
F_measure=2*precision*recall/(precision+recall)#計算Recall,Precision和F-measure

#補充一點:對TPR(True Positive Rate)和FPR(False Positive Rate)的計算:
TPR=sum(true_value & predict_value)/sum(true_value)#實際上和Recall相等
FPR=(sum(predict_value)-sum(true_value & predict_value))/(length(true_value)-sum(true_value))
 
summary(glm.fit)
cat("Nagelkerke R2=",R2,"\n")
print(precision)
print(recall)
print(F_measure)

搞不清楚這麼簡單的東西,為什麼很多人都說不清楚。

這裡再簡單解釋一下summary輸出結果:

Call:
glm(formula = V16 ~ V7, family = binomial(link = "logit"), data = training)
 
Deviance Residuals:
    Min       1Q   Median       3Q      Max
-2.5212  -0.9990  -0.4249   1.1352   1.4978  
 
Coefficients:
             Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.744804   0.207488  -3.590 0.000331 ***
V7           0.005757   0.001362   4.226 2.38e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
 
(Dispersion parameter for binomial family taken to be 1)
 
    Null deviance: 307.76  on 221  degrees of freedom
Residual deviance: 277.85  on 220  degrees of freedom
AIC: 281.85
 
Number of Fisher Scoring iterations: 5

其實大家主要看Coefficient這裡就可以了,其中Estimate表示最終預測方程裡V7的係數,Pr就是p-value,從這兩處看預測效果還可以接受。