多分类f1分数_机器学习之分类模型评估总结

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-31 19:14   32   0

d8ad7095d3e53785b064932f19c4f3e6.png

一、概述

在机器学习模型搭建好之后,需要对模型进行评估,针对不同的算法模型有不同的评估方法,比如:分类算法、回归算法、聚类算法等,本文主要是针对分类算法的模型评估方法进行总结整理,便于自己对评估方法的进一步理解和随时查阅。

二、详细说明

在介绍分类评估方法之前,首先介绍一个比较重要的概念:混淆矩阵,后续的评估方法都是在此基础之上定义的,对于分类模型而言(这里仅以最简单的二分类为例,假设只有0和1两类),其结果主要有以下四种:

  • 实际为正、结果为正,预测正确
  • 实际为正、结果为负,预测错误
  • 实际为负、结果为正,预测错误
  • 实际为负、结果为负,预测正确

混淆矩阵的形式,具体如下图所示:

34559d8e7c0e57588caf10710a545272.png
P表示Positive、N表示Negative

其中:T、F表示预测结果是否正确、而后面跟的P、N主要是对应预测的结果,这下记住上面的图了吧!

介绍完混淆矩阵,接下来我们介绍常用的评价标准,主要包括:准确率、精确率、召回率、F1值、ROC曲线、AUC、P-R、KS曲线等

准确率

准确率很好理解,就是预测正确的占比,其公式为:

精确率

也称为查准率,在真实值为正的样本中,预测正确的样本占比,其计算公式表示为:

召回率

也称为查全率,在预测值为正的样本中,预测为正的样本占比,其计算公式表示为:

F1-Score

F1分数(F1 Score),是统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的准确率和召回率。F1分数可以看作是模型准确率和召回率的一种加权平均,它的最大值是1,最小值是0,其公式为:

ROC曲线

对于ROC曲线,其横、纵坐标分别为:伪正率(FPR)、真正率(TPR)。其中:

真正率为实际为正的样本中,被判断为正的比例,公式如下:

可以看到真正率的计算公式和召回率的计算公式是一样的

假正率为实际为负,被错误判断为正的比例,公式如下:

ROC曲线的绘制主要我们根据多个阈值来计算出多组FPR和TPR(比如在逻辑回归中我们可以调整阈值如0.25、0.5、0.75等,这样我们就可以绘制出多组值绘制出ROC曲线,如下图所示:

60791d22f23bd5e9fc349cee8ac8de3f.png
图片来自网络,侵删!

ROC的计算方法同时考虑了学习器对于正例和负例的分类能力,在样本不平衡的情况下,依然能够对分类器做出合理的评价。ROC对样本类别是否均衡并不敏感,这也是不均衡样本通常用ROC评价学习器性能的一个原因,其中ROC曲线越往上靠近模型性能越好(为啥越考上越好,纵坐标为真正率越大越好),

AUC

AUC是一个模型评价指标,只能用于二分类模型的评价,对于AUC我们记住,其就是ROC曲线下面的面积,AUC=1.0时表示模型最好,随机猜测的为0.5,其值越高,模型性能越好。

50911d2f03a57a8b86b7f9fb426fd412.png
PR曲线

PR曲线是以召回率为横轴、以精确率为纵轴绘制的曲线,如下:

62528e506c8164795266c23952af9c1a.png

其中:曲线下的面积越大,或者说曲线更接近右上角(precision=1, recall=1),那么模型就越理想,越好。

KS曲线

K-S曲线的数据来源以及本质和ROC曲线是一致的,只是ROC曲线是把真正率(

)和假正率(
)当作横纵轴,而
K-S曲线是把真正率(
)和假正率(
)都当作是纵轴,横轴则由选定的阈值来充当。如图:

e012541a4d8194bae9855d6d5f0cf4f4.png

KS值

K-S 曲线就能衍生出

值,
,即是两条曲线之间的最大间隔距离。KS值越大表示模型 的区分能力越强。

三、Sklearn实战

Python的第三方库sklearn为我们提供了上述模型评估计算的接口,具体演示如下代码:

from sklearn import metrics
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  
# Matplotlib中设置字体-黑体,解决Matplotlib中文乱码问题
plt.rcParams['axes.unicode_minus'] = False    
# 解决Matplotlib坐标轴负号'-'显示为方块的问题


y_true=[1,1,0,1,1]
y_pred=[0,0,0,1,0]

# 混淆矩阵
C = metrics.confusion_matrix(y_true, y_pred)
print("混淆矩阵为:n",C)
# 计算准确率(accuracy)
accuracy = metrics.accuracy_score(y_true,y_pred)
print("准确度为:n",accuracy)
# 计算精确率(precision)
precision = metrics.precision_score(y_true,y_pred)
print("精确率为:n",precision)
# 计算召回率(recall)
recall = metrics.recall_score(y_true,y_pred)
print("召回率为:n",recall)
# 计算F1-score(F1-score)
F1_score = metrics.f1_score(y_true,y_pred)
print("精确率为:n",F1_score)

# 绘制PR曲线
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1] 
y_true = [0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0]

precision,recall,thresholds = metrics.precision_recall_curve(y_true, y_pred)
plt.plot(precision, recall)
plt.title("PR曲线")
plt.xlabel("recall")
plt.ylabel("precision")
plt.show()

# 绘制ROC曲线
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1] 
y_true = [0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0]

FPR,TPR,thresholds = metrics.roc_curve(y_true,y_pred)
plt.plot(FPR, TPR)
plt.title("ROC曲线")
plt.xlabel("recall")
plt.ylabel("precision")
plt.plot([0,1],[0,1],'r--') 
plt.show()

# 计算AUC值
y_true = [0, 0, 1, 1, 0]
y_scores = [0.1, 0.4, 0.35, 0.8, 0.2]
print('AUC socre:',metrics.roc_auc_score(y_true, y_scores))

# 计算ks值
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1] 
y_true = [0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0]
FPR,TPR,thresholds = metrics.roc_curve(y_true,y_pred)

# 绘制KS曲线
plt.plot(thresholds, FPR)
plt.plot(thresholds, TPR)
plt.show()

KS=abs(FPR-TPR).max() 
print('KS值:',KS)

四、总结

本文主要总结了分类模型的常用评估方法,需要了解各个名词的含义及对应的计算公式,同时需要了解各个评估方法适合的应用场景,在第三部分介绍了sklearn库中对于评估方法的实现,只需要记住metrics,各个计算函数与其名字对应,在jupyter中可以使用tab键和shift+table键的使用,你会发现更多.......

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP