分類模型效果評價
整理一下目前在工作和學習中用到的分類模型效果,也就是俗稱的“準確率”的各種表達形式。避免以後忘記,查一下又要給某論壇交記憶稅。
(一)準確率accuracy
準確率=分類正確的樣本數目/總樣本量
大眾通常意義上的準確率,一般客戶會默認我們所說的準確率是這個定義。
在實際工作中該指標基本沒有實際意義(除非模型效果極差)。比如:極少目標識別(全部miss)。通過攝像頭下的動作識別小偷。100個人中有10個是小偷,模型把所有人認為“不是小偷”。這種情況下準確率=90/100,也就是90%。但實際上它一個小偷也不會識別出來。
(二)混淆矩陣及查全率R、查準率P
混淆矩陣就是模型預測結果和數據真實屬性組成的方陣,形如:
預測其類別為0 | 預測其類別為1 | |
實際上類別為0 | FF | FT |
實際上類別為1 | TF | TT |
明顯(FF+TT) / (FF+TT+TF+FT)就是上面說的準確率。
查全率是指 在全部目標樣本(TF+TT)中,被模型識別出來的樣本個數(TT)。recall=(TT) / (TF+TT)
查準率是指 在識別為目標的樣本中(FT+TT),實際上確實為目標值的樣本個數(TT)。precision=(TT) / (FT+TT)
通過以上的定義可以發現,查全率查準率的定義非常依賴於“目標值(1)”的定義。比如在上個例子中識別小偷,目標就是“識別為小偷”,一般在模型中取該目標值Y=1,其他的非目標樣本為Y=0。多分類同理可以進行計算每個類別的查全率查準率,以及綜合查全率查準率。
查全率和查準率通常二者不可兼得,類似於蹺蹺板的兩頭。實際運用中通常會根據研究目的確認是查全率優先(寧可錯殺不可放過)、還是查準率優先(絕對不能認錯)。
將兩者綜合起來實際意義不大,但仍然有一個綜合的值,相對平衡地用一個值去度量模型效果,該值為F1-score,常簡稱為“F值”,F1=(2*recall*precision) / (recall+precision),同樣也是越大越好。
但作為數據分析人員需要記住:任何脫離目標定義的R、P、F值都是沒有意義的。
同時,即使以上三個值都表現還可以,仍然存在一種誤差不容易被客戶接受:在實際為目標值而沒有被識別出來的樣本中,存在某類特征明顯、意義重大的數據組。該種情況容易給運用模型的人員造成損失,因此即使準確率夠高,我依然會在4類數據中進行隨機抽取,然後用人腦判別有無這種bug,然後具有針對性地調整輸入變量和參數。
計算就很簡單,此處略,以後忘了用excel解決也ojbk。
混淆矩陣就table一下(輸入glm1.t為模型,data為數據,第一列是實際類別):
pred_glm_all=data.frame(predict(glm1.t,data[,-1]))
p=exp(pred_glm_all)/(1+exp(pred_glm_all))
prob.pred.all=cbind.data.frame(data[,1],p)
p=1*(p>0.5)
t3=data.frame(cbind(data[,1],p))
table(t3)#混淆矩陣
(三)ROC曲線
ROC曲線和AUC值,是圖形化的模型效果展示方法之一。
判定方法是ROC曲線與X軸圍成的面積越大、AUC值越大,模型效果越好。
這種方法比較直觀,用於多模型之間的比較很容易看出來,通常用於多算法進行選擇。
在R中可以簡單快捷的用pROC包完成。輸入的兩列數據為[Y,prob],分別為實際類別及預測的類別(可以是預測為1類的概率值)
library("pROC")
N <- dim(dat.log)[1] #數據長度
date_roc <- roc(dat.log$Y, dat.log$prob) #計算ROC
plot(date_roc, print.auc = TRUE, auc.polygon = TRUE, legacy.axes = TRUE, grid = c(0.1, 0.2), grid.col = c("green", "red"), max.auc.polygon = TRUE, auc.polygon.col = "skyblue", print.thres = TRUE, xlab = "特異度", ylab = "靈敏度",main = "邏輯回歸結果") #繪制ROC曲線
(四)響應率和捕獲率
(二)和(三)的準確率定義基本能解決建模過程中的準確率需要,但是像客戶展示的時候,上面兩種定義很難被客戶理解,造成不和諧。因此再添加響應率和捕獲率的定義。
比如邏輯回歸和svm,可以輸出該樣本為目標樣本的概率值嘛,然後就整理一下結果,形成一列實際值,一列預測值 這樣的數據集。
以識別“客戶對服務不滿意”為目標,將數據集按照預測為“不滿意”的概率值 降序 排序。
(1)分別統計前10%、20%、……100%的樣本中,它們的實際不滿意率(到100%就會接近自然情況的不滿意率),這就是響應率,按照這個列表可以看到模型對於目標識別的效果提升。
(2)分別統計前10%、20%、……100%的樣本中,它們的不滿意樣本數量在全部不滿意樣本數量中的占比,這就是捕獲率,可以知道處理幾成的數據就可以解決大部分問題(結合二八法則)。
最終會形成個圖形
a=響應率,指該占比的樣本中的不滿意率。模型效果好的話,前面的就會更高。
b=自然不滿意率,就是全部樣本的平均不滿意率。
c=捕獲率,指該占比的不滿意樣本中占全部不滿意樣本的比率,弧度越大越好。
計算的話目前我沒有查有沒有包(估計有),我簡單用加減乘除算了:
dat.log2 <- arrange(dat.log,desc(dat.log$prob))
dat.log2 <- na.omit(dat.log2)
n0=nrow(dat.log2)/10n1=ceiling(1*n0)
n2=ceiling(2*n0)
n3=ceiling(3*n0)
n4=ceiling(4*n0)
n5=ceiling(5*n0)
n6=ceiling(6*n0)
n7=ceiling(7*n0)
n8=ceiling(8*n0)
n9=ceiling(9*n0)
n10=ceiling(10*n0)d1=dat.log2[1:n1,]
d2=dat.log2[1:n2,]
d3=dat.log2[1:n3,]
d4=dat.log2[1:n4,]
d5=dat.log2[1:n5,]
d6=dat.log2[1:n6,]
d7=dat.log2[1:n7,]
d8=dat.log2[1:n8,]
d9=dat.log2[1:n9,]
d10=dat.log2[1:n10,]#[0,10%] de bu man yi du
a1=sum(d1$BMY)/nrow(d1)
a2=sum(d2$BMY)/nrow(d2)
a3=sum(d3$BMY)/nrow(d3)
a4=sum(d4$BMY)/nrow(d4)
a5=sum(d5$BMY)/nrow(d5)
a6=sum(d6$BMY)/nrow(d6)
a7=sum(d7$BMY)/nrow(d7)
a8=sum(d8$BMY)/nrow(d8)
a9=sum(d9$BMY)/nrow(d9)
a10=sum(d10$BMY)/nrow(d10)log.xy=rbind.data.frame(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
names(log.xy)=c("XYL")b1=sum(d1$BMY)/sum(d10$BMY)
b2=sum(d2$BMY)/sum(d10$BMY)
b3=sum(d3$BMY)/sum(d10$BMY)
b4=sum(d4$BMY)/sum(d10$BMY)
b5=sum(d5$BMY)/sum(d10$BMY)
b6=sum(d6$BMY)/sum(d10$BMY)
b7=sum(d7$BMY)/sum(d10$BMY)
b8=sum(d8$BMY)/sum(d10$BMY)
b9=sum(d9$BMY)/sum(d10$BMY)
b10=sum(d10$BMY)/sum(d10$BMY)
log.bh=rbind.data.frame(b1,b2,b3,b4,b5,b6,b7,b8,b9,b10)
names(log.bh)=c("BHL")
不知道還有沒有別的,先記在這裏。
分類模型效果評價