二元分类评价
混淆矩阵
对于二元分类,通常可以输出混淆矩阵,看预测的情况,并从中总结出一些指标,给予评价。
混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。具体评价指标有总体精度、制图精度、用户精度等,这些精度指标从不同的侧面反映了图像分类的精度。在人工智能中,混淆矩阵(confusion matrix)是可视化工具,特别用于监督学习,在无监督学习一般叫做匹配矩阵。在图像精度评价中,主要用于比较分类结果和实际测得值,可以把分类结果的精度显示在一个混淆矩阵里面。混淆矩阵是通过将每个实测像元的位置和分类与分类图像中的相应位置和分类相比较计算的。
以二元分类举例,混淆矩阵为:
混淆矩阵 | 实际为1 | 实际为0 |
---|---|---|
预测为1 | 100 | 2 |
预测为0 | 3 | 60 |
每个样本会对应一个预测值和一个实际标签值,从上图可以知道,实际为1分类,预测结果也是1分类的有100个,而实际是0,预测是1的有3个,以此类推。
为了方便记忆,混淆矩阵的各个单元格有一个统一的称呼:
混淆矩阵 | 实际为1 | 实际为0 |
---|---|---|
预测为1 | True Positive(TP) | False Positive(FP) |
预测为0 | False Negative(FN) | True Negative(TN) |
True很好理解,就是预测对了的,Positive代表的意思是实际分类为1的值,Negative代表的是实际分类为0的值。括号里面的就是简称了,这在后面会有用处。
假定1为正样本,0为负样本,则混淆矩阵的各个单元格表述如下:
- TP:对应于被分类模型正确预测的正样本数;
- FN:对应于被分类模型错误预测为负类的正样本数;
- FP:对应于被分类模型错误预测为正类的负样本数;
- TN:对应于被分类模型正确预测的负样本数。
真正率(true prositive rate, TPR)或灵敏度(sensitivity)定义为被模型正确预测的正样本比例,为:
同理可得其他:
- 真负率(true negative rate, TNR)或特指度是模型正确预测的负样本的比例;
- 假正率( false positive rate, FPR)是被预测为正类的负样本比例;
- 假负率(false negative rate, FNR)是被预测为负类的正样本比例。
精准率(Precision, p)
从直观印象上来说,判断一个分类模型是不是准确,肯定是直接判断分类模型的正确率,这样就可以对模型有一个大概的评价,但是在某些时候,这么做并不靠谱:
假如我有一组产品,其中正品率可能是99.5%,次品率是0.5%,我的预测模型得到的结果是正品99%,次品1%,如果用正确率来算,是相当可观的,但是实际上次品的预测差距是整整1倍,很难说这是一个好的模型。
这种不同类的样本数量完全不成比例的情况,叫做不平衡类(倾斜类)。
对于这种分类,可以根据混淆矩阵来设计一些指标,从而评估模型,精准率就是其中之一:
精准率从公式上看,表达的意思就是预测为正样本的样本中,有多少是真正为正的,代表了预测的精确程度。以下面的混淆矩阵为例:
混淆矩阵 | 实际为1 | 实际为0 |
---|---|---|
预测为1 | 100 | 2 |
预测为0 | 3 | 60 |
所以精准率就是0.9804。
召回率(recall, r)
同上,召回率也是从混淆矩阵中总结出来的指标:
表达的意思则是,实际为正样本的个数中,有多少被成功的预测了(有点类似于我现在从事行业的回收率,姑且这么理解吧)
还是上面的矩阵,那么召回率就是
F1值()
事实上一个模型大部分时候是很难做到精确率和召回率两全的,有可能追求完美的精确率但是召回率很低,反之也一样,为了同时最大化精确率和召回率,可以用F1值对分类模型进行评价:
这个值肯定是在小于1的范围以内,原则上越大越好了。
ROC曲线
ROC曲线是显示分类算法真正率和假正率之间折中的一种可视化方法,把真正率(TPR)作为y轴,假正率(FPR)作为x轴。
设定一个阈值,阈值之上的样本为正样本,之下为负样本,阈值降低,则真正率越高,假正率也会越高(因为判断正样本的条件宽松了),所以ROC曲线应该是x轴和y轴同时增长的,如图:
ROC曲线
如果是一个随机分类,则ROC曲线应该是沿着对角线的,如果是分类算法,那么图像越靠近左上角,模型效果越好(假正率很低的时候真正率高)。
AUC
AUC是ROC曲线下方的面积,很显然,面积越大越好,如果模型是完美的,那么面积等于1,如果是随即分类,那么就是0.5。
多分类
以上这几种常用方法都是二元分类的方法,其中有一些也可以扩展到多分类,另外还有多分类专用的评价方法。
多分类的精准率和召回率
转自https://www.zhihu.com/question/56403549/answer/151310817
应用多分类问题,把每个类别单独视为”正“,所有其它类型视为”负“,考虑如下的混淆矩阵:
M = [
[14371, 6500, 9, 0, 0, 2, 316],
[5700, 22205, 454, 20, 0, 11, 23],
[0, 445, 3115, 71, 0, 11, 0],
[0, 0, 160, 112, 0, 0, 0],
[0, 888, 39, 2, 0, 0, 0],
[0, 486, 1196, 30, 0, 74, 0],
[1139, 35, 0, 0, 0, 0, 865]
]
分别计算各个类别的精确率与召回率,代码示例如下:
n = len(M)
for i in range(len(M[0])):
rowsum, colsum = sum(M[i]), sum(M[r][i] for r in range(n))
try:
print 'precision: %s' % (M[i][i]/float(colsum)), 'recall: %s' % (M[i][i]/float(rowsum))
except ZeroDivisionError:
print 'precision: %s' % 0, 'recall: %s' %0
Kappa统计
Kappa统计是比较两个或多个观测者对同一事物,或观测者对同一事物的两次或多次观测结果是否一致,这个系数的取值范围是[-1,1],实际应用中,一般是[0,1],这个系数的值越高,则代表模型实现的分类准确度越高。
Kappa统计数字的意义如下:
- Kappa=+1说明判断结果完全一致,精确度最高。
- Kappa =-1说明两次结果完全不一致。
- Kappa=0说明是完全随机分类的。
- Kappa<0说明结果倾向于随机分类。
- Kappa>0则越大说明分类精确度越高
- Kappa >= 0.75 说明精确度比较理想。
- Kappa < 0.4 说明精确度不够。
下面内容来源:https://blog.csdn.net/wang7807564/article/details/80252362
kappa系数的计算方法可以这样来表示:
其中,p0表示为总的分类准确度;
pe表示为
其中,代表第i类真实样本个数,代表第i类预测出来的样本个数。
对于该表中的数据,则有:
海明距离
海明距离也适用于多分类的问题,简单来说就是衡量预测标签与真实标签之间的距离,取值在0~1之间。距离为0说明预测结果与真实结果完全相同,距离为1就说明模型与我们想要的结果完全就是背道而驰。
杰卡德相似系数
它与海明距离的不同之处在于分母。当预测结果与实际情况完全相符时,系数为1;当预测结果与实际情况完全不符时,系数为0;当预测结果是实际情况的真子集或真超集时,距离介于0到1之间。
我们可以通过对所有样本的预测情况求平均得到算法在测试集上的总体表现情况。
铰链损失
铰链损失(Hinge loss)一般用来使“边缘最大化”(maximal margin)。损失取值在0~1之间,当取值为0,表示多分类模型分类完全准确,取值为1表明完全不起作用。
网友评论