【人工智能机器学习基础篇】——深入详解监督学习之模型评估:掌握评估指标(准确率、精确率、召回率、F1分数等)和交叉验证技术

news2025/1/3 13:10:32

深入详解监督学习之模型评估

在监督学习中,模型评估是衡量模型性能的关键步骤。有效的模型评估不仅能帮助我们理解模型在训练数据上的表现,更重要的是评估其在未见数据上的泛化能力。本文将深入探讨监督学习中的模型评估方法,重点介绍评估指标(准确率、精确率、召回率、F1分数等)和交叉验证技术,并通过示例代码帮助读者更好地理解和应用这些概念。

目录

  1. 模型评估的重要性
  2. 评估指标详解
    • 准确率(Accuracy)
    • 精确率(Precision)
    • 召回率(Recall)
    • F1分数(F1 Score)
    • ROC曲线与AUC
    • 混淆矩阵
  3. 交叉验证技术
    • 简单交叉验证(Hold-Out)
    • K折交叉验证(K-Fold Cross-Validation)
    • 留一交叉验证(Leave-One-Out Cross-Validation)
    • 分层K折交叉验证(Stratified K-Fold)
  4. 示例代码
    • 评估指标的计算
    • 交叉验证的实现
  5. 模型评估的最佳实践
  6. 总结

1. 模型评估的重要性

在监督学习中,我们通常将数据集分为训练集和测试集。模型在训练集上进行学习,而在测试集上进行评估。然而,单纯依赖一次划分可能导致评估结果不稳定,受数据分布的影响较大。因此,引入多种评估指标和验证技术,能够更加全面和准确地衡量模型性能。

模型评估的主要目标包括:

  • 衡量模型的准确性:模型在预测任务上的表现如何?
  • 识别模型的偏差与方差:模型是过拟合还是欠拟合?
  • 选择最优模型:在多个模型中选择表现最好的一个。
  • 指导模型改进:了解模型的优缺点,针对性地改进模型。

2. 评估指标详解

不同的评估指标适用于不同类型的问题,尤其是在分类问题中,根据数据的特性选择合适的指标至关重要。以下将详细介绍常用的评估指标。

2.1 准确率(Accuracy)

定义:准确率是分类正确的样本数占总样本数的比例。

\[
\text{Accuracy} = \frac{\text{TP} + \text{TN}}{\text{TP} + \text{TN} + \text{FP} + \text{FN}}
\]

  • TP(True Positive):真正例,模型正确预测为正类的数量。
  • TN(True Negative):真反例,模型正确预测为负类的数量。
  • FP(False Positive):假正例,模型错误预测为正类的数量。
  • FN(False Negative):假反例,模型错误预测为负类的数量。

适用场景:适用于类别分布均衡的分类问题。

局限性:在类别不平衡的数据集中,准确率可能会误导。例如,若正类仅占1%,一个始终预测为负类的模型准确率也能达到99%。

2.2 精确率(Precision)

定义:精确率是模型预测为正类的样本中实际为正类的比例。

\[
\text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}}
\]

适用场景:适用于关注减少假正例的场景,如垃圾邮件过滤、疾病筛查。

局限性:仅关注正类预测的准确性,忽略了实际正类被漏掉的情况。

2.3 召回率(Recall)

定义:召回率是实际为正类的样本中被正确预测为正类的比例。

\[
\text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}}
\]

适用场景:适用于关注减少假反例的场景,如病人诊断、欺诈检测。

局限性:仅关注正类被识别的全面性,忽略了错误预测为正类的情况。

2.4 F1分数(F1 Score)

定义:F1分数是精确率和召回率的调和平均,平衡了二者的权重。

\[
\text{F1 Score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}
\]

适用场景:适用于需要平衡精确率和召回率的场景。

局限性:在某些情况下,调和平均可能无法反映实际需求。

2.5 ROC曲线与AUC

ROC曲线(Receiver Operating Characteristic Curve):展示了分类器在不同阈值下的真阳性率(Sensitivity)与假阳性率(1 - Specificity)的关系。

AUC(Area Under the ROC Curve):ROC曲线下的面积,衡量分类器整体性能。AUC值越接近1,模型性能越好;接近0.5,则表示模型没有辨别能力。

适用场景:适用于需要评估分类器在不同阈值下表现的场景,特别是二分类问题。

局限性:对于多类别分类问题,需要扩展为多标签或使用其他方法。

2.6 混淆矩阵(Confusion Matrix)

定义:

混淆矩阵是一个表格,用于展示分类模型的预测结果。它显示了真实类别和预测类别之间的关系,特别适用于分类问题的性能评估。通过混淆矩阵,能够了解模型在分类任务中的正确与错误预测情况,从而为模型的改进提供依据。

混淆矩阵结构(以二分类为例):
实际\预测预测为正类 (Positive)预测为负类 (Negative)
实际为正类 (Positive)TP (True Positive)FN (False Negative)
实际为负类 (Negative)FP (False Positive)TN (True Negative)
  • TP (True Positive):真正例,表示实际为正类且模型预测为正类的样本数。
  • FN (False Negative):假反例,表示实际为正类但模型预测为负类的样本数。
  • FP (False Positive):假正例,表示实际为负类但模型预测为正类的样本数。
  • TN (True Negative):真反例,表示实际为负类且模型预测为负类的样本数。
主要用途:

混淆矩阵通过显示TPTNFPFN,帮助我们深入分析模型的具体表现。通过这些信息,我们可以计算多个重要的分类评估指标,如准确率、精度、召回率和F1分数,进一步了解模型的预测效果。此外,混淆矩阵也有助于识别潜在问题,比如类别不平衡导致的预测偏差。

适用场景:
  • 二分类问题:混淆矩阵是二分类问题(如判断是否患病、垃圾邮件分类等)评估的重要工具。
  • 多分类问题:对于多类别问题,混淆矩阵可以扩展为 N×N 的矩阵,其中 N是类别数。每个元素代表模型在对应类别的预测情况。
局限性:
  1. 多类别问题的复杂性:对于多类别问题,混淆矩阵将是一个多维矩阵,随着类别数增加,分析和解释变得更加复杂。
  2. 不能直接提供准确率:混淆矩阵只显示分类结果的数量,而不能直接给出模型的整体准确性,需要结合其他评估指标进行综合分析。
示例:

假设我们有一个二分类模型,用于判断是否患有某种疾病。真实标签和模型预测结果的混淆矩阵如下所示:

实际\预测预测为阳性 (Positive)预测为阴性 (Negative)
实际为阳性 (Positive)80 (TP)20 (FN)
实际为阴性 (Negative)30 (FP)70 (TN)

在这个例子中:

  • TP (True Positive) = 80:80个实际为阳性的病例被正确预测为阳性。
  • FN (False Negative) = 20:20个实际为阳性的病例被错误预测为阴性。
  • FP (False Positive) = 30:30个实际为阴性的病例被错误预测为阳性。
  • TN (True Negative) = 70:70个实际为阴性的病例被正确预测为阴性。
进一步扩展:
  • 对于多类别问题,混淆矩阵将是一个 N×N 的矩阵,每个元素表示实际类别与预测类别之间的关系。例如,对于三个类别 AB、和 C,混淆矩阵可能如下:
实际\预测预测为 A预测为 B预测为 C
实际为 A30 (TP)5 (FP)10 (FP)
实际为 B4 (FN)40 (TP)2 (FP)
实际为 C8 (FN)3 (FN)50 (TP)

在这种情况下,矩阵的每一行和每一列都代表一种类别,帮助我们分析模型在每一类别上的表现。

混淆矩阵是分类模型性能评估的一个核心工具,它可以帮助我们全面了解模型的预测结果及其错误类型。在二分类问题中,混淆矩阵结构相对简单,但在多分类问题中,矩阵将变得更加复杂,需要通过更细致的分析来解读。为了全面评估模型的表现,我们通常结合其他评估指标,如准确率、精确度、召回率和F1分数等,来获取更深层次的模型性能分析。


3. 交叉验证技术

交叉验证是一种评估模型泛化能力的技术,通过在不同的数据子集上训练和测试模型,获得更可靠的性能估计。以下介绍几种常见的交叉验证方法。

3.1 简单交叉验证(Hold-Out)

方法:将数据集随机分为训练集和测试集,通常比例为70:30或80:20。

步骤

  1. 随机划分数据为训练集和测试集。
  2. 在训练集上训练模型。
  3. 在测试集上评估模型性能。

优点:简单快速,适用于大数据集。

缺点:评估结果依赖于数据划分,可能存在过拟合或欠拟合风险。

3.2 K折交叉验证(K-Fold Cross-Validation)

方法:将数据集分为K个等大小的子集,轮流使用其中一个子集作为测试集,剩余K-1个子集作为训练集,重复K次,最终取K次评估结果的平均值。

步骤

  1. 将数据集分为K个互不重叠的子集。
  2. 对于每个子集:
    • 将其作为测试集,其余K-1个子集作为训练集。
    • 训练模型并在测试集上评估性能。
  3. 计算所有K次评估结果的平均值和标准差。

优点:有效利用全部数据,评估结果更稳定。

缺点:计算量较大,适用于中等规模的数据集。

3.3 留一交叉验证(Leave-One-Out Cross-Validation, LOOCV)

方法:K折交叉验证中K等于数据集中样本的数量。每次仅留一个样本作为测试集,其余样本作为训练集,重复N次(N为样本数),最终计算平均性能。

优点:充分利用数据,评估结果无偏。

缺点:计算成本极高,适用于小规模数据集。

3.4 分层K折交叉验证(Stratified K-Fold Cross-Validation)

方法:在K折交叉验证的基础上,保持每一折中各类别的比例与整个数据集一致,适用于类别不平衡的数据集。

步骤

  1. 根据类别标签,将数据分层。
  2. 在每个层内进行K折划分,保持类别比例。
  3. 进行K次训练和评估。

优点:适用于类别不平衡的数据集,评估结果更为可靠。

缺点:实现略复杂,比普通K折交叉验证计算量稍大。

4. 示例代码

以下将通过Python中的scikit-learn库,展示如何计算评估指标和实现交叉验证。

4.1 评估指标的计算

import numpy as np
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, roc_auc_score, roc_curve
import matplotlib.pyplot as plt

# 假设这是模型的预测结果和真实标签
y_true = np.array([0, 1, 1, 0, 1, 0, 1, 1, 0, 0])
y_pred = np.array([0, 1, 0, 0, 1, 0, 1, 0, 0, 1])

# 计算评估指标
accuracy = accuracy_score(y_true, y_pred)
precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
conf_matrix = confusion_matrix(y_true, y_pred)

print("准确率 (Accuracy):", accuracy)
print("精确率 (Precision):", precision)
print("召回率 (Recall):", recall)
print("F1分数 (F1 Score):", f1)
print("混淆矩阵 (Confusion Matrix):\n", conf_matrix)

# 计算ROC AUC
y_scores = np.array([0.1, 0.9, 0.4, 0.3, 0.85, 0.2, 0.78, 0.65, 0.1, 0.7])
auc = roc_auc_score(y_true, y_scores)
fpr, tpr, thresholds = roc_curve(y_true, y_scores)
print("ROC AUC:", auc)

# 绘制ROC曲线
plt.figure()
plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % auc)
plt.plot([0, 1], [0, 1], 'k--')  # 对角线
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate (FPR)')
plt.ylabel('True Positive Rate (TPR)')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.show()

代码解释

  1. 数据准备

    • y_true:真实标签。
    • y_pred:模型预测标签。
    • y_scores:模型对样本为正类的预测概率,用于计算ROC曲线和AUC。
  2. 指标计算

    • 使用scikit-learnaccuracy_scoreprecision_scorerecall_scoref1_score等函数计算相应的指标。
    • 使用confusion_matrix生成混淆矩阵。
  3. ROC曲线和AUC计算

    • 使用roc_auc_score计算AUC值。
    • 使用roc_curve计算不同阈值下的FPR和TPR,并绘制ROC曲线。

4.2 交叉验证的实现

from sklearn.model_selection import cross_val_score, KFold, StratifiedKFold
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression

# 加载示例数据集
data = load_iris()
X = data.data
y = data.target

# 二分类问题,选择两类
X = X[y != 2]
y = y[y != 2]

model = LogisticRegression()

# 简单K折交叉验证
kf = KFold(n_splits=5, shuffle=True, random_state=42)
cv_scores = cross_val_score(model, X, y, cv=kf, scoring='accuracy')
print("K折交叉验证准确率:", cv_scores)
print("平均准确率:", cv_scores.mean())

# 分层K折交叉验证
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
cv_scores_strat = cross_val_score(model, X, y, cv=skf, scoring='accuracy')
print("分层K折交叉验证准确率:", cv_scores_strat)
print("平均分层准确率:", cv_scores_strat.mean())

# 自定义交叉验证过程
for fold, (train_index, test_index) in enumerate(kf.split(X)):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    model.fit(X_train, y_train)
    score = model.score(X_test, y_test)
    print(f"Fold {fold + 1} 准确率: {score:.4f}")

代码解释

  1. 数据准备

    • 使用load_iris加载鸢尾花数据集,并转换为二分类问题(保留两类标签)。
  2. 模型选择

    • 选择逻辑回归(Logistic Regression)作为示例模型。
  3. K折交叉验证

    • 使用KFold将数据分为5折,shuffle=True确保数据被随机打乱,random_state=42保证结果的可重复性。
    • 使用cross_val_score计算每一折的准确率,并打印出每一折的得分和平均得分。
  4. 分层K折交叉验证

    • 使用StratifiedKFold保持每一折中类别比例与整个数据集一致。
    • 同样使用cross_val_score计算准确率。
  5. 自定义交叉验证过程

    • 通过循环遍历每一折,手动训练和评估模型,提高对交叉验证过程的理解。

5. 模型评估的最佳实践

在进行模型评估时,遵循一些最佳实践可以帮助确保评估的准确性和可靠性。

5.1 数据划分策略

  • 训练集、验证集和测试集:除了训练集和测试集,还可以引入验证集用于模型选择和超参数调优,避免在测试集上进行多次评估导致过拟合。
  • 保持数据分布一致:确保划分后的各个子集保持整体数据的分布特性,特别是在类别不平衡的情况下,考虑使用分层划分。

5.2 使用多种评估指标

  • 不依赖单一指标,如仅使用准确率,综合考虑精确率、召回率、F1分数等多个指标,全面评估模型性能。
  • 根据具体任务需求,选择最合适的评估指标。例如,在医疗诊断中,召回率可能比精确率更重要。

5.3 避免数据泄漏

  • 数据泄漏(Data Leakage):在训练过程中无意中使用了测试集的信息,导致模型评估结果不真实。确保在模型训练和评估中严格区分数据集。

5.4 交叉验证的合理使用

  • 根据数据集大小和计算资源,选择合适的交叉验证方法。对于大规模数据集,简单的K折交叉验证可能更为高效;对于小规模数据集,留一交叉验证提供更可靠的评估。
  • 使用分层K折交叉验证处理分类问题,尤其是在类别不平衡时。

5.5 图形化评估

  • 使用混淆矩阵、ROC曲线等图形化工具,直观了解模型表现,发现潜在问题。
  • 通过学习曲线(训练损失与验证损失随训练次数的变化)分析模型的训练状态,判断是否存在过拟合或欠拟合。

6. 总结

        模型评估是监督学习中不可或缺的环节,选择合适的评估指标和验证技术,能够全面、准确地衡量模型性能,指导模型的优化和改进。通过本文的深入解析和示例代码,读者应能够理解并应用各种评估方法,提高模型的泛化能力和实际应用效果。


参考资料

  1. 《机器学习》(周志华 著)
  2. Scikit-learn官方文档:scikit-learn: machine learning in Python — scikit-learn 1.6.0 documentation
  3. 《Python机器学习》(Sebastian Raschka 著)
  4. 混淆矩阵和ROC曲线:Wikipedia - ROC Curve

【此文为作者经过搜集资料,整理及编辑而成,属于个人学习过程中对于人工智能相关知识概念进行的整合作品,仅供学习者参考,若有不当之处可进行指正,共同学习交流!】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch基础之注解的使用--003

Title 1.学习目标2.定义3.使用步骤4.结果 1.学习目标 针对源码中出现一些注解的问题,这里专门写一篇文章进行讲解。包括如何自定义注解,以及注意事项,相信JAVA中很多朋友业写过,但是今天写的是Python哦。。。 2.定义 在 Python…

Linux day 1129

家人们今天继续学习Linux,ok话不多说一起去看看吧 三.Linux常用命令 3.1 Linux命令体验 3.1.1 常用命令演示 在这一部分中,我们主要介绍几个常用的命令,让大家快速感 受以下 Linux 指令的操作方式。主要包含以下几个指令: ls命…

【基础篇】二、MySQL数据库的操作

文章目录 前言Ⅰ. 创建数据库1、语法2、举例 Ⅱ. 字符集和校验规则1、查看系统默认字符集以及校验规则2、查看数据库支持的字符集3、查看数据库支持的字符集校验规则4、校验规则对数据库的影响 Ⅲ. 操作数据库1、查看数据库2、显示创建语句3、使用数据库4、删除数据库5、修改数…

NLP中的神经网络基础

一:多层感知器模型 1:感知器 解释一下,为什么写成 wxb>0 ,其实原本是 wx > t ,t就是阈值,超过这个阈值fx就为1,现在把t放在左边。 在感知器里面涉及到两个问题: 第一个,特征提…

2025常见的软件测试面试题

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 “ 今天我给大家介绍一些python自动化测试中常见的面试题,涵盖了Python基础、测试框架、测试工具、测试方法等方面的内容,希望能够帮助…

日常编码练习

通过投票对团队排名 题目要求: 解题思路: 思路:以示例1为例 1、我们需要去遍历该数据结构,同时记录每个字符出现的次数。为此需要定义一张哈希表来建立映射关系。 注:哈希表仅仅起到了两个作用 ①:建立映射…

Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J实现原理分析

文章目录 官网SLF4J 简单使用案例分析SLF4J 获取 Logger 的原理获取 ILoggerFactory 的过程获取 Logger 的过程SLF4J 与底层日志框架的集成 小结 官网 https://slf4j.org/ Simple Logging Facade for Java (SLF4J) 用作各种日志记录框架(e.g…

HALCON中用于分类的高斯混合模型create_class_gmm

目录 一、创建用于分类的高斯混合模型函数二、代码和效果展示三、相关函数 一、创建用于分类的高斯混合模型函数 create_class_gmm( : : NumDim, NumClasses, NumCenters, CovarType, Preprocessing, NumComponents, RandSeed : GMMHandle)create_class_gmm创建用于分类的高斯…

在实际开发中,如何权衡选择使用哪种数据结构和算法?

学习数据结构与算法有一段时间了,听音频、看视频、看专栏、看书、抄书,尝试了很多种方法,今天在 专栏 中看到一篇文章,觉得很不错,摘抄如下。 学习数据结构和算法,不要停留在学院派的思维中,只把…

Airbnb/Booking 系统设计(high level architecture)

原文地址 CodeKarle: Airbnb System Design | Booking.com System Design B站搜 “Airbnb System Design” 有视频版本 需求: 功能性需求 系统用户包括商家和客人。 Hotel - 商家(拥有hotel的人) onboarding - 商家可以入住系统。 update…

如何在谷歌浏览器中清理无效的扩展

谷歌浏览器是一款功能强大且广受欢迎的网络浏览器,它允许用户安装各种扩展来增强功能。然而,随着时间的推移,一些扩展可能变得无效或不再需要,这时就需要清理这些无效的扩展以减少浏览器的负担并提升性能。 一、步骤详解 1. 打开…

MySQLOCP考试过了,题库很稳,经验分享。

前几天,本人参加了Oracle认证 MySQLOCP工程师认证考试 ,先说下考这个证书的初衷: 1、首先本人是从事数据库运维的,今年开始单位逐步要求DBA持证上岗。 2、本人的工作是涉及数据库维护,对这块的内容比较熟悉&#xff…

艾体宝产品丨加速开发:Redis 首款 VS Code 扩展上线!

Redis 宣布推出其首款专为 VS Code 设计的 Redis 扩展。这一扩展将 Redis 功能直接整合进您的集成开发环境(IDE),旨在简化您的工作流程,提升工作效率。 我们一直致力于构建强大的开发者生态系统,并在您工作的每一步提…

银河麒麟系统安装Wireshark抓包工具

麒麟系统安装Wireshark抓包工具 1. 麒麟SP1安装Wireshark 【1】. 安装Wireshark 在线安装wireshark 命令如下: apt-get install wireshark-qt软件包设置 弹出对话框,选择【是】选项。 安装完成。 【2】. 使用Wireshark 如果是普通用户,…

WPF 绘制过顶点的圆滑曲线 (样条,贝塞尔)

在一个WPF项目中要用到样条曲线,必须过顶点,圆滑后还不能太走样,捣鼓一番,发现里面颇有玄机,于是把我多方抄来改造的方法发出来,方便新手: 如上图,看代码吧: ----------…

Redis--持久化策略(AOF与RDB)

持久化策略(AOF与RDB) 持久化Redis如何实现数据不丢失?RDB 快照是如何实现的呢?执行时机RDB原理执行快照时,数据能被修改吗? AOF持久化是怎么实现的?AOF原理三种写回策略AOF重写机制 RDB和AOF合…

学习路之VScode--自定义按键写注释(插件)

1. 安装 "KoroFileHeader" 插件 首先,在 VScode 中搜索并安装名为 "KoroFileHeader" 的插件。你可以通过在扩展商店中搜索插件名称来找到并安装它。 2. 进入 VScode 设置页面 点击 VScode 左下角的设置图标,然后选择 "设置&q…

开源电子书转有声书整合包ebook2audiobookV2.0.0

ebook2audiobook:将电子书转换为有声书的开源项目 项目地址 GitHub - DrewThomasson/ebook2audiobook 整合包下载 更新至v2.0.0 https://pan.quark.cn/s/22956c5559d6 修改:页面已转为中文 项目简介 ebook2audiobook 是一个开源项目,它能够将电子…

3.5mm耳机接口硬件连接

结构 以最复杂的结构为例 简单的结构无非就是没有MIC(麦克风)接口 上图的5就是Detect的作用 上面这两款产品都为3.5mm的音频插座,图一 为连接4节的音频座,而且有两个开关,1接地,2接MIC,3接左声…

【贪心算法】贪心算法七

贪心算法七 1.整数替换2.俄罗斯套娃信封问题3.可被三整除的最大和4.距离相等的条形码5.重构字符串 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃&#x1f…