1. 程式人生 > >分類器評價與在R中的實現:收益圖與提升圖

分類器評價與在R中的實現:收益圖與提升圖

分類模型評價一般有以下幾種方法:混淆矩陣(Confusion Matrix)、收益圖(Gain Chart)、提升圖(Lift Chart)、KS圖(KS Chart)、接受者操作特性曲線(ROC Chart)。“分類模型評價與在R中的實現”系列中將逐個介紹。

上篇介紹最基礎的混淆矩陣
本篇介紹收益圖(Gain Chart)與提升圖(Lift Chart)。

一、收益圖/提升圖簡介

回顧上篇,混淆矩陣評價的是模型在總體樣本的表現。下面介紹的收益/提升圖評估的是模型捕捉到的所有正響應,對比真實分類情況的表現。

模型捕捉到的正響應是用什麼來表示呢?回顧混淆矩陣可組合出的指標RPP(Rate of positive predictions) = (TP+FP)/(P+N),正是所有預測中,預測為正的比例。根據不同的閥值,RPP的範圍為[0,1]。自然地,這收益圖/提升圖的公共橫軸為累計RPP。

縱軸需要評價模型在預測為正的事件中,正確的概率。也就是模型的TPR(True Positive Rate),此間的TPR也可稱為收益值(Gain Value)。提升值(Lift Value)則進一步考慮了在某個RPP下的TPR的這個相對性概念,用TPR/RPP計算。

二、在R中計算收益/提升表、作圖

1 直接計算

舉一個最簡單的例子說明。還是和上次一樣用ROCR包中的ROCR.simple資料,為了方便檢視,只取前10條。

require(ROCR)
data(ROCR.simple)
data <- as.data.frame(ROCR.simple)[1:10, ]

按照以下步驟計算gain/lift值:

  1. 按預測分值對資料集排序
  2. 用當前行號/總行數當做Rate of Positive
  3. 計算TPR
  4. 用TPR列與RPP列計算Lift值
data <- data[order(data[, 1], decreasing = TRUE), ]
data$rpp <- row(data[, 1, drop = FALSE])/nrow(data)
data$target_cum <- cumsum(data[, "labels"])
data$tpr <- data$target_cum/sum(data[, "labels"])
data$lift <- data$tpr/data$rpp
data
##    predictions labels rpp target_cum    tpr   lift
## 7       0.9706      1 0.1          1 0.1667 1.6667
## 8       0.8902      1 0.2          2 0.3333 1.6667
## 10      0.8688      0 0.3          2 0.3333 1.1111
## 9       0.7818      1 0.4          3 0.5000 1.2500
## 1       0.6125      1 0.5          4 0.6667 1.3333
## 3       0.4321      0 0.6          4 0.6667 1.1111
## 5       0.3849      0 0.7          4 0.6667 0.9524
## 2       0.3643      1 0.8          5 0.8333 1.0417
## 6       0.2444      1 0.9          6 1.0000 1.1111
## 4       0.1403      0 1.0          6 1.0000 1.0000

有了如上結果,將RPP放橫軸,TPR/Lift放縱軸分別畫出收益圖和提升圖。

par(mfrow = c(1, 2))
plot(data$rpp, data$tpr, type = "l", main = "Gain Chart")
plot(data$rpp, data$lift, type = "l", main = "Lift Chart")

plot of chunk unnamed-chunk-1

2 用ROCR包畫圖

用ROCR的prediction()和performance()函式可以很簡單地將模型結果轉化為評價可以直接使用的指標。這次以ROCR.simple所有資料為例。

require(ROCR)
data(ROCR.simple)
pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)
par(mfrow = c(1, 2))
gain <- performance(pred, "tpr", "rpp")
plot(gain, main = "Gain Chart")
lift <- performance(pred, "lift", "rpp")
plot(lift, main = "Lift Chart")

plot of chunk unnamed-chunk-1

對於收益圖,理想的收益圖應快速達到很高的累計收益值,並很快趨於100%;理想的提升圖應該在很高的提升值上保持一段,或緩慢下降一段,然後迅速下降到1。根據上面兩個圖,可以做出結論,如果我們選擇20%的RPP,那麼模型的真正率約為35%左右(收益圖),將比不使用任何模型獲得約1.7倍的正迴應(提升圖)。

from: http://iccm.cc/classification-model-evaluation-gain-chart-lift-chart/