对模型性能进行评估(Machine Learning 研习十五)

2024-03-16 13:28

本文主要是介绍对模型性能进行评估(Machine Learning 研习十五),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一篇我们已然训练了一个用于对数字图像识别的模型,但我们目前还不知道该模型在识别数字图像效率如何?所以,本文将对该模型进行评估。

使用交叉验证衡量准确性

评估模型的一个好方法是使用交叉验证,让我们使用cross_val_score() 函数来评估我们的 SGDClassifier模型,使用三折的 k 折交叉验证。k-fold 交叉验证意味着将训练集分成 k 个折叠(在本例中是三个),然后训练模型 k 次,每次取出一个不同的折叠进行评估:

在这里插入图片描述

当您看到这组数字,是不是感到很兴奋?毕竟所有交叉验证折叠的准确率(预测准确率)均超过了 95%。然而,在您兴奋于这组数字前,还是让我们来看看一个假分类器,它只是将每张图片归入最常见的类别,在本例中就是负类别(即非 5):

from sklearn.dummy import DummyClassifierdummy_clf = DummyClassifier() 
dummy_clf.fit(X_train, y_train_5) 
print(any(dummy_clf.predict(X_train)))  # prints False: no 5s detected

您能猜出这个模型的准确度吗?让我们一探究竟:

在这里插入图片描述

没错,它的准确率超过 90%!这只是因为只有大约 10% 的图片是 5,所以如果你总是猜测图片不是 5,你就会有大约 90% 的时间是正确的。比诺斯特拉达穆斯还准。

这说明了为什么准确率通常不是分类器的首选性能指标,尤其是在处理偏斜``````数据集时(即某些类别的出现频率远高于其他类别)。评估分类器性能的更好方法是查看混淆矩阵(CM)。

实施交叉验证

Scikit-Learn现成提供的功能相比,您有时需要对交叉验证过程进行更多控制。在这种情况下,你可以自己实现交叉验证。下面的代码与 Scikit-Learn cross_val_score() 函数做了大致相同的事情,并会打印出相同的结果:

from sklearn.model_selection import StratifiedKFold 
from sklearn.base import cloneskfolds = StratifiedKFold(n_splits=3)  # add shuffle=True if the dataset is                                                # not already shuffled 
for train_index, test_index in skfolds.split(X_train, y_train_5):    clone_clf = clone(sgd_clf)    X_train_folds = X_train[train_index]    y_train_folds = y_train_5[train_index]    X_test_fold = X_train[test_index]    y_test_fold = y_train_5[test_index]clone_clf.fit(X_train_folds, y_train_folds)    y_pred = clone_clf.predict(X_test_fold)    n_correct = sum(y_pred == y_test_fold)    print(n_correct / len(y_pred))  # prints 0.95035, 0.96035, and 0.9604 

StratifiedKFold 类执行分层抽样,生成的折叠数包含每个类别的代表性比例。每次迭代时,代码都会创建分类器的克隆,在训练折叠上训练该克隆,并在测试折叠上进行预测。然后计算正确预测的次数,并输出正确预测的比例。

混淆矩阵

混淆矩阵的一般概念是计算在所有 A/B 对中,A 类实例被分类为 B 类的次数。例如,要知道分类器将 8 和 0 的图像混淆的次数,可以查看混淆矩阵的第 8 行第 0 列。

要计算混淆矩阵,首先需要有一组预测结果,以便与实际目标进行比较。你可以在测试集上进行预测,但最好暂时不要使用测试集(记住,只有在项目的最后阶段,也就是分类器准备好启动时,才会使用测试集)。相反,你可以使用 cross_val_predict() 函数:

from sklearn.model_selection import cross_val_predicty_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3) 

cross_val_score() 函数一样,cross_val_predict()也会执行 k 折交叉验证,但它返回的不是评估分数,而是在每个测试折上做出的预测。这意味着你可以得到训练集中每个实例的准确预测(我说的 "准确 "是指 “样本外”:模型对训练期间从未见过的数据进行预测)。

现在可以使用 confusion_matrix()函数获取混淆矩阵了。只需将目标类 (y_train_5) 和预测类 (y_train_pred) 传递给它即可:

在这里插入图片描述

混淆矩阵的每一行代表一个实际类别,每一列代表一个预测类别。矩阵的第一行是非 5 图像(负类): 其中 53 892 幅图像被正确分类为非 5 图像(称为真阴性图像),其余 687 幅图像被错误分类为 5 图像(称为假阳性图像,也称为 I 类错误)。第二行是 5 的图像(正类): 有 1 891 张图片被错误地归类为非 5(假阴性,也称为 II 类错误),而其余 3 530 张图片被正确地归类为 5(真阳性)。一个完美的分类器只有真阳性和真阴性,因此其混淆矩阵只有在主对角线上(从左上角到右下角)才有非零值:

在这里插入图片描述

混淆矩阵提供了大量信息,但有时您可能更喜欢更简洁的指标。一个有趣的指标是正向预测的准确度;这被称为分类器的精度(公式 见下图)。

在这里插入图片描述

TP 是正面的数量,FP是反面的数量。

要想获得完美的精度,一个简单的方法就是创建一个分类器,除了对它最有信心的实例进行一次正向预测外,它总是进行负向预测。如果这一个预测是正确的,那么分类器的精度就是 100%(精度 = 1/1 = 100%)。显然,这样的分类器用处不大,因为它会忽略除了一个正向实例之外的所有实例。因此,精度通常与另一个名为召回率的指标一起使用,召回率也称为灵敏度或真阳性率(TPR):这是分类器正确检测到的阳性实例的比率(公式见下图)。

在这里插入图片描述

FN当然是假不良的数量。

在这里插入图片描述

精确度和召回率

Scikit-Learn提供多种函数来计算分类器指标,包括精度和召回率:

在这里插入图片描述

现在,我们的 "5-检测器 "看起来不像我们观察它的准确性时那么闪亮了。当它声称一幅图像代表 5 时,正确率只有 83.7%。而且,它只能检测到 65.1% 的 5。

通常情况下,将精确度和召回率合并为一个称为 F1 分数的指标会比较方便,尤其是在需要用一个指标来比较两个分类器时。F1 分数是精确度和召回率的调和平均数(公式 见下图)。普通均值对所有值一视同仁,而调和均值对低值的权重要大得多。因此,分类器只有在召回率和精确率都很高的情况下才能获得较高的 F1 分数。

在这里插入图片描述

要计算 F1 分数,只需调用f1_score() 函数即可:

在这里插入图片描述

F1 分数有利于精确度和召回率相似的分类器。这并不总是你想要的:在某些情况下,你主要关心精度,而在另一些情况下,你真正关心的是召回率。例如,如果您训练了一个分类器来检测对儿童安全的视频,那么您可能更倾向于选择一个剔除了许多好视频(召回率低)但只保留安全视频(高精度)的分类器,而不是一个召回率高得多但却让一些非常糟糕的视频出现在您的产品中的分类器(在这种情况下,您甚至可能想要添加一个人工管道来检查分类器的视频选择)。另一方面,假设您训练了一个分类器来检测监控图像中的偷窃者:只要您的分类器的召回率达到 99%,即使它只有 30% 的精度也没有问题(当然,保安会收到一些错误警报,但几乎所有的偷窃者都会被抓住)。

不幸的是,鱼和熊掌不可兼得:提高精度会降低召回率,反之亦然。这就是所谓的精度/召回权衡。

这篇关于对模型性能进行评估(Machine Learning 研习十五)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/815630

相关文章

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

使用zabbix进行监控网络设备流量

《使用zabbix进行监控网络设备流量》这篇文章主要为大家详细介绍了如何使用zabbix进行监控网络设备流量,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装zabbix配置ENSP环境配置zabbix实行监控交换机测试一台liunx服务器,这里使用的为Ubuntu22.04(

在Pandas中进行数据重命名的方法示例

《在Pandas中进行数据重命名的方法示例》Pandas作为Python中最流行的数据处理库,提供了强大的数据操作功能,其中数据重命名是常见且基础的操作之一,本文将通过简洁明了的讲解和丰富的代码示例,... 目录一、引言二、Pandas rename方法简介三、列名重命名3.1 使用字典进行列名重命名3.编

python安装完成后可以进行的后续步骤和注意事项小结

《python安装完成后可以进行的后续步骤和注意事项小结》本文详细介绍了安装Python3后的后续步骤,包括验证安装、配置环境、安装包、创建和运行脚本,以及使用虚拟环境,还强调了注意事项,如系统更新、... 目录验证安装配置环境(可选)安装python包创建和运行Python脚本虚拟环境(可选)注意事项安装

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery