拓端tecdat|R語言:邏輯回歸ROC曲線對角線分析過程及結果


原文鏈接:http://tecdat.cn/?p=19018

 

之前我們討論了使用ROC曲線來描述分類器的優勢,有人說它描述了“隨機猜測類別的策略”,讓我們回到ROC曲線來說明。考慮一個非常簡單的數據集,其中包含10個觀測值(不可線性分離)

在這里我們可以檢查一下,確實是不可分離的

plot(x1,x2,col=c("red","blue")[1+y],pch=19) 

考慮邏輯回歸

reg = glm(y~x1+x2,data=df,family=binomial(link = "logit")) 

我們可以使用我們自己的roc函數

  1.  
     
  2.  
    roc=function(s,print=FALSE){
  3.  
    Ps=(S <=s)*1
  4.  
     
  5.  
    FP=sum((Ps==1)*(Y==0)/sum(Y==0)
  6.  
     
  7.  
    TP=sum((Ps==1)*(Y==1)/sum(Y==1)
  8.  
     
  9.  
    if(print==TRUE){
  10.  
     
  11.  
    print(table(Observed=Y,Predicted=Ps))
  12.  
     
  13.  
     
  14.  
    vect=c(FP,TP)
  15.  
     
  16.  
    names(vect)=c("FPR","TPR")
  17.  
     
  18.  
     

或R包

performance(prediction(S,Y),"tpr","fpr")

我們可以在這里同時繪制兩個

因此,我們的代碼在這里可以正常工作。讓我們考慮一下對角線。第一個是:每個人都有相同的概率(例如50%)

  1.  
     
  2.  
    points(V[1,],V[2,])

 

但是,我們這里只有兩點:(0,0)和(1,1)。實際上,無論我們選擇何種概率,都是這種情況

  1.  
     
  2.  
    plot( performance(prediction(S,Y),"tpr","fpr"))
  3.  
    points( V[1,],V[2,])

我們可以嘗試另一種策略,例如“通過扔無偏硬幣進行預測”。我們得到

  1.  
     
  2.  
    segments(0,0,1,1,col="light blue")

我們還可以嘗試“隨機分類器”,在其中我們隨機選擇分數

  1.  
     
  2.  
     
  3.  
    S=runif(10)
  4.  
     

更進一步。我們考慮另一個函數來繪制ROC曲線

 

  1.  
    y=roc( x)
  2.  
    lines( x,y,type="s",col="red")

但是現在考慮隨機選擇的策略

  1.  
     
  2.  
    for(i in 1:500){
  3.  
    S=runif(10)
  4.  
    V=Vectorize(roc.curve)(seq(0,1,length=251)
  5.  
    MY[i,]=roc_curve(x)

 

紅線是所有隨機分類器的平均值。它不是一條直線,我們觀察到它在對角線周圍的波動。

  1.  
     
  2.  
     
  3.  
    reg = glm(PRO~.,data=my,family=binomial(link = "logit"))
  4.  
     
  5.  
     
  6.  
    plot( performance(prediction(S,Y),"tpr","fpr"))
  7.  
     
  8.  
     
  9.  
    segments( 0,0,1,1,col="light blue")

這是一個“隨機分類器”,我們在單位區間上隨機繪制分數

  1.  
     
  2.  
     
  3.  
    segments(0,0,1,1,col="light blue")

如果我們重復500次,我們可以獲得

  1.  
     
  2.  
    for(i in 1:500){
  3.  
     
  4.  
    S=runif(length(Y))
  5.  
     
  6.  
     
  7.  
    MY[i,]=roc(x)
  8.  
    }
  9.  
     
  10.  
    lines(c(0,x),c(0,apply(MY,2,mean)),col="red",type="s",lwd=3)
  11.  
    segments(0,0,1,1,col="light blue")

因此,當我在單位區間上隨機繪制分數時,就會得到對角線的結果。給定Y,我們可以繪制分數的兩個經驗累積分布函數

  1.  
     
  2.  
     
  3.  
    plot(f0,(0:(length(f0)-1))/(length(f0)-1))
  4.  
     
  5.  
    lines( f1,(0:(length(f1)-1))/(length(f1)-1))

我們還可以使用直方圖(或密度估計值)查看分數的分布

  1.  
    hist(S[Y==0],col=rgb(1,0,0,.2),
  2.  
    probability=TRUE,breaks=(0:10)/10,border="white")
  3.  
     

 

我們確實有一個“完美的分類器”(曲線靠近左上角)

 

 

有錯誤。那應該是下面的情況

 

在10%的情況下,我們可能會分類錯誤

 

更多的錯誤分類

 

 

最終我們有對角線

 


 

最受歡迎的見解

1.R語言多元Logistic邏輯回歸 應用案例

2.面板平滑轉移回歸(PSTR)分析案例實現

3.matlab中的偏最小二乘回歸(PLSR)和主成分回歸(PCR)

4.R語言泊松Poisson回歸模型分析案例

5.R語言回歸中的Hosmer-Lemeshow擬合優度檢驗

6.r語言中對LASSO回歸,Ridge嶺回歸和Elastic Net模型實現

7.在R語言中實現Logistic邏輯回歸

8.python用線性回歸預測股票價格

9.R語言如何在生存分析與Cox回歸中計算IDI,NRI指標

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM