精确率、召回率与F1分数
- 1、引言
- 2、定义
- 2.1 精确率
- 2.2 召回率
- 2.3 F1分数
- 2.4 二分类任务
- 2.5 代码示例
- 3、总结
1、引言
小屌丝:鱼哥,你在给我详细的唠叨唠叨 精确率,召回率和F1分数。
小鱼:这…这不是机器学习基本知识吗
小屌丝:不就是基础没打好,所以才让你在给我唠叨一次。
小鱼:感情我这是循环播放器啊
小屌丝:鱼哥,那你就在播放一次。
小鱼:那可没时间
小屌丝:播放完,我们去…
小鱼:去哪里?干啥去?我可是正经人。
小屌丝:… 我也没说你不是正经人哦
小鱼:这… 还差不多。 我可不是为了那几张门票的!
小屌丝: 对对对
小鱼:看样子还不服气…
小屌丝:必须服气,你说的都对。
小鱼:这还差不多。
2、定义
2.1 精确率
精确率衡量的是被预测为正例的样本中实际为正例的比例。
它关注的是在模型预测为正例的样本中,有多少是真正的正例。
计算公式为:
Precision = TP TP + FP \text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}} Precision=TP+FPTP
其中:
- FP(False Positives):假正例,即实际为负例但被模型预测为正例的样本数。
- 精确度越高,意味着模型预测为正例的样本中,误报的样本越少。
2.2 召回率
召回率也称为查全率,它衡量的是实际为正例的样本中被预测为正例的比例。换句话说,召回率关注的是在所有真正例(True Positives, TP)中,模型找出了多少真正例。
计算公式为:
Recall
=
TP
TP
+
FN
\text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}}
Recall=TP+FNTP
其中:
- TP(True Positives):真正例,即实际为正例且被模型预测为正例的样本数。
- FN(False Negatives):假反例,即实际为正例但被模型预测为负例的样本数。
2.3 F1分数
F1分数是召回率和精确度的调和平均数,用于综合评估模型的性能。
它旨在平衡召回率和精确度,因为有时单独优化其中一个指标可能会导致另一个指标的性能下降。
计算公式为:
F1 Score
=
2
×
Precision
×
Recall
Precision
+
Recall
\text{F1 Score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}
F1 Score=2×Precision+RecallPrecision×Recall
F1分数越高,意味着模型在召回率和精确度上都表现良好,综合性能较优
2.4 二分类任务
在机器学习的分类任务中,特别是二分类任务中,TP、FP、FN、TN 是四个常用的指标,用于描述模型预测结果与实际标签之间的关系。
这四个指标的具体含义如下:
-
真正例 (True Positive, TP):模型预测为正例,且实际标签也为正例的样本数。这些样本被模型正确地识别为正例。
-
假正例 (False Positive, FP):模型预测为正例,但实际标签为负例的样本数。这些样本被模型错误地识别为正例,也称为误报。
-
真反例 (True Negative, TN):模型预测为负例,且实际标签也为负例的样本数。这些样本被模型正确地识别为负例。
-
假反例 (False Negative, FN):模型预测为负例,但实际标签为正例的样本数。这些样本被模型错误地识别为负例,也称为漏报。
这四个指标构成了一个混淆矩阵 (Confusion Matrix),它是评估分类模型性能的一种常用工具。
混淆矩阵可以直观地显示模型分类的详细结果,帮助分析模型的错误类型。
举个栗子:
样本 | 预测 | 实际 |
---|---|---|
1 | 正例 | 正例 |
2 | 负例 | 负例 |
3 | 正例 | 负例 |
4 | 负例 | 正例 |
在这个例子中:
- 样本1是真正例(TP),因为模型预测为正例,实际也是正例。
- 样本2是真反例(TN),因为模型预测为负例,实际也是负例。
- 样本3是假正例(FP),因为模型预测为正例,但实际是负例。
- 样本4是假反例(FN),因为模型预测为负例,但实际是正例。
计算召回率、精确度和F1分数:
- 召回率 = TP / (TP + FN) = 1 / (1 + 1) = 0.5
- 精确度 = TP / (TP + FP) = 1 / (1 + 1) = 0.5
- F1分数 = 2 * (精确度 * 召回率) / (精确度 + 召回率) = 2 * (0.5 * 0.5) / (0.5 + 0.5) = 0.5
2.5 代码示例
# -*- coding:utf-8 -*-
# @Time : 2024-01-21
# @Author : Carl_DJ
'''
实现功能:
基于二分类任务,使用scikit-learn库来计算并展示召回率、精确度和F1分数
'''
from sklearn.metrics import precision_score, recall_score, f1_score, confusion_matrix, accuracy_score
# 假设我们有以下预测结果和实际标签
y_true = [0, 1, 1, 0, 1, 1, 0, 0, 1, 1] # 实际标签
y_pred = [0, 1, 0, 0, 0, 1, 1, 0, 1, 1] # 模型预测结果
# 计算混淆矩阵
cm = confusion_matrix(y_true, y_pred)
print("混淆矩阵:")
print(cm)
# 计算召回率
recall = recall_score(y_true, y_pred)
print(f"召回率 (Recall): {recall}")
# 计算精确度
precision = precision_score(y_true, y_pred)
print(f"精确度 (Precision): {precision}")
# 计算F1分数
f1 = f1_score(y_true, y_pred)
print(f"F1分数 (F1 Score): {f1}")
# 计算准确率
accuracy = accuracy_score(y_true, y_pred)
print(f"准确率 (Accuracy): {accuracy}")
# 解释混淆矩阵
tp, fp, fn, tn = cm.ravel()
print(f"真正例 (TP): {tp}")
print(f"假正例 (FP): {fp}")
print(f"假反例 (FN): {fn}")
print(f"真反例 (TN): {tn}")
# 根据混淆矩阵解释召回率和精确度
print(f"召回率 = TP / (TP + FN) = {tp} / ({tp + fn}) = {recall}")
print(f"精确度 = TP / (TP + FP) = {tp} / ({tp + fp}) = {precision}")
# F1分数的公式
print(f"F1分数 = 2 * (精确度 * 召回率) / (精确度 + 召回率) = 2 * ({precision} * {recall}) / ({precision} + {recall}) = {f1}")
运行结果
混淆矩阵:
[[3 1]
[1 5]]
召回率 (Recall): 0.8333333333333334
精确度 (Precision): 0.8333333333333334
F1分数 (F1 Score): 0.8333333333333334
准确率 (Accuracy): 0.8
真正例 (TP): 5
假正例 (FP): 1
假反例 (FN): 1
真反例 (TN): 3
召回率 = TP / (TP + FN) = 5 / (5 + 1) = 0.8333333333333334
精确度 = TP / (TP + FP) = 5 / (5 + 1) = 0.8333333333333334
F1分数 = 2 * (精确度 * 召回率) / (精确度 + 召回率) = 2 * (0.8333333333333334 * 0.8333333333333334) / (0.8333333333333334 + 0.8333333333333334) = 0.8333333333333334
3、总结
我是小鱼:
- CSDN 博客专家;
- 阿里云 专家博主;
- 51CTO博客专家;
- 企业认证金牌面试官;
- 多个名企认证&特邀讲师等;
- 名企签约职场面试培训、职场规划师;
- 多个国内主流技术社区的认证专家博主;
- 多款主流产品(阿里云等)测评一、二等奖获得者;
关注小鱼,学习【机器学习】&【深度学习】知识,不再迷路。