度量方法:PR & F1 & AUC
1. Precision an Recall
计算公式:
在排序问题中,通常没有一个确定的阈值把得到的结果直接判定为正样本或负样本,而是采用Top N
返回结果的precision
值和recall
值来衡量排序模型的性能,即认为模型返回的Top N
的结果就是模型判定的正样本,然后计算前N个位置上的准确率aaa@qq.com
和前N个位置上的召回率aaa@qq.com
。
precision
值和recall
值是既矛盾又统一的两个指标,为了提高precision
值,分类器需要尽量在“更有把握”时才把样本预测为正样本,但此时往往会因为过于保守而漏掉很多“没有把握”的正样本,导致recall
值降低。
P-R曲线
P-R曲线的横轴是召回率,纵轴是精确率。对于一个排序模型来说,其P-R曲线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精确率。整P-R曲线是通过将阈值从高到低移动而生成的。图2.1是P-R曲线样例图,其中实线表模型A的P-R曲线,虚线代表模型B的P-R曲线。原点附近代表当阈值最大时模型的精确率和召回率。
2. F1 Score
F1分数为精确率和召回率的调和平均:
3. ROC曲线和AUC度量
根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出"真正例率"TPR和"假正例率"FPR,分别以此为横纵坐标,绘制ROC曲线。通过动态地调整截断点,从最高的得分开始(实际上是从正无穷开始,对应着ROC曲线的零点),逐渐调整到最低得分,每一个截断点都会对应一个FPR和TPR,在ROC图上绘制出每个截断点对应的位置,再连接所有点就得到最终的ROC曲线。
AUC指的是ROC曲线下的面积大小,该值能够量化地反映基于ROC曲线衡量出的模型性能。计算AUC值只需要沿着ROC横轴做积分就可以了。由于ROC曲线一般都处于y=x这条直线的上方(如果不是的话,只要把模型预测的概率反转成1−p就可以得到一个更好的分类器),所以AUC的取值一般在0.5~1之间。AUC越大,说明分类器越可能把真正的正样本排在前面,分类性能越好。
AUC的如果按照定义的那样通过曲线积分计算会比较麻烦,可以通过另外一种方法, 正样本pos
有M个,负样本neg
有N个,那么随机取一个正样本负样本就有M*N种情况。统计M*N中情况中正样本预测概率>负样本预测概率的情况数量,当预测概率相等时数量计为0.5 。 最后计算概率。
代码实现
//计算AUC
double getAUC(vector<float>&pos,vector<float>&neg){
int n = pos.size(),m = neg.size();
float loss = 0.0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(pos[i]<neg[j]){
loss = loss+1;
}
else if(pos[i]==neg[j]){
loss = loss + 0.5;
}
}
}
return loss/m*n;
}
Q:ROC曲线相比P-R曲线有什么特点
相比P-R曲线,ROC曲线有一个特点,当正负样本的分布发生变化时,ROC曲线的形状能够基本保持不变,而P-R曲线的形状一般会发生较剧烈的变化。
可以看出,P-R曲线发生了明显的变化,而ROC曲线形状基本不变。这个特点让ROC曲线能够尽量降低不同测试集带来的干扰,更加客观地衡量模型本身的性能。这有什么实际意义呢?在很多实际问题中,正负样本数量往往很不均衡。比如,计算广告领域经常涉及转化率模型,正样本的数量往往是负样本数量的1/1000甚至1/10000。若选择不同的测试集,P-R曲线的变化就会非常大,而ROC曲线则能够更加稳定地反映模型本身的好坏。所以,ROC曲线的适用场景更多,被广泛用于排序、推荐、广告等领域。但需要注意的是,选择P-R曲线还是ROC曲线是因实际问题而异的,如果研究者希望更多地看到模型在特定数据集上的表现,P-R曲线则能够更直观地反映其性能。
上一篇: Unity 编辑器扩展
推荐阅读