前言:本文介绍混淆矩阵,以及召回率、精确率和F1-score。
主要解决:混淆矩阵记忆不方便记忆,指标容易混淆2个问题。

为什么要使用混淆矩阵来评估模型?

  1. 通常模型会使用准确率来评估模型,但要注意准确率失效问题

    当数据集中99个标签为0,1个标签为1,模型全部判断为0,准确率也达到了99%。如果建模的目的是为了捕捉为少数类,在样本极度不平衡的情况下,准确率则会失效。

    另一种情况,模型A认为样本90%的可能性为1,模型B认为样本60%的可能性为1。如果将对标签的判断概率定为50%,那么模型A和模型B都对样本判断正确,即准确率一样;但实际上,模型A的效果好于模型B。

  2. 为什么不能用损失函数评估模型?

    损失函数同样也有评估模型的作用,比如针对上述第二种情况,如果用模型的交叉熵来比较模型的优劣,模型A的交叉熵会低于模型B,能够一定程度反映模型A优于模型B。但是为什么不能使用交叉熵作为模型评估的标准呢?

    因为交叉熵的结果为(信息熵,+∞+\infty+∞),难以直接判断交叉熵为多少时比较合适;且受到数据集不同的影响,不同模型的交叉熵不能相互比较。

    同时,交叉熵作为损失函数,模型会向着越低越好的结果去迭代,这会导致模型过拟合。

  3. 准确率失效时,还能用什么评估指标?混淆矩阵是什么?

    准确率的计算公式为:判断正确的数量总的数量\frac{判断正确的数量}{总的数量}总的数量判断正确的数量​。换个角度观察以上问题,可以理解为之前的模型评估指标过于“粗犷”,而掩盖了模型的问题,所以可以考虑细化指标,使用“拆分”的思路来观察模型结果。

    “判断正确的数量”可以拆分为“预测为1,实际为1”、“预测为0,实际为0”这两种情况;“总的数量”可以拆分为“预测为1,实际为1(TP)”、“预测为1,实际为0(FP)”、“预测为0,实际为0(TN)”、“预测为0,实际为1(FN)”这四种情况。

    通过拆分指标,再将指标组合、比较,就能得到混淆矩阵。

    混淆矩阵包括:

     “预测为1,实际为1(TP)”“预测为1,实际为0(FP)”;I类错误“预测为0,实际为1(FN)”;II类错误“预测为0,实际为0(TN)”
    

    由于上面的矩阵实在阵如其名,可以换一种方式来记忆。

    真实情况用T表示标签1,F表示标签0;

    预测情况用1表示标签1,0表示标签0;


如何通过混淆矩阵衍生出来的评估指标来评估模型?

通过上述描述可知,在评估模型时,有时候会更关注模型对部分标签的预测情况。评估指标也可以围绕部分标签的思路,划分为识别样本标签为1的指标和识别样本标签为0的指标。

标签划分也有讲究。通常会把需要重点识别的样本标签设置为1,非重点识别的样本标签设置为0;如果标签从业务上没有是否重点的区别,那么就把少数类数据的标签设置为1,多数类数据的标签设置为0。


以下结合案例,说明各个标签的含义,以及加强理解。

  1. 首先,绘制二分类样本散点图:
from sklearn.datasets import make_blobs
X,y=make_blobs(n_samples=[500,100],centers=[[0.0,0.0],[2.0,2.0]],cluster_std=[1.5,0.5],random_state=9)y=y.reshape(-1,1)
X=np.concatenate((X,np.ones(y.shape)),1)plt.scatter(X[:,0],X[:,1],c=y,cmap='rainbow',alpha=0.5)
plt.show()

  1. 然后,绘制决策边界
np.random.seed(9)
n=X.shape[1]
w=np.random.randn(n,1)lr_lambda=lambda epoch :0.95**epochfor i in range(200):w=sgd_cal(X,w,y,logit_gd,epoch=1,batch_size=50,lr=0.2*lr_lambda(i))logit_DB(X,w,y)
plt.scatter(X[:,0],X[:,1],c=y,cmap='rainbow',alpha=0.5)
plt.show()


  1. 数据说明:

    图片中点的颜色表示真实标签。红点真实标签为1,结合方便记忆版,记为T;紫点真实标签为0,结合方便记忆版,记为F。

    底色为预测标签,落在不同颜色对应不同的预测标签。蓝色预测标签为1,粉色预测标签为0。


    那么可知:

    蓝色区域(1)的红色点(T)为T1

    蓝色区域(1)的紫色点(F)为F1;I类错误

    粉色区域(0)的红色点(T)为T0;II类错误

    分色区域(0)的紫色点(F)为F0


标题识别标签为1的样本(少数类样本)指标

  1. 召回率=T1T1+T0\frac{T1}{T1+T0}T1+T0T1​

    通过图片可知,召回率指红色点中落在蓝色区域的点的比重。

    所以这个比重越高,决策边界就越往左下角移动,红点落在蓝色区域越多,即红点被预测正确的概率越高;但是随着决策边界往左下角推,也会有更多的紫色点落在蓝色区域,即被预测错误,这就是只追求召回率这个指标的话,会产生的弊端。

    通过公式可知,分母都有T(红点,也就是少数类/重点标签),所以该指标关注的是红点中,被预测正确的比例。

  2. 精确率=T1T1+F1\frac{T1}{T1+F1}T1+F1T1​

    通过图片可知,精确率指蓝色区域中所有点中,红点的比重。 所以这个比重越高,蓝色区域中红点占比越大。


    小案例:假设一共三个点,按照原始的决策边界,精确率为1/2。如果决策边界移动到黑线的部分,那么蓝色区域就有2个紫点,1个红点,精确率变成1/3,精确率降低。

    如果粉色区域的为红点,决策边界移动到黑线部分,那么蓝色区域就有1个紫点,2个红点,精确率变成2/3,精确率提高。

    所以对于精确率来说,决策边界往左下角移动不一定确定提高还是降低这个指标;如果移动的这个区域中,紫点比红点多,那么精确率会下降;如果红点比紫点多,那么精确率会提高。

  3. F1-score

    了解了召回率和精确率之后,就会发现一个矛盾:同样是识别标签为1的指标,但是提高召回率的情况下,不一定会提高精确率。那么应该如何平衡两个指标,以选择最优决策边界呢?

    为了解决这种问题,就需要用到F1-score,公式如下:

    F1_Score=21Recall+1Precision=2⋅Recall⋅PrecisionRecall+PrecisionF1\_Score=\frac{2}{\frac{1}{Recall}+\frac{1}{Precision}}=\frac{2\cdot Recall\cdot Precision}{Recall+Precision}F1_Score=Recall1​+Precision1​2​=Recall+Precision2⋅Recall⋅Precision​

    改写为方便记忆版,公式为:

    F1_Score=2T12T1+F1+T0F1\_Score=\frac{2T1}{2T1+F1+T0}F1_Score=2T1+F1+T02T1​

    因为F1为I类错误点;T0为二类错误点,所以F1+T0为预测错误点,公式为:

    F1_Score=2T12T1+F1+T0=2倍蓝底红点2倍蓝底红点+预测错误点F1\_Score=\frac{2T1}{2T1+F1+T0}=\frac{2倍蓝底红点}{2倍蓝底红点+预测错误点}F1_Score=2T1+F1+T02T1​=2倍蓝底红点+预测错误点2倍蓝底红点​

    可以理解为2倍少数类预测正确点同上+所有预测错误点\frac{2倍少数类预测正确点}{同上+所有预测错误点}同上+所有预测错误点2倍少数类预测正确点​,所以包含了决策边界移动时,对多数类预测错误带来的影响。


F1_score为调和平均数,那么和recall和precision的平均数有什么差异呢?
下面是调和平均数和平均数的对比图:

def harmonic_mean(A,B):return 2*A*B/(A+B)A=np.linspace(0,1,100)
B=np.ones(A.shape)
plt.plot(A,harmonic_mean(A,B),c='b',label='harmonic_mean')
plt.plot(A,(A+B)/2,c='orange',label='mean')
plt.legend()
plt.show()


由图片和代码可知,当recall和precision一方为100%,另一方递增时,调和平均数低于平均数;说明调和平均数数受到较大值的影响较小,这就是调和平均数的优势。


识别标签为0的样本(多数类样本)指标

  1. 误检率(FPR)=F1F1+F0\frac{F1}{F1+F0}F1+F0F1​
    由图片可知,误检率指蓝底紫点占所有紫点的比重,即紫色点预测错误的比例。

    所以这个比重越大,那么决策边界越往左下角移动,蓝底紫点越多,即预测错误的紫点越多。随着召回率的提高,误检率也会提高,所以决策边界的选定应该平衡召回率和误检率。

    另外从公式看,分母都有F,所以误检率注的是紫色点(多数类);F1也是I类错误,误检率也是衡量I类错误比例的指标。

  2. 特异度(Specificity)=F0F1+F0\frac{F0}{F1+F0}F1+F0F0​

    特异度和误检率分母一样,都是关注紫色点的指标。由图片可知,特异度指红底紫点占所有紫点的比重,即紫色点预测正确的比例。

    所以这个比重越大,决策边界越往右上移动,红底紫点越多,预测正确的紫点越多。

  3. 阴性预测值(NPV)=F0T0+F0\frac{F0}{T0+F0}T0+F0F0​

    由图片可知,阴性预测值指红底紫点占红底所有点的比重,即预测为多数类中正确的比例。

    这个比例和精确率相对应,估不多解释。


  • 使用混淆矩阵时,需要注意什么?

    在使用混淆类别时,要注意类别标签划分情况说明,通常会把少数类、重点识别类别标签定为1;多数类、非重点识别类别标签定为0。

    而通常也更关注识别标签1的情况,这时需要关注召回率、精确率。

    另外,混淆矩阵的指标不仅可以用来评估模型,还可以用来指导模型训练。比如在sklearn中,模型实例化时,告诉模型需要更关注少数类。


  • 多分类问题中如何使用混淆矩阵?

    可以结合OVR策略。

    假设有3个类别A/B/C,当判断A的召回率时,将A视为标签1,B和C视为标签0,从而可以计算得出A的召回率;B和C的召回率也可以用相同的方式计算得出。

如何理解混淆矩阵,以及预测少数类的评估指标?相关推荐

  1. 一文带你用Python玩转线性回归模型《加利福尼亚房价预测》回归模型评估指标介绍

    大家早上好,本人姓吴,如果觉得文章写得还行的话也可以叫我吴老师.欢迎大家跟我一起走进数据分析的世界,一起学习! 感兴趣的朋友可以关注我或者我的数据分析专栏,里面有许多优质的文章跟大家分享哦. 前言 这 ...

  2. 机器学习算法——概率类模型评估指标4(校准可靠性曲线及预测概率直方图)

    一.预测概率直方图 我们可以通过绘制直方图来查看模型的预测概率的分布. 直方图以样本的预测概率分箱后的结果为横坐标,每个箱中的样本数量为纵坐标绘制一个图像. 具体代码实现为: from sklearn ...

  3. 机器学习模型评估——混淆矩阵

    混淆矩阵 什么是混淆矩阵(Confusion Matrix)?我们在做分类问题时会用到机器学习分类模型,不管是二分类还是多分类问题,我们都要对模型的性能进行评估,看看模型的分类效果是否好,有多好!我们 ...

  4. matplotlib绘制混淆矩阵_混淆矩阵及其可视化

    混淆矩阵(Confusion Matrix)是机器学习中用来总结分类模型预测结果的一个分析表,是模式识别领域中的一种常用的表达形式.它以矩阵的形式描绘样本数据的真实属性和分类预测结果类型之间的关系,是 ...

  5. 模型评价(一) AUC大法 混淆矩阵

    题记: 都说混淆矩阵易混淆,哈哈,下面就来试着尝试一下,看能不能帮助你更好的 理解混淆矩阵,以及 AUC 大法. 问题: AUC是什么 AUC能拿来干什么 AUC如何求解(深入理解AUC) AUC是什 ...

  6. 混淆矩阵、ROC、AUC 学习记录

    混淆矩阵也称误差矩阵,主要比较分类结果与实际预测值之间的差异可以将分类结果的精度显示在一个混淆矩阵里面. 下表为二分类问题的混淆矩阵: 预测为0 预测为1 真实为0 TN FP 真实为1 FN TP ...

  7. python学习 - 图标签用宋体Times New Roman字体 + 规范的混淆矩阵绘制

    python学习 - 图标签用宋体&Times New Roman字体 + 规范的混淆矩阵绘制 只需复制下面一行代码即可获得效果 中文:宋体字号 英文和数字:Times New Roman字体 ...

  8. 利用python绘制混淆矩阵

    利用python绘制混淆矩阵,直接附代码. from sklearn.metrics import confusion_matrix import matplotlib.pyplot as plty_ ...

  9. python混淆_python实现混淆矩阵

    机器学习的评估指标​zhuanlan.zhihu.com 该篇文章介绍了机器学习的一些评估指标,要得到这些指标的基础,就是先求得混淆矩阵,那在代码中怎么获取混淆矩阵呢? 二分类 二分类比较简单,所以我 ...

最新文章

  1. Android Bitmap圆角
  2. linux 鬼精灵漏洞,鬼精灵Grinch:比Bash破壳(shellshock)更严重的Linux漏洞
  3. FindPrivateKey X509
  4. .Net Core Nuget还原失败
  5. .NetCoreLinuxDockerPortainer踩坑历险记
  6. 手机能写python代码_用手机写Python代码!可以随时随地学Python!
  7. 教你直白的理解贝塞尔曲线???
  8. Spring Cloud Spring Boot mybatis分布式微服务云架构(五)构建RESTful API
  9. 关于Redis命令keys在性能方面的说明
  10. global http proxy configuration on ubuntu
  11. 2016年安防企业如何因势而动 顺势而为
  12. 路由器php系统时间设置时间设置时间设置时间设置时间设置,win7电脑提示系统时间设置有误请更新系统日期...
  13. Zookeeper 入门示例
  14. CSS3 transform 旋转、偏移、缩放属性,CSS3 filter 滤镜,实现图像特效
  15. suse 11添加阿里源
  16. 小刘的编程学习技巧分享
  17. 寻找平面上的极大点(信息学奥赛一本通-T1230)
  18. 超星网站服务器,云服务器 超星
  19. 在线靶场-墨者-网络安全2星-某防火墙默认口令
  20. 重庆OA办公系统目前推出PC端、移动终端(安卓、IOS、平板)- 上弦科技

热门文章

  1. Django_使用class写views
  2. Java基础项目——基于文本家庭简易收支记账程序
  3. 什么是Https、数字签名、数字证书
  4. 多卡并行训练遇到的问题
  5. 解决CSDN导入md文档时图片显示不出来,出现[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jiakLQhy-1628602853830)提示
  6. 经纬度换算数值_如何在Excel中将经纬度数值转换成度分秒
  7. c# Npoi导出Excel并合并行列
  8. LODOP.ADD_PRINT_TEXT 参数解释说明
  9. FastDB.html
  10. Elasticsearch教程---高亮搜索(十二)