机器学习指标解析:AUC与KS值
import numpy as np from sklearn.metrics import confusion_matrix y_pred [0, 1, 0, 1] # 模型预测结果 y_true [0, 1, 1, 0] # 真实标签 print(混淆矩阵:\n, confusion_matrix(y_true, y_pred)) # 输出 # [[1 1] # [1 1]] ## accuracy from sklearn.metrics import accuracy_score y_pred [0, 1, 0, 1] y_true [0, 1, 1, 0] print(ACC:, accuracy_score(y_true, y_pred)) # 输出 ACC: 0.5 ## Precision,Recall,F1-score from sklearn import metrics y_pred [0, 1, 0, 1] y_true [0, 1, 1, 0] print(Precision, metrics.precision_score(y_true, y_pred)) print(Recall, metrics.recall_score(y_true, y_pred)) print(F1-score:, metrics.f1_score(y_true, y_pred)) # 输出 # Precision 0.5 # Recall 0.5 # F1-score: 0.5简单案例分析真实标签y_true [0, 1, 1, 0]我们把0看作 “狗负类”1看作 “猫正类”所以真实样本是[狗, 猫, 猫, 狗]预测结果y_pred [0, 1, 0, 1]模型的判断是[狗, 猫, 狗, 猫]AUC 计算代码import numpy as np from sklearn.metrics import roc_auc_score y_true np.array([0, 0, 1, 1]) # 真实标签 y_scores np.array([0.1, 0.4, 0.35, 0.8]) # 模型预测的置信度分数 print(AUC socre:, roc_auc_score(y_true, y_scores)) # 输出AUC socre: 0.75y_true [0, 0, 1, 1]真实标签我们把0看作狗负类1看作猫正类。所以这里有 2 只狗、2 只猫。y_scores [0.1, 0.4, 0.35, 0.8]模型给每张图打的 “是猫的置信度”分数越高模型越认为它是猫。AUC 的全称是ROC 曲线下的面积它的本质含义是随机抽一只猫和一只狗模型给猫打的置信度分数比给狗打的分数高的概率。用这个例子验证一下所有「猫 vs 狗」的组合有2×24种猫 (0.8) vs 狗 (0.4)猫分数更高 ✅猫 (0.8) vs 狗 (0.1)猫分数更高 ✅猫 (0.35) vs 狗 (0.4)猫分数更低 ❌猫 (0.35) vs 狗 (0.1)猫分数更高 ✅猫分数更高的情况有 3 种所以 AUC 3/4 0.75怎么理解 AUC 数值AUC 越接近 1说明模型越能把猫和狗区分开几乎所有猫的分数都比狗高。AUC0.5 时模型和 “瞎猜” 没区别猫和狗的分数是随机的。AUC0.5 时模型反而把猫和狗搞反了相当于 “反向预测”二、第二部分KS 值 计算代码from sklearn.metrics import roc_curve y_pred [0, 1, 1, 0, 1, 1, 0, 1, 1, 1] y_true [0, 1, 1, 0, 1, 0, 1, 1, 1, 1] # 计算ROC曲线的FPR和TPR FPR, TPR, thresholds roc_curve(y_true, y_pred) # 计算KS值FPR和TPR之间的最大差值 KS abs(FPR - TPR).max() print(KS值: , KS) # 输出KS值: 0.5238095238095237TPR真正例率所有猫里被模型找出来的比例召回率FPR假正例率所有狗里被误判成猫的比例roc_curve函数会帮我们计算不同阈值下的FPR和TPR得到一组数据点。2. KS 值 到底算的是什么KS 值的全称是Kolmogorov-Smirnov 值它的定义是在所有可能的阈值下TPR 和 FPR 之间的最大差值。我们希望模型找猫的能力TPR尽量高误判狗的概率FPR尽量低。两者的差值TPR - FPR越大说明模型区分猫和狗的能力越强。KS 值就是这个差值的最大值代表模型区分正负样本的 “最强区分度”。