当前位置: 首页 > 后端技术 > Python

机器学习笔记(十三)——重中之重的性能度量方式你要懂

时间:2023-03-26 11:50:18 Python

机器学习笔记(十三)——你需要了解最重要的性能衡量方法分类成本是一样的。由于主要讨论的是二元分类问题,因此可以看成是1和0的分类代价相同。对于分类代价相同的问题,我们通常用正确率或错误率来评价构造的分类器的性能。比如手写数字识别系统,对于测试数据集,它的准确率可以达到98%,可以说这个模型是比较好的。但是现在我们考虑癌症检测的问题。我们也通过一些算法建立了一个准确率很好的分类器,输入患者相关的数据,就会得到一个预测结果——阳性或者阴性。如果这个人没有生病,但分类器预测的结果是阳性,可能只是影响了患者的情绪,做几次测试就可以解决问题;但如果这个人生病了,而分类器预测的结果是阴性,那么这个病人可能不会受到重视,直到癌症晚期,从而失去生命。这时候分类器的准确率不足以判断模型的好坏,因为我们更关注的是有多少人来自癌症可以被成功检测出来,所以我们需要研究一种新的分类器性能衡量方法。准确率和召回率现在一般会遇到这样的情况,你刚在淘宝上搜索过商品,浏览抖音或者朋友圈的时候,会推荐类似的商品。随意推荐肯定是不行的,一定要根据自己的喜好,而这时候需要注意两点,一是“用户推荐了多少商品”,二是“推荐了多少商品”许多项目是用户感兴趣的?推荐”。针对以上两种情况,有两个性能指标precision和recall更适合这样的需求,也可以称为accuracyrate和recallrate,可能在不同的文献中有不同的称呼。在介绍这两个概念之前,需要知道什么是混淆矩阵:其中T、F、P、N分别对应True、False、Positive、Negative这四个词。如何快速记下混淆矩阵?先看第一个字母。如果首字母为T,则表示预测结果与真实结果一致,F则相反。例如FN,预测结果是负例(N),但其预测结果与真实结果不一致(F),所以真实结果应该是正例(P);而对于TN,预测结果是负例(N),但其预测结果与真实结果(T)一致,所以真实结果也是反例(N)。从上面的混淆矩阵可以得到准确率公式和召回率公式。准确率的计算公式如下:召回率的计算公式如下:准确率给出了预测为正例的样本中真实正例所占的比例;召回率给出了预测为正例的真实正例的比例。真阳性的比例。构造一个高精度或高召回率的分类器很容易,但很难同时保证两者。比如,如果所有的样本都被判定为正例,那么此时召回率很高,但是准确率很低,所以两者之间存在着矛盾的关系。逻辑回归、AdaBoost等算法构建的P-R曲线和F1测度分类器不能直接判断分类结果是1还是0,而是通过与一个阈值比较来判断。前者通过Sigmoid函数判断,后者判断。由符号函数符号判断。如果对样本进行简单的排序,排在前面的就是分类器认为“最有可能”被分类为正例的样本,排在后面的就是分类器认为“最不可能”分类为正例的样本被归类为正例。按照这个顺序,将样本一个一个的作为正预测,每次都可以计算出当前的precision和recall。并且通过准确率和召回率,可以画出相关的曲线——PR曲线:对于不同的分类器,当对应的PR曲线向右上角突出时,表示该分类器较好,比如B分类器优于C分类器。对于相交的两条曲线,比较其对应的“平衡点(BEP)”值的大小。平衡点是曲线的精确率和召回率相等的点,所以A分类器优于B分类器。设备。除了“平衡点”之外,更常见的是使用F1度量来判断两个分类器的性能:在不同的应用场景中,我们可能更关注准确率和召回率中的一个,$F_\beta$可以反映分类器对精度或召回率的偏好:当$\beta=1$时,$F_\beta$退化为标准F1度量;当$\beta>1$时,召回率影响较大;当$\beta<1$时,精度影响更大。除了PR曲线,ROC曲线也可以用来评价模型的性能。在绘制ROC曲线之前,还需要像绘制PR曲线之前一样对样本进行排序。PR曲线以准确率和召回率为横轴和纵轴,而ROC曲线以真阳性率(truepositiverate)和假阳性率(falsepositiverate)为横轴和纵轴绘制曲线。真阳性率和假阳性率也是基于混淆矩阵得到的。真阳性率的公式如下:假阳性率的公式如下:真率是真阳性病例占真阳性病例的比例;假阳性率是假阳性病例与真阴性病例的比例。以假阳性率为x轴,真阳性率为y轴,可以画出ROC曲线如下:上图中有两条ROC曲线,左边的预测样本是无穷大,所以对应的ROC曲线是平滑的,虚线给出的结果曲线是随机猜测;实际上,数据集是有限的,所以右角的ROC曲线很常见。理想情况下,最好的分类器应该尽可能在左上角,这意味着该分类器具有极低的误报率和很高的真阳性率。比较不同的ROC曲线通常是比较曲线覆盖的阴影区域。该指标称为AUC。它只是给定的分类器的平均性能值,并不能完全代表ROC曲线。一个完美的分类器对应于AUC的值。是1.0,而随机猜测AUC的值为0.5。下面给出绘制ROC曲线的代码,简单介绍一下。上图中,Inst#代表排序,Class代表分类标签(p为正,n为负),Score代表预测强度,即有多少可能被分类器预测为正,ROC曲线为以此图为基础绘制的。先在所有排序好的样本最左边画一条线,如下:$$|1·2·3...20$$线左边的样本认为是正的,右边的是认为是负数,此时TP=0,FN=10,TN=10,FP=0,所以TPR=0(Y轴),FPR=0(X轴),点在原点(0,0).然后将垂直线向右移动,如下:$$1|2·3·4...20$$同样,在线左侧的样本被认为是正的,右侧的样本被认为是负的.此时TP=1,FN=9,TN=10,FP=0,所以TPR=0.1(Y轴),FPR=0(X轴)。以此类推,知道竖线向20的右边移动,通过这样的推导可以总结出一个规律。每次遇到预测为正类的样本,就在Y方向上加一步,否则就需要在X方向上加一步。加上一个步长,Y轴步长和X轴步长都是1除以正样本或负样本的个数。当然,这个前提是预测强度的顺序是从大到小排列的。如果排列顺序是从小到大,起点就变成了(1,1),加一个步长对应减一个步长。下面给出绘制对应ROC曲线的代码:#分类器的预测强度predStrengths=[0.9,0.8,0.7,0.6,0.55,0.54,0.53,0.52,0.51,0.505,0.4,0.39,0.38,0.37,0.36,0.35,0.34,0.33,0.30,0.1]#类别标签classLabels=[1,1,0,1,1,1,0,0,1,0,1,0,1,0,0,0,1,0,1,0]font=FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=14)#中文字体cur=(0.0,0.0)#起始位置ySum=0.0numPosClas=np.sum(np.array(classLabels)==1.0)#统计正类的个数yStep=1/float(numPosClas)#y轴步长xStep=1/float(len(classLabels)-numPosClas)#x-axisstepLongprint("Y-axisstepsizeis:",yStep)print("X-axisstepsizeis:",xStep)sortedIndicies=sorted(predStrengths,reverse=True)#将预测强度从大到大排列小无花果=plt。figure()fig.clf()ax=plt.subplot(111)#遍历整个类别数组,如果label为1,则在纵轴上增加一步;#如果标签为0,则在横轴上增加一个步长。对于范围内的索引(len(sortedIndicies)):ifclassLabels[index]==1:delX=0;delY=yStep否则:delX=xStep;delY=0ySum+=cur[1]#纵轴高度累加,用于计算AUCax.plot([cur[0],cur[0]+delX],[cur[1],cur[1]+delY],c='b')#绘制ROC曲线cur=(cur[0]+delX,cur[1]+delY)#更新绘制光标的位置ax.plot([0,1],[0,1],'b--')#画虚线plt.title('ROC曲线',FontProperties=font)plt.xlabel('假阳性率',FontProperties=font)plt.ylabel('真阳性rate',FontProperties=font)ax.axis([0,1,0,1])print('AUC面积为:',ySum*xStep)#计算AUC的值plt.show()ROC曲线图为如下:计算对应的AUC面积也很简单。从图中可以看出Y轴步长和X轴步长为0.1。我们可以把这个不规则图形分成10个宽度为0.1的矩形,那么我们只需要计算每个矩形的高度,进行累加计算,然后乘以0.1就可以得到AUC。区域。总结以上知识是机器学习中很重要的一部分,也是机器学习的基础,因为构造分类器往往比较容易,第一次构造的分类器不能保证其性能最优,等等在此基础上,网上更多的操作都是调优分类器,针对不同的应用场景,我们在调优的时候可能会通过不同的方式来衡量分类器的性能。欢迎各位小伙伴和博主交流