原文鏈接: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函數
-
-
roc=function(s,print=FALSE){
-
Ps=(S <=s)*1
-
-
FP=sum((Ps==1)*(Y==0)/sum(Y==0)
-
-
TP=sum((Ps==1)*(Y==1)/sum(Y==1)
-
-
if(print==TRUE){
-
-
print(table(Observed=Y,Predicted=Ps))
-
-
-
vect=c(FP,TP)
-
-
names(vect)=c("FPR","TPR")
-
-
或R包
performance(prediction(S,Y),"tpr","fpr")
我們可以在這里同時繪制兩個
因此,我們的代碼在這里可以正常工作。讓我們考慮一下對角線。第一個是:每個人都有相同的概率(例如50%)
-
-
points(V[1,],V[2,])
但是,我們這里只有兩點:(0,0)和(1,1)。實際上,無論我們選擇何種概率,都是這種情況
-
-
plot( performance(prediction(S,Y),"tpr","fpr"))
-
points( V[1,],V[2,])
我們可以嘗試另一種策略,例如“通過扔無偏硬幣進行預測”。我們得到
-
-
segments(0,0,1,1,col="light blue")
我們還可以嘗試“隨機分類器”,在其中我們隨機選擇分數
-
-
-
S=runif(10)
-
更進一步。我們考慮另一個函數來繪制ROC曲線
-
y=roc( x)
-
lines( x,y,type="s",col="red")
但是現在考慮隨機選擇的策略
-
-
for(i in 1:500){
-
S=runif(10)
-
V=Vectorize(roc.curve)(seq(0,1,length=251)
-
MY[i,]=roc_curve(x)
紅線是所有隨機分類器的平均值。它不是一條直線,我們觀察到它在對角線周圍的波動。
-
-
-
reg = glm(PRO~.,data=my,family=binomial(link = "logit"))
-
-
-
plot( performance(prediction(S,Y),"tpr","fpr"))
-
-
-
segments( 0,0,1,1,col="light blue")
這是一個“隨機分類器”,我們在單位區間上隨機繪制分數
-
-
-
segments(0,0,1,1,col="light blue")
如果我們重復500次,我們可以獲得
-
-
for(i in 1:500){
-
-
S=runif(length(Y))
-
-
-
MY[i,]=roc(x)
-
}
-
-
lines(c(0,x),c(0,apply(MY,2,mean)),col="red",type="s",lwd=3)
-
segments(0,0,1,1,col="light blue")
因此,當我在單位區間上隨機繪制分數時,就會得到對角線的結果。給定Y,我們可以繪制分數的兩個經驗累積分布函數
-
-
-
plot(f0,(0:(length(f0)-1))/(length(f0)-1))
-
-
lines( f1,(0:(length(f1)-1))/(length(f1)-1))
我們還可以使用直方圖(或密度估計值)查看分數的分布
-
hist(S[Y==0],col=rgb(1,0,0,.2),
-
probability=TRUE,breaks=(0:10)/10,border="white")
-
我們確實有一個“完美的分類器”(曲線靠近左上角)
有錯誤。那應該是下面的情況
在10%的情況下,我們可能會分類錯誤
更多的錯誤分類
最終我們有對角線
最受歡迎的見解
3.matlab中的偏最小二乘回歸(PLSR)和主成分回歸(PCR)
5.R語言回歸中的Hosmer-Lemeshow擬合優度檢驗
6.r語言中對LASSO回歸,Ridge嶺回歸和Elastic Net模型實現
9.R語言如何在生存分析與Cox回歸中計算IDI,NRI指標