详解准确率、精确率、召回率、F1值的含义

本文详细介绍了在机器学习中评估模型性能的常用指标,包括准确率、精确率、召回率和F1分数。准确率是预测正确的样本占比,但在样本不平衡时可能失真。精确率关注预测为正样本中的正确比例,召回率则关注实际正样本被正确预测的比例。F1分数作为精确率和召回率的调和平均数,提供了综合评估。理解并合理运用这些指标有助于优化模型的泛化能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

机器学习问题之中,通常需要建立模型来解决具体问题,但对于模型的好坏,也就是模型的泛化能力,如何进行评估呢?

很简单,我们可以定一些评价指标,来度量模型的优劣。比如准确率、精确率、召回率、F1值、ROC、AUC等指标,但是你清楚这些指标的具体含义吗?下面我们一起来看看吧。

1.混淆矩阵

介绍各个指标之前,我们先来了解一下混淆矩阵。假如现在有一个二分类问题,那么预测结果和实际结果两两结合会出现如下四种情况。

 

由于用数字1、0表示不太方便阅读,我们转换一下,用T(True)代表正确F(False)代表错误P(Positive)代表1N(Negative)代表0先看预测结果(P|N),然后再针对实际结果对比预测结果,给出判断结果(T|F)。按照上面逻辑,重新分配后为

 

TP、FP、FN、TN可以理解为

  • TP:预测为1,实际为1,预测正确。
  • FP:预测为1,实际为0,预测错误。
  • FN:预测为0,实际为1,预测错误。
  • TN:预测为0,实际为0,预测正确。

2.准确率

首先给出准确率(Accuracy)的定义,即预测正确的结果占总样本的百分比,表达式为

 

虽然准确率能够判断总的正确率,但是在样本不均衡的情况下,并不能作为很好的指标来衡量结果。

比如在样本集中,正样本有90个,负样本有10个,样本是严重的不均衡。对于这种情况,我们只需要将全部样本预测为正样本,就能得到90%的准确率,但是完全没有意义。对于新数据,完全体现不出准确率。因此,在样本不平衡的情况下,得到的高准确率没有任何意义,此时准确率就会失效。所以,我们需要寻找新的指标来评价模型的优劣。

3.精确率

精确率(Precision)是针对预测结果而言的,其含义是在被所有预测为正的样本中实际为正样本的概率,表达式为

 

精确率和准确率看上去有些类似,但是是两个完全不同的概念。精确率代表对正样本结果中的预测准确程度,准确率则代表整体的预测准确程度,包括正样本和负样本。

4.召回率

召回率(Recall)是针对原样本而言的,其含义是在实际为正的样本中被预测为正样本的概率,表达式为

 

下面我们通过一个简单例子来看看精确率和召回率。假设一共有10篇文章,里面4篇是你要找的。根据你的算法模型,你找到了5篇,但实际上在这5篇之中,只有3篇是你真正要找的。

那么算法的精确率是3/5=60%,也就是你找的这5篇,有3篇是真正对的。算法的召回率是3/4=75%,也就是需要找的4篇文章,你找到了其中三篇。以精确率还是以召回率作为评价指标,需要根据具体问题而定。

5.F1分数

精确率和召回率又被叫做查准率和查全率,可以通过P-R图进行表示

 

如何理解P-R(精确率-召回率)曲线呢?或者说这些曲线是根据什么变化呢?

以逻辑回归举例,其输出值是0-1之间的数字。因此,如果我们想要判断用户的好坏,那么就必须定一个阈值。比如大于0.5指定为好用户,小于0.5指定为坏用户,然后就可以得到相应的精确率和召回率。但问题是,这个阈值是我们随便定义的,并不知道这个阈值是否符合我们的要求。因此为了寻找一个合适的阈值,我们就需要遍历0-1之间所有的阈值,而每个阈值都对应一个精确率和召回率,从而就能够得到上述曲线。

根据上述的P-R曲线,怎么判断最好的阈值点呢?首先我们先明确目标,我们希望精确率和召回率都很高,但实际上是矛盾的,上述两个指标是矛盾体,无法做到双高。因此,选择合适的阈值点,就需要根据实际问题需求,比如我们想要很高的精确率,就要牺牲掉一些召回率。想要得到很高的召回率,就要牺牲掉一些精准率。但通常情况下,我们可以根据他们之间的平衡点,定义一个新的指标:F1分数(F1-Score)。F1分数同时考虑精确率和召回率,让两者同时达到最高,取得平衡。F1分数表达式为

 

上图P-R曲线中,平衡点就是F1值的分数。

 

<think>我们正在处理多分类问题下的评估指标计算。用户已经知道二分类情况下的计算方法,现在需要扩展到多分类。 多分类问题中,准确率(Accuracy)的计算方式与二分类相同,即正确预测的样本数占总样本数的比例。 但是精确(Precision)、召回率(Recall)和F1需要针对每个类别单独计算,然后可以通过多种平均方式得到全局指标。 具体步骤: 1. 对于每个类别i,将其视为正类,其他所有类别视为负类,从而计算该类别的: - TP_i: 正确预测为类别i的样本数 - FP_i: 实际不是类别i但被预测为类别i的样本数 - FN_i: 实际是类别i但被预测为其他类别的样本数 2. 然后可以计算每个类别的精确(Precision_i)和召回率(Recall_i): $$ \text{Precision}_i = \frac{TP_i}{TP_i + FP_i} $$ $$ \text{Recall}_i = \frac{TP_i}{TP_i + FN_i} $$ $$ \text{F1}_i = 2 \times \frac{\text{Precision}_i \times \text{Recall}_i}{\text{Precision}_i + \text{Recall}_i} $$ 3. 最后,可以通过以下三种平均方式之一得到全局的精确召回率F1: - 宏平均(Macro-average):对所有类别的指标取算术平均。 $$ \text{Precision}_{\text{macro}} = \frac{1}{n} \sum_{i=1}^{n} \text{Precision}_i $$ $$ \text{Recall}_{\text{macro}} = \frac{1}{n} \sum_{i=1}^{n} \text{Recall}_i $$ $$ \text{F1}_{\text{macro}} = \frac{1}{n} \sum_{i=1}^{n} \text{F1}_i $$ - 微平均(Micro-average):通过累加所有类别的TP、FP、FN来计算全局指标。 $$ \text{TP}_{\text{total}} = \sum_{i=1}^{n} TP_i $$ $$ \text{FP}_{\text{total}} = \sum_{i=1}^{n} FP_i $$ $$ \text{FN}_{\text{total}} = \sum_{i=1}^{n} FN_i $$ 然后: $$ \text{Precision}_{\text{micro}} = \frac{\text{TP}_{\text{total}}}{\text{TP}_{\text{total}} + \text{FP}_{\text{total}}} $$ $$ \text{Recall}_{\text{micro}} = \frac{\text{TP}_{\text{total}}}{\text{TP}_{\text{total}} + \text{FN}_{\text{total}}} $$ $$ \text{F1}_{\text{micro}} = 2 \times \frac{\text{Precision}_{\text{micro}} \times \text{Recall}_{\text{micro}}}{\text{Precision}_{\text{micro}} + \text{Recall}_{\text{micro}}} $$ - 加权平均(Weighted-average):以每个类别的样本数作为权重,对每个类别的指标进行加权平均。 $$ \text{Precision}_{\text{weighted}} = \sum_{i=1}^{n} w_i \cdot \text{Precision}_i, \quad \text{其中} w_i = \frac{\text{样本中类别i的数量}}{\text{总样本数}} $$ 同理计算加权召回率和加权F1。 注意:准确率(Accuracy)只有一种计算方式,即全局正确。 在scikit-learn中,我们可以通过指定`average`参数来选择平均方式: - 'macro': 宏平均 - 'micro': 微平均 - 'weighted': 加权平均 下面我们以鸢尾花数据集(三分类)为例,展示多分类评估指标的计算。</think>### 多分类问题下的评估指标计算详解 在多分类问题中,准确率(Accuracy)、精确(Precision)、召回率(Recall)和F1的计算需要采用特殊方法。核心思路是将多分类问题转化为多个"一对多"的二分类问题进行计算。以下是详细计算方法和实现: #### 📊 核心计算原理 1. **混淆矩阵扩展** 对于$K$个类别,混淆矩阵维度为$K \times K$,其中: - 对角线元素$C_{ii}$:正确预测的样本数 - 非对角线元素$C_{ij}(i \neq j)$:实际类别$i$被预测为$j$的样本数 2. **指标计算方式** - **准确率(Accuracy)**:全局正确 $$ \text{Accuracy} = \frac{\sum_{i=1}^K C_{ii}}{\sum_{i=1}^K \sum_{j=1}^K C_{ij}} $$ - **精确(Precision)**:按类别计算后平均 $$ \text{Precision}_i = \frac{C_{ii}}{\sum_{j=1}^K C_{ji}} $$ - **召回率(Recall)**:按类别计算后平均 $$ \text{Recall}_i = \frac{C_{ii}}{\sum_{j=1}^K C_{ij}} $$ - **F1**:调和平均数 $$ \text{F1}_i = 2 \times \frac{\text{Precision}_i \times \text{Recall}_i}{\text{Precision}_i + \text{Recall}_i} $$ #### ⚙️ 三种平均方法 在scikit-learn中通过`average`参数指定: | 平均方法 | 计算公式 | 适用场景 | |----------|----------|----------| | **宏平均(Macro)** | $$ \frac{1}{K} \sum_{i=1}^K \text{Metric}_i $$ | 所有类别同等重要 | | **微平均(Micro)** | 全局统计量计算 | 考虑样本不平衡 | | **加权平均(Weighted)** | $$ \sum_{i=1}^K w_i \cdot \text{Metric}_i $$<br>($w_i$=类别$i$样本比例) | 不平衡数据集 | #### 🌸 鸢尾花数据集示例 ```python from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import precision_score, recall_score, f1_score # 加载三分类数据集 data = load_iris() X, y = data.data, data.target # 划分训练/测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 训练决策树 model = DecisionTreeClassifier(max_depth=3) model.fit(X_train, y_train) y_pred = model.predict(X_test) # 计算指标(宏平均) print("宏平均:") print(f"Precision: {precision_score(y_test, y_pred, average='macro'):.4f}") print(f"Recall: {recall_score(y_test, y_pred, average='macro'):.4f}") print(f"F1: {f1_score(y_test, y_pred, average='macro'):.4f}") # 计算指标(微平均) print("\n微平均:") print(f"Precision: {precision_score(y_test, y_pred, average='micro'):.4f}") print(f"Recall: {recall_score(y_test, y_pred, average='micro'):.4f}") print(f"F1: {f1_score(y_test, y_pred, average='micro'):.4f}") # 计算指标(加权平均) print("\n加权平均:") print(f"Precision: {precision_score(y_test, y_pred, average='weighted'):.4f}") print(f"Recall: {recall_score(y_test, y_pred, average='weighted'):.4f}") print(f"F1: {f1_score(y_test, y_pred, average='weighted'):.4f}") ``` #### 💡 关键说明 1. **宏平均(Macro)**:平等对待所有类别,计算每个类别的指标后取算术平均。当类别重要性相同时使用[^1]。 2. **微平均(Micro)**:通过全局统计量计算: $$ \text{Precision}_{\text{micro}} = \frac{\sum TP}{\sum TP + \sum FP} $$ 等价于准确率(Accuracy)当且仅当每个样本都被正确分类到唯一类别。 3. **加权平均(Weighted)**:考虑类别不平衡,按类别样本量加权: $$ w_i = \frac{\text{类别}i\text{样本数}}{\text{总样本数}} $$ 4. **F1的特殊性**:宏F1与微F1的关系: $$ \text{F1}_{\text{micro}} \approx \text{Accuracy} $$ $$ \text{F1}_{\text{macro}} \text{更关注小类别表现} $$ #### 📈 多分类混淆矩阵解读 ```python from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay import matplotlib.pyplot as plt cm = confusion_matrix(y_test, y_pred) disp = ConfusionMatrixDisplay(cm, display_labels=data.target_names) disp.plot(cmap='Blues') plt.show() ``` - 对角线:各类别的正确预测数 - 行方向:召回率计算基础(行和为实际类别样本数) - 列方向:精确计算基础(列和为预测类别样本数) > 当某个类别的非对角线元素较大时,说明存在与其他类的混淆,需要调整模型参数或特征工程[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值