[机器学习]-分类问题常用评价指标、混淆矩阵及ROC曲线绘制方法
分类问题
分类问题是人工智能领域中最常见的一类问题之一,掌握合适的评价指标,对模型进行恰当的评价,是至关重要的。
同样地,分割问题是像素级别的分类,除了mAcc、mIoU之外,也可以采用分类问题的一些指标来评价。
本文对分类问题的常见评价指标进行介绍,并附上利用sklearn库的python实现。
将从以下三个方面分别介绍:
- 常用评价指标
- 混淆矩阵绘制及评价指标计算
- ROC曲线绘制及AUC计算
1. 常用评价指标
混淆矩阵(confusion matrix)
一般用来描述一个分类器分类的准确程度。
根据分类器在测试数据集上的预测是否正确可以分为四种情况:
- TP(True Positive)——将正类预测为正类数;
- FN(False Negative)——将正类预测为负类数;
- FP(False Positive)——将负类预测为正类数;
- TN(True Negative)——将负类预测为负类数。
构成一个二分类的混淆矩阵如图:

均交并比(Mean Intersection over Union,mIoU):
为语义分割的标准度量。其计算两个集合的交并比,在语义分割的问题中,这两个集合为真实值(ground truth)和预测值(predicted segmentation)。

分类问题评价指标
二分类问题经混淆矩阵的处理后,针对不同问题,可以选用不同的指标来评价系统。
- Accuracy:表示预测结果的精确度,预测正确的样本数除以总样本数;
- Precision:准确率,表示预测结果中,预测为正样本的样本中,正确预测为正样本的概率;
- Sensitivity:灵敏度,表示在原始样本的正样本中,最后被正确预测为正样本的概率;
- Specificity:常常称作特异性,它研究的样本集是原始样本中的负样本,表示的是在这些负样本中最后被正确预测为负样本的概率;
- F1-score:表示的是precision和recall的调和平均评估指标。

受试者工作特征(Receiver Operating Characteristic,ROC)曲线
ROC曲线是以真阳性率(TPR)为Y轴,以假阳性率(FPR)为X轴做的图。同样用来综合评价模型分类情况。是反映敏感性和特异性连续变量的综合指标。

AUC(Area Under Curve)
AUC的值为ROC曲线下与x轴围成的面积,分类器的性能越接近完美,AUC的值越接近。当0.5>AUC>1时,效果优于“随机猜测”。一般情况下,模型的AUC值应当在此范围内。
2. 混淆矩阵绘制及评价指标计算
首先是分类器的训练,以sklearn库中的基础分类器为例
from sklearn.svm import SVC, LinearSVC
clf = LinearSVC()
clf.fit(train_features, train_target)
predict = clf.predict(test_features)
# 绘制混淆矩阵和评价指标计算
cal(test_target, pred)
# 获取分类score
score = clf.decision_function(test_features)
# 绘制ROC曲线和计算AUC
paint_ROC(test_target, test_score)
混淆矩阵的绘制和评价指标计算可以写在一起,在绘制混淆矩阵时,已经可以算出TP\TN\FP\FN的数值。
# 这是一个多分类问题,y_true是target,y_pred是模型预测结果,数据格式为numpy
def cal(y_true, y_pred):
# confusion matrix row means GT, column means predication
name = 'save_name'
'''画混淆矩阵'''
mat = confusion_matrix(y_true, y_pred)
da = pd.DataFrame(mat, index = ['0', '1', '2'])
sns.heatmap(da, annot =True, cbar = None, cmap = 'Blues')
plt.title(name)
# plt.tight_layout()yt
plt.ylabel('True Label')
plt.xlabel('Predict Label')
plt.show()
plt.savefig('{}/{}.png'.format('save_path', name)) # 将混淆矩阵图片保存下来
plt.close()
'''计算指标'''
tp = np.diagonal(mat) # 每类的tp
gt_num = np.sum(mat, axis=1) # axis = 1 指每行 ,每类的总数
pre_num = np.sum(mat, axis=0)
fp = pre_num - tp
fn = gt_num - tp
num = np.sum(gt_num)
num = np.repeat(num, gt_num.shape[0])
gt_num0 = num - gt_num
tn = gt_num0 -fp
recall = tp.astype(np.float32) / gt_num
specificity = tn.astype(np.float32) / gt_num0
precision = tp.astype(np.float32) / pre_num
F1 = 2 * (precision * recall) / (precision + recall)
acc = (tp + tn).astype(np.float32) / num
print('recall:', recall, '\nmean recall:{:.4f}'.format(np.mean(recall)) )
print('specificity:', specificity, '\nmean specificity:{:.4f}'.format(np.mean(specificity)))
print('precision:', precision, '\nmean precision:{:.4f}'.format(np.mean(precision)))
print('F1:', F1 , '\nmean F1:{:.4f}'.format(np.mean(F1)))
print('acc:', acc , '\nmean acc:{:.4f}'.format(np.mean(acc)))
3. ROC曲线绘制及AUC计算
# 这是一个多分类问题(三分类),可以在一张图上绘制多条ROC曲线
def paint_ROC(y_test, y_score):
'''画ROC曲线'''
plt.figure()
# 修改颜色
colors = ['','darkred', 'darkorange', 'cornflowerblue']
fpr = dict()
tpr = dict()
roc_auc = dict()
# print('label',y_test)
# print('score', y_score)
label = np.zeros((len(y_test), 3), dtype="uint8")
for i in range(len(y_test)):
label[i][int(y_test[i])-1] = 1
# print('label',label)
for i in range(1,4):
fpr[i], tpr[i], _ = metrics.roc_curve(label[:,i-1], y_score[:, i-1])
roc_auc[i] = metrics.auc(fpr[i], tpr[i])
fpr["mean"], tpr["mean"], _ = metrics.roc_curve(label.ravel(), y_score.ravel())
roc_auc["mean"] = metrics.auc(fpr["mean"], tpr["mean"])
lw = 2
plt.plot(fpr["mean"], tpr["mean"],
label='average, ROC curve (area = {0:0.2f})'
''.format(roc_auc["mean"]),
color='k', linewidth=lw)
for i in range(1,4):
auc = roc_auc[i]
# 输出不同类别的FPR\TPR\AUC
print('label: {}, fpr: {}, tpr: {}, auc: {}'.format(i, np.mean(fpr[i]), np.mean(tpr[i]), auc))
plt.plot(fpr[i], tpr[i], color=colors[i],linestyle=':',lw = lw, label='Label = {0}, ROC curve (area = {1:0.2f})'.format(i, auc))
plt.plot([0, 1], [0, 1], color='navy', linestyle='--')
plt.xlim([0.0, 1.05])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
# plt.title('Receiver operating characteristic example')
plt.grid(linestyle='-.')
plt.grid(True)
plt.legend(loc="lower right")
plt.show()
# 保存绘制好的ROC曲线
plt.savefig('{}/{}.png'.format('save_path', 'save_name'))
plt.close()
[机器学习]-分类问题常用评价指标、混淆矩阵及ROC曲线绘制方法的更多相关文章
- 【机器学习】--模型评估指标之混淆矩阵,ROC曲线和AUC面积
一.前述 怎么样对训练出来的模型进行评估是有一定指标的,本文就相关指标做一个总结. 二.具体 1.混淆矩阵 混淆矩阵如图: 第一个参数true,false是指预测的正确性. 第二个参数true,p ...
- 模型监控指标- 混淆矩阵、ROC曲线,AUC值,KS曲线以及KS值、PSI值,Lift图,Gain图,KT值,迁移矩阵
1. 混淆矩阵 确定截断点后,评价学习器性能 假设训练之初以及预测后,一个样本是正例还是反例是已经确定的,这个时候,样本应该有两个类别值,一个是真实的0/1,一个是预测的0/1 TP(实际为正预测为正 ...
- 机器学习-Confusion Matrix混淆矩阵、ROC、AUC
本文整理了关于机器学习分类问题的评价指标——Confusion Matrix.ROC.AUC的概念以及理解. 混淆矩阵 在机器学习领域中,混淆矩阵(confusion matrix)是一种评价分类模型 ...
- 评估分类器性能的度量,像混淆矩阵、ROC、AUC等
评估分类器性能的度量,像混淆矩阵.ROC.AUC等 内容概要¶ 模型评估的目的及一般评估流程 分类准确率的用处及其限制 混淆矩阵(confusion matrix)是如何表示一个分类器的性能 混淆矩阵 ...
- 五分钟秒懂机器学习混淆矩阵、ROC和AUC
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第18篇文章,我们来看看机器学习领域当中,非常重要的其他几个指标. 混淆矩阵 在上一篇文章当中,我们在介绍召回率.准确率 ...
- 评价指标的局限性、ROC曲线、余弦距离、A/B测试、模型评估的方法、超参数调优、过拟合与欠拟合
1.评价指标的局限性 问题1 准确性的局限性 准确率是分类问题中最简单也是最直观的评价指标,但存在明显的缺陷.比如,当负样本占99%时,分类器把所有样本都预测为负样本也可以获得99%的准确率.所以,当 ...
- 准确率,召回率,F值,机器学习分类问题的评价指标
下面简单列举几种常用的推荐系统评测指标: 1.准确率与召回率(Precision & Recall) 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量.其中精度 ...
- 【分类模型评判指标 一】混淆矩阵(Confusion Matrix)
转自:https://blog.csdn.net/Orange_Spotty_Cat/article/details/80520839 略有改动,仅供个人学习使用 简介 混淆矩阵是ROC曲线绘制的基础 ...
- 二分类问题中混淆矩阵、PR以及AP评估指标
仿照上篇博文对于混淆矩阵.ROC和AUC指标的探讨,本文简要讨论机器学习二分类问题中的混淆矩阵.PR以及AP评估指标:实际上,(ROC,AUC)与(PR,AP)指标对具有某种相似性. 按照循序渐进的原 ...
随机推荐
- idea中创建Java类时,自动在文件头中添加作者和创建时间
在Settings中找到File and Code Templates 设置如下图所示. 效果展示:
- Visio Professional之活动图
1 什么叫活动图? 活动图在本质上是一种流程图. 活动图(Activity diagram)是UML用于对系统的动态行为建模的一种常用工具,它描述活动的顺序,表示一个活动到另一个活动的控制流. 2.活 ...
- NC14585 大吉大利,今晚吃鸡
NC14585 大吉大利,今晚吃鸡 题目 题目描述 糖和抖m在玩个游戏,规定谁输了就要请谁吃顿大餐:抖m给糖a b c三个驻, 并在a柱上放置了数量为n的圆盘,圆盘的大小从上到下依次增大,现在要做的事 ...
- 深入理解Apache Hudi异步索引机制
在我们之前的文章中,我们讨论了多模式索引的设计,这是一种用于Lakehouse架构的无服务器和高性能索引子系统,以提高查询和写入性能.在这篇博客中,我们讨论了构建如此强大的索引所需的机制,异步索引机制 ...
- AMS1117降压电路
AMS1117芯片为正向低压差稳压器,内部集成过热保护和限流电路,其固定输出版本电压可为1.5V.1.8V.2.5V.2.85V.3.0V.3.3V.5.0V,设计采用3.3V输出即ASM1117-3 ...
- DENIED Redis is running in protected mode because protected mode is enabled
DENIED Redis is running in protected mode because protected mode is enabled redisson连接错误 Unable to i ...
- docker容器管理操作
Docker容器的四种状态: 运行 已暂停 重新启动 已退出 1.容器的创建 容器创建:就是将镜像加载到容器的过程. 创建容器时如果没有指定容器名称,系统会自动创建一个名称. 新创建的容器默认处于停止 ...
- 利用CSS3自定义属性来为网站添加“暗黑模式”(暗色模式/DarkMode)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_114 究竟什么是暗黑模式?这个概念起初来源于macOS系统,该系统的mojave版本为用户提供两个主题皮肤,即浅色和深色的皮肤.自 ...
- 心动不如行动,基于Docker安装关系型数据库PostgrelSQL替代Mysql
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_171 最近"全栈数据库"的概念甚嚣尘上,主角就是PostgrelSQL,它最近这几年的技术发展不可谓不猛,覆盖 ...
- 四位一体水溶交融,Docker一拖三Tornado6.2 + Nginx + Supervisord非阻塞负载均衡容器式部署实践
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_203 容器,又见容器.Docker容器的最主要优点就在于它们是可移植的.一套服务,其所有的依赖关系可以捆绑到一个独立于Linux内 ...