ROC和AUC也不是评估机器学习性能的金标准
承接:樣本分布不平衡,機器學習準確率高又有什么用?
對于不平衡數據集,AUC值是分類器效果評估的常用標準。但如果在解釋時不仔細,它也會有一些誤導。以Davis and Goadrich (2006)中的模型為例。如圖所示,左側展示的是兩個模型的ROC曲線,右側展示的是precision-recall曲線 (PRC)。
Precision值和Recall值是既矛盾又統一的兩個指標,為了提高Precision值,分類器需要盡量在“更有把握”時才把樣本預測為正樣本,但此時往往會因為過于保守而漏掉很多“沒有把握”的正樣本,導致Recall值降低。
RPC的橫軸是召回率,縱軸是精準率。對于一個分類模型來說,其PRC線上的一個點代表著,在某一閾值下,模型將大于該閾值的結果判定為正樣本,小于該閾值的結果判定為負樣本,此時返回結果對應的召回率和精準率。整條PRC曲線是通過將閾值從高到低移動而生成的。
上圖是PRC曲線樣例圖,其中實線代表模型A的PRC曲線,虛線代表模型B的PRC曲線。原點附近代表當閾值最大時模型的精準率和召回率 (閾值越大,鑒定出的樣品越真,能鑒定出的樣品越少)。
模型1 (Curve 1)的AUC值為0.813, 模型2 (Curve 2)的AUC值為0.875, 從AUC值角度看模型2更優一點。但是右側的precision-recall曲線卻給出完全不同的結論。模型1 (precision-recall Curve 1)下的面積為0.513,模型2 (precision-recall Curve 2)下的面積為0.038。模型1在較低的假陽性率(FPR<0.2)時有較高的真陽性率。
我們再看另一個關于ROC曲線誤導性的例子 Fawcett (2005). 這里有兩套數據集:一套為平衡數據集(兩類分組為1:1關系),一套為非平衡數據集(兩類分組為10:1關系)。每套數據集分別構建2個模型并繪制ROC曲線,從Fig \ref(fig:rocprbalanceimbalance) a,c 可以看出,數據集是否平衡對ROC曲線的影響很小。只是在兩個模型之間有一些差別,實線代表的模型在假陽性率較低時 (FPR<0.1)真陽性率低于虛線代表的模型。但precision-recall curve (PRC)曲線卻差別很大。對于平衡數據集,兩個模型的召回率 (recall)和精準率precision都比較好。對于非平衡數據集,虛線代表的分類模型在較低的召回率時就有較高的精準率。
因此,Saito and Rehmsmeier (2015)推薦在處理非平衡數據集時使用PRC曲線,它所反映的信息比ROC曲線更明確。
我們對前面5個模型計算下AUPRC,與AUC結果基本吻合,up效果最好,其次是weighted, smote, down和original。值得差距稍微拉大了一些。
library("PRROC") calc_auprc <- function(model, data){index_class2 <- data$Class == minorityClassindex_class1 <- data$Class == majorityClasspredictions <- predict(model, data, type = "prob")pr.curve(predictions[[minorityClass]][index_class2],predictions[[minorityClass]][index_class1],curve = TRUE)}# Get results for all 5 modelsmodel_list_pr <- model_list %>%map(calc_auprc, data = imbal_test)model_list_pr %>%map(function(the_mod) the_mod$auc.integral)計算的AUPRC值如下(越大越好)
## $original ## [1] 0.5155589 ## ## $weighted ## [1] 0.640687 ## ## $down ## [1] 0.5302778 ## ## $up ## [1] 0.6461067 ## ## $SMOTE ## [1] 0.6162899我們繪制PRC曲線觀察各個模型的分類效果。基于選定的分類閾值,up sampling和weighting有著最好的精準率和召回率 (單個分組的準確率)。而原始分類器則效果最差。
假如加權分類器在召回率 (recall)為75%時,精準率可以達到50% (下面曲線中略低于50%),則F1得分為0.6。
原始分類器在召回率為75%時,精準率為25% (下面曲線略高于25%),則F1得分為0.38。
也就是說,當構建好了這兩個分類器,并設置一個分類閾值 (不同模型的閾值不同)后,都可以在樣品少的分組中獲得75%的召回率。但是對于加權模型,有50%的預測為屬于樣品少的分組的樣品是預測對的。而對于原始模型,只有25%預測為屬于樣品少的分組的樣品是預測對的。
# Plot the AUPRC curve for all 5 modelsresults_list_pr <- list(NA) num_mod <- 1for(the_pr in model_list_pr){results_list_pr[[num_mod]] <- data_frame(recall = the_pr$curve[, 1],precision = the_pr$curve[, 2],model = names(model_list_pr)[num_mod])num_mod <- num_mod + 1}results_df_pr <- bind_rows(results_list_pr)results_df_pr$model <- factor(results_df_pr$model, levels=c("original", "down","SMOTE","up","weighted"))# Plot ROC curve for all 5 modelscustom_col <- c("#000000", "#009E73", "#0072B2", "#D55E00", "#CC79A7")ggplot(aes(x = recall, y = precision, group = model), data = results_df_pr) +geom_line(aes(color = model), size = 1) +scale_color_manual(values = custom_col) +geom_abline(intercept =sum(imbal_test$Class == minorityClass)/nrow(imbal_test),slope = 0, color = "gray", size = 1) +theme_bw(base_size = 18) + coord_fixed(1)基于AUPRC進行調參,修改參數summaryFunction = prSummary和metric = "AUC"。參考https://topepo.github.io/caret/measuring-performance.html (或者看之前的推文)。
# Set up control function for training ctrlprSummary <- trainControl(method = "repeatedcv",number = 10,repeats = 5,summaryFunction = prSummary,classProbs = TRUE)# Build a standard classifier using a gradient boosted machineset.seed(5627) orig_fit2 <- train(Class ~ .,data = imbal_train,method = "gbm",verbose = FALSE,metric = "AUC",trControl = ctrlprSummary)# Use the same seed to ensure same cross-validation splits ctrlprSummary$seeds <- orig_fit$control$seeds# Build weighted modelweighted_fit2 <- train(Class ~ .,data = imbal_train,method = "gbm",verbose = FALSE,weights = model_weights,metric = "AUC",trControl = ctrlprSummary)# Build down-sampled modelctrlprSummary$sampling <- "down"down_fit2 <- train(Class ~ .,data = imbal_train,method = "gbm",verbose = FALSE,metric = "AUC",trControl = ctrlprSummary)# Build up-sampled modelctrlprSummary$sampling <- "up"up_fit2 <- train(Class ~ .,data = imbal_train,method = "gbm",verbose = FALSE,metric = "AUC",trControl = ctrlprSummary)# Build smote model ctrlprSummary$sampling <- "smote"smote_fit2 <- train(Class ~ .,data = imbal_train,method = "gbm",verbose = FALSE,metric = "AUC",trControl = ctrlprSummary)model_list2 <- list(original = orig_fit2,weighted = weighted_fit2,down = down_fit2,up = up_fit2,SMOTE = smote_fit2)評估下基于prSummary調參后模型的性能,SMOTE處理后的模型效果有提升,其它模型相差不大。
model_list_pr2 <- model_list2 %>%map(calc_auprc, data = imbal_test)model_list_pr2 %>%map(function(the_mod) the_mod$auc.integral)計算的AUPRC值如下(越大越好)
## $original ## [1] 0.5155589 ## ## $weighted ## [1] 0.640687 ## ## $down ## [1] 0.5302778 ## ## $up ## [1] 0.6461067 ## ## $SMOTE ## [1] 0.6341753繪制PRC曲線
# Plot the AUPRC curve for all 5 modelsresults_list_pr <- list(NA) num_mod <- 1for(the_pr in model_list_pr2){results_list_pr[[num_mod]] <- data_frame(recall = the_pr$curve[, 1],precision = the_pr$curve[, 2],model = names(model_list_pr)[num_mod])num_mod <- num_mod + 1}results_df_pr <- bind_rows(results_list_pr)results_df_pr$model <- factor(results_df_pr$model, levels=c("original", "down","SMOTE","up","weighted"))# Plot ROC curve for all 5 modelscustom_col <- c("#000000", "#009E73", "#0072B2", "#D55E00", "#CC79A7")ggplot(aes(x = recall, y = precision, group = model), data = results_df_pr) +geom_line(aes(color = model), size = 1) +scale_color_manual(values = custom_col) +geom_abline(intercept =sum(imbal_test$Class == minorityClass)/nrow(imbal_test),slope = 0, color = "gray", size = 1) +theme_bw(base_size = 18) + coord_fixed(1)PRC和AUPRC是處理非平衡數據集的有效衡量方式。基于AUC指標來看,權重和重采樣技術只帶來了微弱的性能提升。但是這個改善更多體現在可以在較低假陽性率基礎上獲得較高真陽性率,模型的性能更均勻提升。在處理非平衡樣本學習問題時,除了嘗試調整權重和重采樣之外,也不能完全依賴AUC值,而是依靠PRC曲線聯合判斷,以期獲得更好的效果。
References
http://pages.cs.wisc.edu/~jdavis/davisgoadrichcamera2.pdf
http://people.inf.elte.hu/kiss/11dwhdm/roc.pdf
http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0118432
https://dpmartin42.github.io/posts/r/imbalanced-classes-part-2
https://zhuanlan.zhihu.com/p/64963796
機器學習系列教程
從隨機森林開始,一步步理解決策樹、隨機森林、ROC/AUC、數據集、交叉驗證的概念和實踐。
文字能說清的用文字、圖片能展示的用、描述不清的用公式、公式還不清楚的寫個簡單代碼,一步步理清各個環節和概念。
再到成熟代碼應用、模型調參、模型比較、模型評估,學習整個機器學習需要用到的知識和技能。
一圖感受各種機器學習算法
機器學習算法 - 隨機森林之決策樹初探(1)
機器學習算法-隨機森林之決策樹R 代碼從頭暴力實現(2)
機器學習算法-隨機森林之決策樹R 代碼從頭暴力實現(3)
機器學習算法-隨機森林之理論概述
機器學習算法-隨機森林初探(1)
機器學習 - 隨機森林手動10 折交叉驗證
機器學習 模型評估指標 - ROC曲線和AUC值
機器學習 - 訓練集、驗證集、測試集
一個函數統一238個機器學習R包,這也太贊了吧
基于Caret和RandomForest包進行隨機森林分析的一般步驟 (1)
Caret模型訓練和調參更多參數解讀(2)
基于Caret進行隨機森林隨機調參的4種方式
機器學習第17篇 - 特征變量篩選(1)
機器學習第18篇 - Boruta特征變量篩選(2)
機器學習第19篇 - 機器學習系列補充:數據集準備和更正YSX包
機器學習第20篇 - 基于Boruta選擇的特征變量構建隨機森林
機器學習第21篇 - 特征遞歸消除RFE算法 理論
機器學習第22篇 - RFE篩選出的特征變量竟然是Boruta的4倍之多
機器學習第23篇 - 更多特征變量卻未能帶來隨機森林分類效果的提升
機器學習相關書籍分享
UCI機器學習數據集
送你一個在線機器學習網站,真香!
多套用于機器學習的多種癌癥表達數據集
這個統一了238個機器學習模型R包的參考手冊推薦給你
莫煩Python機器學習
機器學習與人工智能、深度學習有什么關系?終于有人講明白了
一套完整的基于隨機森林的機器學習流程(特征選擇、交叉驗證、模型評估))
隨機森林預測發現這幾個指標對公眾號文章吸粉最重要
樣本分布不平衡,機器學習準確率高又有什么用?
值得思考,機器學習模型做出的決策是你想要的嗎?
33萬字!深度學習筆記在線版發布!
往期精品(點擊圖片直達文字對應教程)
機器學習
后臺回復“生信寶典福利第一波”或點擊閱讀原文獲取教程合集
總結
以上是生活随笔為你收集整理的ROC和AUC也不是评估机器学习性能的金标准的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一网打进Linux下那些查找命令
- 下一篇: iBiology |专业的生信科普网站