模型评价指标—F1值

article/2025/11/7 5:07:46

最近空余时间在参加数字中国创新大赛,比赛规则是根据模型的F1值对参赛者进行排名。为了更深刻地理解这个指标,我最近对它做了一些梳理,现在把它分享给更多有需要的人图片。最近在参赛时也发现了一个问题,就是算法在训练集上完全拟合(KS=1),但是到测试集上衰退得比较多,即出现了过拟合的现象。如果对过拟合调参比较有经验的小伙伴,欢迎到公众号中进行沟通交流。有正在参赛的小伙伴,想讨论赛题的也可以联系我。
  
对于分类模型,在建立好模型后,我们想对模型进行评价,常见的指标有混淆矩阵、F1值、KS曲线、ROC曲线、AUC面积等。也可以自己定义函数,把模型结果分割成n(100)份,计算top1的准确率、覆盖率。之前阐述了混淆矩阵和KS曲线,本文阐述F1值的原理和Python实现实例,其它指标会在后续文章中详尽阐述,敬请期待图片。

文章目录

    • 一、详细介绍F1值
      • 1 什么是F1值
      • 2 理解F1值的一个小例子
    • 二、用Python如何计算F1值
      • 1 写函数计算F1值
      • 2 写函数计算F1值具体实例
      • 3 调用sklearn计算F1值

  

一、详细介绍F1值

  

1 什么是F1值

  
F1值又称为F1分数(F1-Score):是分类问题的一个衡量指标,它是精确率P(Precision)和召回率R(Recall)的调和平均数。

F1值=2*P*R/(P+R)

  
F1值的取值范围(0~1),越接近1说明模型预测效果越好,至于原因详见后文。

  
  

2 理解F1值的一个小例子

  
假设1代表涉赌涉诈账户,0代表非涉赌涉诈的低风险账户。

图片

T:正确预测,F:错误预测,P:1,N:0。
  

  1. TP(True Positive):模型正确预测为1的数量,即真实值是1,模型预测为1的数量。
  2. FN(False Negative):模型错误预测为0的数量,即真实值是1,模型预测为0的数量。
  3. FP(False Positive):模型错误预测为1的数量,即真实值是0,模型预测为1的数量。
  4. TN(True Negative):模型正确预测为0的数量,即真实值是0,模型预测为0的数量。

精确率P(Precision):被模型预测为1的样本中,实际是1的样本占比。计算公式如下:
  

P(Precision)=TP/(TP+FP)

  
召回率R(Recall):实际是1的样本中,被模型预测为1(被模型找回了多少1)的样本占比。计算公式如下:
  

R(Recall)=TP/(TP+FN)

  

F1值=2 PR/(P+R)

  
思考一个极端情况,所有涉赌涉诈账户的概率都高于正常账户的概率,那意味着我可以找到一个切割点,让P和R都等于1,即F1值为1。这时,说明模型能完全区分出涉赌涉诈账户和非涉赌涉诈账户。即F1值越接近1,模型效果越好。为了更清晰地看出P、R和F1值之间的趋势关系,我们把F1值变下型,得到如下结果:
  

F1值=2/(1/P+1/R)

  
可以尝试通分还原。从上式可以发现,当R不变时,P越大,分母越小,则F1值越大,同理可得R。说明P、R和F1是成正比的。

  
  

二、用Python如何计算F1值

  
在Python中计算F1值的代码有多种,本文提供两种。一种是写函数计算,一种是调用sklearn计算。
  
  

1 写函数计算F1值

  
首先看下写函数的方式:

#Recall = TP/(TP + FN)
#Precision = TP/(TP + FP)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import KFold, cross_val_score
from sklearn.metrics import confusion_matrix, recall_score, classification_report#绘制混淆矩阵
def plot_confusion_matrix(cm, classes,normalize=False,title='Confusion matrix',cmap=plt.cm.Blues):"""This function prints and plots the confusion matrix.Normalization can be applied by setting `normalize=True`."""if normalize:cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]print("Normalized confusion matrix")else:print('Confusion matrix, without normalization')print(cm)plt.imshow(cm, interpolation='nearest', cmap=cmap)plt.title(title)plt.colorbar()tick_marks = np.arange(len(classes))plt.xticks(tick_marks, classes, rotation=45)plt.yticks(tick_marks, classes)fmt = '.2f' if normalize else 'd'thresh = cm.max() / 2.for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):plt.text(j, i, format(cm[i, j], fmt),horizontalalignment="center",color="white" if cm[i, j] > thresh else "black")plt.tight_layout()plt.ylabel('True label')plt.xlabel('Predicted label')def plot_confu_matrix_cal_F1(thresholds, date):'''thresholds:切割predict的阈值,比如:[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]data:数据集,其中包含y标签列,predict预测列(可以是概率值,也可以是标签)'''import itertoolsthresholds =  thresholds     plt.figure(figsize = (10, 10))j = 1for i in thresholds:y_test_predictions_high_recall = date['predict'] > iplt.subplot(3, 3, j)j += 1#Compute confusion matcnf_matrix = confusion_matrix(date.y, y_test_predictions_high_recall)np.set_printoptions(precision = 2)recall_score_1 = cnf_matrix[1, 1] / (cnf_matrix[1, 1] + cnf_matrix[1, 0])accary_score_1 = cnf_matrix[1, 1] / (cnf_matrix[1, 1] + cnf_matrix[0, 1])F1_score = 2*recall_score_1*accary_score_1/(recall_score_1+accary_score_1)print("thresholds in the testing dataset:", i)print("Recall metric in the testing dataset:", cnf_matrix[1, 1] / (cnf_matrix[1, 1] + cnf_matrix[1, 0]))print("accary metric in the testing dataset:", cnf_matrix[1, 1] / (cnf_matrix[1, 1] + cnf_matrix[0, 1]))print("F1 score:", F1_score)# Plot non-normalized confusion matrixclass_names = [0, 1]plot_confusion_matrix(cnf_matrix, classes = class_names, title = 'Threshold >= %s' %i)

F1值和混淆矩阵有关,该代码支持同时展示混淆矩阵和F1值。

  
  

2 写函数计算F1值具体实例

  
为了便于理解,举一个具体实例(参赛数据):

plot_confu_matrix_cal_F1(list(np.arange(0.4, 0.7, 0.05)), train_date)

thresholds:切割predict的阈值,本例中取的是list(np.arange(0.4, 0.7, 0.05))。
  
train_date:数据集,其中包含y标签列,predict预测列(可以是概率值,也可以是标签)。
  
得到结果如下:

thresholds in the testing dataset: 0.4
Recall metric in the testing dataset: 1.0
accary metric in the testing dataset: 1.0
F1 score: 1.0
Confusion matrix, without normalization
[[900   0][  0 300]]
thresholds in the testing dataset: 0.45
Recall metric in the testing dataset: 1.0
accary metric in the testing dataset: 1.0
F1 score: 1.0
Confusion matrix, without normalization
[[900   0][  0 300]]
thresholds in the testing dataset: 0.5
Recall metric in the testing dataset: 1.0
accary metric in the testing dataset: 1.0
F1 score: 1.0
Confusion matrix, without normalization
[[900   0][  0 300]]
thresholds in the testing dataset: 0.55
Recall metric in the testing dataset: 1.0
accary metric in the testing dataset: 1.0
F1 score: 1.0
Confusion matrix, without normalization
[[900   0][  0 300]]
thresholds in the testing dataset: 0.6
Recall metric in the testing dataset: 1.0
accary metric in the testing dataset: 1.0
F1 score: 1.0
Confusion matrix, without normalization
[[900   0][  0 300]]
thresholds in the testing dataset: 0.6499999999999999
Recall metric in the testing dataset: 1.0
accary metric in the testing dataset: 1.0
F1 score: 1.0
Confusion matrix, without normalization
[[900   0][  0 300]]

图片
  
由于train_date中的predict是已经划分成0和1的标签,所以我设定0.4到0.65切割时,都是默认0是一组,1是1组。从上面的结果知,模型的精确率P(Precision)、召回率R(Recall)、F1值都为1,即模型在训练集上完全拟合,可以完全区分出涉赌涉诈账户和非涉赌涉诈账户。

  
  

3 调用sklearn计算F1值

  
本文只关注二分类问题的F1值计算,sklearn中f1_score函数参数如下:

from sklearn.metrics import f1_score
f1_score(y_true, y_pred, *, labels=None, pos_label=1, average='binary', sample_weight=None, zero_division='warn')

常用参数说明:
  
y_true:真实标签列。
  
y_pred:预测标签列。
  
labels:可选参数,默认为None,是一个一维数组,二分类时,不需要该参数。
  
应用同样的数据,在sklearn中调用f1_score函数,语句如下:

f1_score(train_date.y, train_date.predict)

得到结果:

1

可以发现计算结果和写函数计算的结果一致,都为1。至此,F1值的原理和Python实现实例已讲解完毕,感兴趣的同学可以自己尝试实现一下。
  
你可能感兴趣:
用Python绘制皮卡丘
用Python绘制词云图
用Python绘制520永恒心动
Python人脸识别—我的眼里只有你
Python画好看的星空图(唯美的背景)
【Python】情人节表白烟花(带声音和文字)
用Python中的py2neo库操作neo4j,搭建关联图谱
Python浪漫表白源码合集(爱心、玫瑰花、照片墙、星空下的告白)


http://chatgpt.dhexx.cn/article/DL0MpWFa.shtml

相关文章

精确率、召回率、F1 值、ROC、AUC等分类模型评价指标含义与作用详解

文章目录 摘要一、精确率、召回率、F函数、准确率和错误率1、定义2、区别与应用 二、ROC曲线、P-R曲线、AUC1、P-R曲线2、ROC曲线3、AUC 摘要 在涉及机器学习领域的分类问题时(尤其是衡量推荐系统性能时),经常会遇到诸如准确率、召回率、ROC…

机器学习F1值的概念

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、什么是F1-score二、计算过程1.首先定义以下几个概念:2.通过第一步的统计值计算每个类别下的precision和recall3. 通过第二步计算结果计算每个类别下…

【数学建模】分类问题的几种常见指标(一)——准确率、召回率、F1值

分类问题的几种常见指标(一)——错误率、精度、准确率、召回率、F1值 前言1 错误率与精度2 准确率与召回率2.1 混淆矩阵2.2 准确率(Precision)2.3 召回率(Recall) 3 F1值(F1-score)4…

准确率、精确率、召回率、F1值、ROC/AUC整理笔记

文章目录 前言 一、TP、TN、FP、FN概念二、准确率、精确率(精准率)、召回率、F1值1.准确率(Accuracy)2.精确率(Precision)查准率3.召回率(Recall)查全率4.F1值(H-mean值&…

准确率、精准率、召回率和F1值详解

专业术语的中英文对照表 英文名准确率Accuracy精准率Precise召回率RecallF1值F1 measure Precise和Recall是广泛应用在信息检索和统计学分类领域的两个度量值,用来评价结果的质量;F1 measure是综合Precise和Recall两个指标的评估指标,用于综…

matlab color选取(颜色对照表)

只看前面部分,后面的颜色不用看 参考链接:https://wenku.baidu.com/view/111e6c47773231126edb6f1aff00bed5b8f3734e.html

Matlab RGB 颜色对照表(0-1之间取值)

需要说明的是我并非此表的制作者,原链接如上,我也已将原作者信息一并截入图中,此举只是为了扩大此表传播度,所以连标题都没改。此前想找个如此全的对照表找了好久,是同门师妹发给我该链接才知道这张表,感谢…

matlab画图RGB调色

1.使用matlab画图时,怎样才能调出顺眼的颜色呢?反正我之前使用红、绿、蓝三种颜色画图时,真的辣眼睛。下面这图是我根据一篇论文上的图像调的颜色: 我也知道这并不好看,但是可以给各位提个醒、提个方向。 代码也奉上&…

让颜色对应数值,matlab colormap

#问 如何让自己画出的数值对应不同的颜色呢?换话句话说,如何用不同的颜色表示不同的数值呢? 就是让数值的范围对应颜色的范围。 matlab colormap ##标准色 hsv 色彩饱和值(以红色开始束) hot 从黑到红到黄到白 cool …

【Matlab】到底怎么自定义colorbar/colormap的颜色?

1.Introduction 最近在搜混淆矩阵的时候,发现别人做的图研究就是好看。于是乎开始探寻怎么改变图片colorbar的颜色,搜到后面发现其实是改变colormap的颜色,colorbar只是显示而已。 中间也走过不少坑,一把辛酸泪呀~ 2.Materials …

MATLAB | 有关数值矩阵、颜色图及颜色列表的技巧整理

这是一篇有关数值矩阵、颜色矩阵、颜色列表的技巧整合,会以随笔的形式想到哪写到哪,可能思绪会比较飘逸请大家见谅,本文大体分为以下几个部分: 数值矩阵用颜色显示从颜色矩阵提取颜色从颜色矩阵中提取数据颜色列表相关函数颜色测…

MATLAB颜色的使用(转)

http://blog.csdn.net/t673afa/archive/2009/09/29/4617106.aspx 如何使用、显示、修改和如何创建用户自己的颜色映象。然后,阐述在一个 图形窗口 中仿真多个颜色映象的技术或只使用颜色映象的一部分的技术。最后,讨论照明模型并提供例子。 颜色映象理解…

Linux更换挂载点

目的:/dev/vdb 原本挂载在/data目录下,现在将他挂载在/data0 目录下 步骤: 1、查看/dev/vdb 的挂载点 #df -h2、卸载 /data 挂载点 #umount /data #df -h3、创建新的挂载点,并挂载、查看 #mkdir /data0 #mount /dev/vdb /data0…

Linux各个挂载点及其分区介绍

本文介绍Linux常用分区挂载点常识以及桌面、服务器分区挂载点的推荐配置,当然这个配置是天缘自己写的,分区大小这个话题是仁者见仁智者见智,欢迎大家一起交流这个话题,比如WEB服务、邮件服务、下载服务等,我们一起交流…

Linux磁盘分区和挂载点

https://www.jianshu.com/p/cc2d19dcc204 在Linux系统中最多只有16个分区。Linux 规定了主分区(或者扩展分区)占用 1 至 16 号码中的前 4 个号码。Windows是用不同的盘符来区分并抽象不同的分区方便我们访问,那么Linux是如何区分不同的分区的…

centos 的挂载和挂载点理解

文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 7.8G 0 7.8G 0% /dev tmpfs 7.8G 0 7.8G 0% /dev/shm tmpfs 7.8G 8.7M 7.8G 1% /run tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup /dev/vda1 40G 2.5G 35G 7% / tmpfs 1.6G 0 1.6G 0% /run/user/0 当我从华为云上安装好以后自动出现以…

linux 文件系统挂载时挂载点(目录)的选择

本篇内容很简单,就是给大家强调一个小知识点。在挂载文件系统的时候,尽可能选择空目录进行挂载,当然了不是空的目录也可以,但是不建议。 在实际的挂载中会出现这样一种情况,如果选择当挂载点的目录非空,当文…

到底什么是挂载?

首发公号:Rand_cs 在 L i n u x Linux Linux 的文件系统中,有个很重要的概念就是挂载,挂载大家应该都很熟悉,除了根文件系统,其他所有文件系统都要先挂载到根文件系统中的某个目录之后才能访问。 所谓的根文件系统就…

磁盘挂载

挂载数据盘 1.使用fdisk -l查看磁盘情况 2.使用df -h查看文件系统以及挂载点等磁盘信息 3.手动添加一块数据盘 这里演示挂载这个新添加的20G的硬盘。 4.fdisk -l看一下 已经有磁盘,新磁盘名字为/dev/sdb。 容量为20G,并且使用df -h可以看到并没有挂载…