目录
1.5 P-R曲线(Precision-Recall Curve)
一、分类评估指标
- 精度 Accuracy
- 混淆矩阵 Confusion Matrix
- 准确率(查准率) Precision
- 召回率(查全率)Recall
- Fβ Score
- AUC Area Under Curve
- KS Kolmogorov-Smirnov
1.1精度 Acc
预测正确的样本的占总样本的比例,取值范围为[0,1],取值越大,模型预测能力越好。
其中:
精度评价指标对平等对待每个类别,即每一个样本判对 (0) 和判错 (1) 的代价都是一样的。
问题: 精度有什么缺陷?什么时候精度指标会失效?
- 对于有倾向性的问题,往往不能用精度指标来衡量。
- 比如,判断空中的飞行物是导弹还是其他飞行物,很显然为了减少损失,我们更倾向于相信是导弹而采用相应的防护措施。此时判断为导弹实际上是其他飞行物与判断为其他飞行物实际上是导弹这两种情况的重要性是不一样的;
- 对于样本类别数量严重不均衡的情况,也不能用精度指标来衡量。
- 比如银行客户样本中好客户990个,坏客户10个。如果一个模型直接把所有客户都判断为好客户,得到精度为99%,但这显然是没有意义的。
对于以上两种情况,单纯根据Accuracy来衡量算法的优劣已经失效。这个时候就需要对目标变量的真实值和预测值做更深入的分析。
1.2混淆矩阵 Confusion Matrix
混淆矩阵又被称为错误矩阵,是除了ROC曲线和AUC之外的另一个判断分类好坏程度的方法。下面给出二分类的混淆矩阵:
预测值 正 | 预测值 负 | |
真实值 正 | True Positive(TP) | False Negative(FN) |
真实值 负 | False Positive(FP) | True Negative(TN) |
如上表,可以将结果分为四类:
真正例(True Positive, TP):真实类别为正例,预测类别为正例;
假负例(False Negative, FN):真实类别为正例,预测类别为负例;
假正例(False Positive, FP):真实类别为负例,预测类别为正例 ;
真负例(True Negative, TN):真实类别为负例,预测类别为负例;
进一步可以推出这些指标:
真正率(True Positive Rate, TPR),又名灵敏度(Sensitivity):被预测为正的正样本数 / 正样本实际数,即:
假负率(False Negative Rate, FNR):被预测为负的正样本数/正样本实际数,即:
假正率(False Positive Rate, FPR):被预测为正的负样本数/负样本实际数,即:
真负率(True Negative Rate, TNR),特异度(Specificity):被预测为负的负样本数/负样本实际数,即:
进一步,由混淆矩阵可以计算以下评价指标:
正确率(Accuracy):分类正确的样本数/所有样本数量,即:
平均准确率(Average per-class accuracy):每个类别下的准确率的算术平均,即:
错误率:分类错误的样本/所有样本的数量,即:
1.3准确率与召回率
准确率又称查准率,预测为真正例(TP)占真正例与伪真例(TP+FP)的百分比。
计算公式:
召回率又称为查全率,预测为真正例(TP)占真正例与伪负例(TP+FN)的百分比
计算公式:
1.4 F1 Score和Fβ Score
- Fβ Score
Precision和Recall 是互相影响的,理想情况下肯定是做到两者都高,但是一般情况下Precision高、Recall 就低, Recall 高、Precision就低。为了均衡两个指标,我们可以采用Precision和Recall的加权调和平均(weighted harmonic mean)来衡量,即Fβ Score,公式如下:
β表示权重:
通俗的语言就是:β 越大,Recall的权重越大, 越小,Precision的权重越大。
由于Fβ Score 无法直观反映数据的情况,同时业务含义相对较弱,实际工作用到的不多。
其中,β>1时,查全率更有影响;β=1时,退化为标准的F1;β<1时,查准率更有影响。
- F1 Score
精确率(Precision)和召回率(Recall)的调和平均数,最大为1,最小为0
F1值的一般形式为差准率和查全率的调和均值。 是分类与信息检索中最常用的指标之一。
1.5 P-R曲线(Precision-Recall Curve)
P-R曲线又称为精确率(Precision)和召回率(Recall)变化的曲线
如果取多个不同的阈值,就可以得到多组(R,P)。将这些坐标点(R,P)绘制在坐标上,然后将各坐标点用曲线连起来,即可得到PR曲线。
1.6 ROC 和 AUC
- ROC曲线
真正率(TPR): 识别对了的正例(TP)占实际总正例的比例,实际计算值跟召回率相同。
计算公式:TPR =TP/(TP+ FN)
假正率(FPR): 识别错了的正例(FP)占实际总负例的比例。也可以说,误判的负例(实际是负例,没有判对)占实际总负例的比例。
计算式如下:FPR =FP/(FP+ TN)
以FPR为横轴,TPR为纵轴,绘制得到的曲线就是ROC曲线,一般来说,ROC曲线越靠近左上方越好。
结论:ROC曲线越光滑,过拟合程度越小。绿线分类模型的整体性能要优于红线分类模型。
- AUC
AUC 值为 ROC 曲线所覆盖的区域面积,显然,AUC越大,分类器分类效果越好。
AUC的物理意义:
AUC的物理意义正样本的预测结果大于负样本的预测结果的概率。所以AUC反应的是分类器对样本的排序能力。另外值得注意的是,AUC对样本类别是否均衡并不敏感,这也是不均衡样本通常用AUC评价分类器性能的一个原因。
1.7 KS(Kolmogorov-Smirnov)
KS值是在模型中用于区分预测正负样本分隔程度的评价指标,一般应用于金融风控领域。
与ROC曲线相似,ROC是以FPR作为横坐标,TPR作为纵坐标,通过改变不同阈值,从而得到ROC曲线。
而在KS曲线中,则是以阈值作为横坐标,以FPR和TPR作为纵坐标,ks曲线则为TPR-FPR,ks曲线的最大值通常为ks值。
为什么这样求KS值呢?我们知道,当阈值减小时,TPR和FPR会同时减小,当阈值增大时,TPR和FPR会同时增大。而在实际工程中,我们希望TPR更大一些,FPR更小一些,即TPR-FPR越大越好,即ks值越大越好。
可以理解TPR是收益,FPR是代价,ks值是收益最大。图中绿色线是TPR、蓝色线是FPR。
KS统计量计算公式:KS = abs(FPR - TPR).max()
1.8代码样例
## 混淆矩阵
from sklearn.metrics import confusion_matrix
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 0]
print('混淆矩阵:', confusion_matrix(y_true, y_pred))
# 准确率(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))
# 精确率(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))
# P-R曲线
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 1, 1]
y_true = [0, 1, 1, 0, 1, 0, 1, 1, 0, 1]
precision, recall, thresholds = precision_recall_curve(y_true, y_pred)
plt.plot(precision, recall)
# ROC曲线
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, 0, 1]
FPR, TPR, thresholds = roc_curve(y_true, y_pred)
plt.title('ROC')
plt.plot(FPR, TPR, 'b')
plt.plot([0, 1], [0, 1], 'r--')
plt.ylabel('TPR')
plt.xlabel('FPR')
# 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))
# KS值 在实际操作时往往使用ROC曲线配合求出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]
FPR, TPR, thresholds = roc_curve(y_true, y_pred)
KS = abs(FPR - TPR).max()
print('KS值:', KS)
二、回归评估指标
1、平均绝对误差(MAE)
2、均方误差(MSE)
3、均方根误差
4、R2拟合优度
说明:R²最大值为1。R²的值越接近1,说明回归直线对观测值的拟合程度越好;反之,R²的值越小,说明回归直线对观测值的拟合程度越差。
三、聚类评价指标
3.1兰德指数
兰德指数(Rand index)需要给定实际类别信息C,假设K是聚类结果,a表示在C与K中都是同类别的元素对数,b表示在C与K中都是不同类别的元素对数,则兰德指数为:
其中数据集中可以组成的总元素对数,RI取值范围为[0,1],值越大意味着聚类结果与真实情况越吻合。
对于随机结果,RI并不能保证分数接近零。为了实现“在聚类结果随机产生的情况下,指标应该接近零”,调整兰德系数(Adjusted rand index)被提出,它具有更高的区分度:
ARI取值范围为[−1,1],值越大意味着聚类结果与真实情况越吻合。从广义的角度来讲,ARI衡量的是两个数据分布的吻合程度。
3.2 互信息
互信息(Mutual Information)也是用来衡量两个数据分布的吻合程度。假设U与V是对N个样本标签的分配情况,则两种分布的熵(熵表示的是不确定程度)分别为:
其中 ,
U与V之间的互信息(MI)定义为:
其中, ,
标准化后的互信息(Normalized mutual information)为:
与ARI类似,调整互信息(Adjusted mutual information)定义为:
利用基于互信息的方法来衡量聚类效果需要实际类别信息,MI与NMI取值范围为[0,1],AMI取值范围为[−1,1],它们都是值越大意味着聚类结果与真实情况越吻合。
3.3 轮廓系数
轮廓系数(Silhouette coefficient)适用于实际类别信息未知的情况。对于单个样本,设a是与它同类别中其他样本的平均距离,b是与它距离最近不同类别中样本的平均距离,轮廓系数为:
对于一个样本集合,它的轮廓系数是所有样本轮廓系数的平均值。
轮廓系数取值范围是[−1,1],同类别样本越距离相近且不同类别样本距离越远,分数越高。
轮廓系数 sklearn.metrics.silhouette_score
轮廓系数的范围:[-1, 1]
一般情况下,当轮廓系数超过0.1(或者0)时,聚类效果就已经很好了。
一般轮廓系数很难超过0.7。
轮廓系数想要达到内部距离最小化,外部距离最大化。
参考资料: