1. 程式人生 > >Alink漫談(八) : 二分類評估 AUC、K-S、PRC、Precision、Recall、LiftChart 如何實現

Alink漫談(八) : 二分類評估 AUC、K-S、PRC、Precision、Recall、LiftChart 如何實現

# Alink漫談(八) : 二分類評估 AUC、K-S、PRC、Precision、Recall、LiftChart 如何實現 [TOC] ## 0x00 摘要 Alink 是阿里巴巴基於實時計算引擎 Flink 研發的新一代機器學習演算法平臺,是業界首個同時支援批式演算法、流式演算法的機器學習平臺。二分類評估是對二分類演算法的預測結果進行效果評估。本文將剖析Alink中對應程式碼實現。 ## 0x01 相關概念 如果對本文某些概念有疑惑,可以參見之前文章 [[白話解析] 通過例項來梳理概念 :準確率 (Accuracy)、精準率(Precision)、召回率(Recall) 和 F值(F-Measure)](https://www.cnblogs.com/rossiXYZ/p/13166899.html) ## 0x02 示例程式碼 ```java public class EvalBinaryClassExample { AlgoOperator getData(boolean isBatch) { Row[] rows = new Row[]{ Row.of("prefix1", "{\"prefix1\": 0.9, \"prefix0\": 0.1}"), Row.of("prefix1", "{\"prefix1\": 0.8, \"prefix0\": 0.2}"), Row.of("prefix1", "{\"prefix1\": 0.7, \"prefix0\": 0.3}"), Row.of("prefix0", "{\"prefix1\": 0.75, \"prefix0\": 0.25}"), Row.of("prefix0", "{\"prefix1\": 0.6, \"prefix0\": 0.4}") }; String[] schema = new String[]{"label", "detailInput"}; if (isBatch) { return new MemSourceBatchOp(rows, schema); } else { return new MemSourceStreamOp(rows, schema); } } public static void main(String[] args) throws Exception { EvalBinaryClassExample test = new EvalBinaryClassExample(); BatchOperator batchData = (BatchOperator) test.getData(true); BinaryClassMetrics metrics = new EvalBinaryClassBatchOp() .setLabelCol("label") .setPredictionDetailCol("detailInput") .linkFrom(batchData) .collectMetrics(); System.out.println("RocCurve:" + metrics.getRocCurve()); System.out.println("AUC:" + metrics.getAuc()); System.out.println("KS:" + metrics.getKs()); System.out.println("PRC:" + metrics.getPrc()); System.out.println("Accuracy:" + metrics.getAccuracy()); System.out.println("Macro Precision:" + metrics.getMacroPrecision()); System.out.println("Micro Recall:" + metrics.getMicroRecall()); System.out.println("Weighted Sensitivity:" + metrics.getWeightedSensitivity()); } } ``` 程式輸出 ```java RocCurve:([0.0, 0.0, 0.0, 0.5, 0.5, 1.0, 1.0],[0.0, 0.3333333333333333, 0.6666666666666666, 0.6666666666666666, 1.0, 1.0, 1.0]) AUC:0.8333333333333333 KS:0.6666666666666666 PRC:0.9027777777777777 Accuracy:0.6 Macro Precision:0.3 Micro Recall:0.6 Weighted Sensitivity:0.6 ``` 在 Alink 中,二分類評估有批處理,流處理兩種實現,下面一一為大家介紹( Alink 複雜之一在於大量精細的資料結構,所以下文會大量列印程式中變數以便大家理解)。 ### 2.1 主要思路 - 把 [0,1] 分成假設 100000個桶(bin)。所以得到positiveBin / negativeBin 兩個100000的陣列。 - 根據輸入給positiveBin / negativeBin賦值。positiveBin就是 TP + FP,negativeBin就是 TN + FN。這些是後續計算的基礎。 - 遍歷bins中每一個有意義的點,計算出totalTrue和totalFalse,並且在每一個點上計算該點的混淆矩陣,tpr,以及rocCurve,recallPrecisionCurve,liftChart在該點對應的資料; - 依據曲線內容計算並且儲存 AUC/PRC/KS 具體後續還有詳細呼叫關係綜述。 ## 0x03 批處理 ### 3.1 EvalBinaryClassBatchOp EvalBinaryClassBatchOp是二分類評估的實現,功能是計算二分類的評估指標(evaluation metrics)。 輸入有兩種: - label column and predResult column - label column and predDetail column。如果有predDetail,則predResult被忽略 我們例子中 `"prefix1"` 就是 label,`"{\"prefix1\": 0.9, \"prefix0\": 0.1}"` 就是 predDetail ```java Row.of("prefix1", "{\"prefix1\": 0.9, \"prefix0\": 0.1}") ``` 具體類摘錄如下: ```java public class EvalBinaryClassBatchOp extends BaseEvalClas