模型评估指标知识整理

基础知识

  • 统计项
    • TP:预测y‘=1,预测正确,即实际y=1
    • FP:预测y‘=1,预测错误,即实际y=0
    • FN:预测y‘=0,预测错确,即实际y=1
    • TN:预测y‘=0,预测正确,即实际y=0
    • P代表预测结果为1,N代表预测结果为0,T代表预测正确,F代表预测错误
    • 1代表正样本,0代表负样本,本文后续不做说明
    • sklearn.metrics.confusion_matrix可以直接输出上述统计项,输出格式是:
预测0 预测1
实际0 TN FP
实际1 FN TP
  • 统计指标

    指标 名称 统计方式 概率表示 python
    acc 准确率 (TP+TN)/(TP+FP+FN+TN) sklearn.metrics.accuracy_score
    precision 精准率,精确率,查准率 TP/(TP+FP) p(y=1|y’=1) sklearn.metrics.precision_score
    TPR(recall) 召回率,真阳率,真正率,查全率,灵敏度 TP/(TP+FN) p(y’=1|y=1) sklearn.metrics.recall_score
    FPR 假阳率,假正率,1-特异度 FP/(FP+TN) p(y’=1|y=0)
    TNR 特异度,真负率 TN/(FP+TN) p(y’=0|y=0)
    FNR 假负率 FN/(TP+FN) p(y’=0|y=1)
    • 要注意准确率(acc)和精确率(precision)的差别,只一字之差,但含义完全不一样,前者是所有样本的预测准确率,而后者只是看正样本的预测精确率
    • sklearn.metrics.classification_report,可以直接输出precision,recall,F1(下面说明),以及support(相应类别的样本数)

综合评价指标

  • F1值

    • F 1 = 2 ∗ p r e c i s i o n ∗ r e c a l l / ( p r e c i s i o n + r e c a l l ) F1=2 * precision * recall/(precision+recall) F1=2precisionrecall/(precision+recall),查全率和查准率的调和平均值,两个值同时大的时候,F1才会值比较大
    • 业务解释
      • 高精度(查准率)+高召回率(查全率):模型能够很好地检测该类;
      • 高精度(查准率)+低召回率(查全率):模型不能很好地检测该类,但是在它检测到这个类时,判断结果是高度可信的;
      • 低精度(查准率)+高召回率(查全率):模型能够很好地检测该类,但检测结果中也包含其他类的点;
      • 低精度(查准率)+低召回率(查全率):模型不能很好地检测该类。
    • sklearn.metrics.f1_score
    from sklearn.metrics import f1_score
    print(f1_score(y_true, y_pred))
    
  • ROC曲线

    • 横坐标:FPR(假阳率);纵坐标:TPR(recall,真阳率)
    • 计算方式:先将样本按照模型输出的概率进行降序排序,然后从大到小选择阈值(根据样本的输出概率值,大于阈值的为正样本,小于的则为负样本),每次选择一个阈值就可以根据该阈值计算当前的TPR和FPR,于是得到了一个ROC曲线的点。
    • ROC-AUC(一般简称AUC):ROC曲线下面的面积,可用于表达该模型在不同阈值的情况下的综合效果。ROC曲线的对角线(此时AUC=0.5)代表的是随机猜测的效果,此时正负样本在每个阈值分段范围内都是均匀分布的,即数量相同)。ROC-AUC代表着分别随机从正负样本集中抽取一个正样本,一个负样本,正样本的预测值大于负样本的概率。具体计算ROC-AUC值有更简洁的办法,参考AUC计算方法总结
    from sklearn.metrics import roc_curve
    from sklearn.metrics import roc_auc_score
    import matplotlib.pyplot as plt
    fpr, tpr, thresholds = roc_curve(y, scores, pos_label=1) # pos_label可用于指定正样本
    plt.plot(tpr,fpr) # 画ROC曲线
    print(roc_auc_score(y, scores, pos_label=1)) # 计算ROC-AUC值
    
  • PRC曲线(或者叫PR曲线)

    • 横坐标:TPR(recall);纵坐标:precision
    • PRC-AUC(可简称PR值):PRC曲线下方的面积也可以用来代表模型效果,实际sklearn中的实现并不是计算的真的面积。
    • average_precision_score
    from sklearn.metrics import average_precision_score
    from sklearn.metrics import precision_recall_curve
    import matplotlib.pyplot as plt
    precisions,recalls,thresholds=precision_recall_curve(y_true,y_score, pos_label=1)
    plt.plot(precisions,recalls) # 画PR曲线
    print(average_precision_score(y_true,y_score, pos_label=1)) # 计算PRC-AUC,实际上计算的是AP(average precision)值
    
  • PRC-AUC VS ROC-AUC

    1. PRC-AUC会受到正负比例的影响,即模型不变的情况下,测试样本的正负比例会影响其值,而ROC-AUC不会。
    2. 在正负比例不平衡的情况下,ROC-AUC会给出相对乐观的估计,而PRC-AUC不会。此时ROC-AUC也可以用于模型对比
    • PRC-AUC比ROC-AUC更好,本质上不是因为样本数量不平衡,而是损失函数L(y,y’)中L(y=0,y’=0)=0 ,也就是true negative是没有价值的(曲线不同位置的面积并不能简单等价)。这种情况你需要做的是明确你需要的recall/precision的 tradeoff应该是多少,这种情况下当然PRC更好用。
    • 直观理解:ROC曲线的横轴采用FPR,纵轴采用TPR,在类别不平衡的背景下,当负例N的数量远超正例P时,FP的大幅增长只能换来FPR的微小改变,而TPR跟负样本无关。结果是虽然大量负例被错判成正例,在ROC曲线上却无法直观地看出来,因此给出了一个非常乐观的估计。(当然也可以只分析ROC曲线左边一小段)
  • 多分类中average参数的使用

    • 二分类中该参数会被忽略
    • 宏平均(macro):先对每个类别单独计算目标值(如F1),再取这些值的算术平均值作为全局指标。
    • 微平均(micro):先累加计算各个类别的TP、TN、FP、FN的值,再由这些值求出目标值(如F1)
    • 由两种平均的计算方式不难看出,宏平均平等对待每一个类别,所以它的值主要受到稀有类别的影响,而微平均平等考虑每个样本,所以它的值受到常见类别的影响比较大

指标选择

一切都要以业务优化方向为指导目标,脱离业务谈指标基本上都是耍无赖

  1. 所有样本都要求准确,重要性完全一样:用准确率acc
  2. 更看重正样本的召回率,那么召回率大于精确率(查全率)(或大于指定业务阈值)作为限制条件,再比较F1(模型筛选阶段使用PR值作为参考)。比如欺诈检测
  3. 更看重正样本的精确率(查全率),那么精确率(查全率)大于召回率(或大于指定业务阈值)作为限制条件,再比较F1(模型筛选阶段使用PR值作为参考)。比如垃圾邮件过滤
  4. 如果最终业务目标是排序,那么选择ROC-AUC。比如点击率预估
  5. 如果最终的业务出现正负比例随着时间(或其他因素)变化,那么选择ROC-AUC。比如点击率预估
参考文献

精确率、召回率、F1 值、ROC、AUC 各自的优缺点是什么?
pr-curve
机器学习之类别不平衡问题 (2) —— ROC和PR曲线
分类问题模型的评估
如何理解机器学习和统计中的AUC?
评估分类模型
AUC计算方法总结

你可能感兴趣的:(机器学习基础知识)