机器学习中分类任务的常用评估指标和python代码实现

简介: 机器学习中分类任务的常用评估指标和python代码实现

假设您的任务是训练ML模型,以将数据点分类为一定数量的预定义类。一旦完成分类模型的构建,下一个任务就是评估其性能。有许多指标可以帮助您根据用例进行操作。在此文章中,我们将尝试回答诸如何时使用?它是什么?以及如何实施?

混淆矩阵

混淆矩阵定义为(类x类)大小的矩阵,因此对于二进制分类,它是2x2,对于3类问题,它是3x3,依此类推。为简单起见,让我们考虑二元分类并了解矩阵的组成部分。

640.png

真实正值(TP)-表示该类为“真值”的次数,您的模型也表示它为“真值”。真负数(TN)-表示该类为假值的次数,您的模型也表示它为假值。误报(FP)-表示该类为假值,但您的模型表示为真值。

您可以通过这种方式记住它—您的模型错误地认为它是肯定的

假阴性(FN)-表示该类为“真值”的次数,但您的模型表示为“假值”。

您可以通过这种方式记住它-您的模型错误地认为它是假值的

您可以使用sklearn轻松获得混淆矩阵,如下所示-

fromsklearnimportmetricsdefcalculate_confusion_matrix(y, y_pred):
returnmetrics.confusion_matrix(y, y_pred)

如图1所示,混淆矩阵的成分是TP,TN,FP,FN,您也可以使用普通python计算它们,如下所示-计算TP,TN,FP,FN

defcalculate_TP(y, y_pred):
tp=0fori, jinzip(y, y_pred):
ifi==j==1:
tp+=1returntpdefcalculate_TN(y, y_pred):
tn=0fori, jinzip(y, y_pred):
ifi==j==0:
tn+=1returntndefcalculate_FP(y, y_pred):
fp=0fori, jinzip(y, y_pred):
ifi==0andj==1:
fp+=1returnfpdefcalculate_FN(y, y_pred):
fn=0fori, jinzip(y, y_pred):
ifi==1andj==0:
fn+=1returnfn

混淆矩阵对于理解模型的细粒度性能很重要,然后根据用例的敏感性,可以确定此模型是否良好。例如,在医学诊断用例中,您希望模型的假阴性率非常低,因为您不希望系统在测试该人的任何疾病的踪迹时如果事实为“是”,则说“否”。您仍然可以设法使误报率偏高,因为此人可以通过相关测试并在以后的阶段得到确认。

准确率 Accuracy

准确使人们对模型的运行方式有了整体认识。但是,如果使用不正确,它很容易高估这些数字。例如-如果类标签的分布偏斜,则仅预测多数类会给您带来高分(高估性能),而对于平衡类而言,准确性更有意义。

您可以使用sklearn轻松获得准确性得分,如下所示-

fromsklearnimportmetricsdefcalculate_accuracy_sklearn(y, y_pred):
returnmetrics.accuracy_score(y, y_pred)

也可以使用Python从混淆矩阵组件中计算出来,如下所示-

defcalculate_accuracy(y, y_pred):
tp=calculate_TP(y, y_pred)
tn=calculate_TN(y, y_pred)
fp=calculate_FP(y, y_pred)
fn=calculate_FN(y, y_pred)
return (tp+tn) / (tp+tn+fp+fn)

精度 Precision

精度度量有助于我们理解识别阳性样本的正确性%。例如,我们的模型假设有80次是正的,我们精确地计算这80次中有多少次模型是正确的。

也可以计算如下-

defcalculate_precision(y, y_pred):
tp=calculate_TP(y, y_pred)
fp=calculate_FP(y, y_pred)
returntp/ (tp+fp)

召回率 Recall

召回指标可帮助我们了解模型能够正确识别的所有地面真实正样本中正样本的百分比。例如-假设数据中有100个阳性样本,我们计算出该100个样本中有多少个模型能够正确捕获。

也可以如下所示进行计算-

defcalculate_recall(y, y_pred):
tp=calculate_TP(y, y_pred)
fn=calculate_FN(y, y_pred)
returntp/ (tp+fn)

对于那些将概率作为输出的模型,调整阈值然后填充相关的混淆矩阵和其他属性始终是一个好习惯。可以绘制不同阈值的精确召回曲线,并根据用例的敏感性选择阈值。

defprecision_recall_curve(y, y_pred):
y_pred_class,precision,recall= [],[],[]
thresholds= [0.1, 0.2, 0.3, 0.6, 0.65]
forthreshinthresholds:
foriiny_pred:     #y_predholdsprobvalueforclass1ifi>=thresh: y_pred_class.append(1)
else: y_pred_class.append(0)
precision.append(calculate_precision(y, y_pred_class))
recall.append(calculate_recall(y, y_pred_class))
returnrecall, precisionplt.plot(recall, precision)

640.png

F1分数

F1结合了Precision和Recall得分,得到一个单一的数字,可以帮助直接比较不同的模型。可以将其视为P和R的谐波均值。谐波均值是因为与其他方式不同,它对非常大的值不敏感。当处理目标倾斜的数据集时,我们通常考虑使用F1而不是准确性。

您可以如下所示进行计算-

defcalculate_F1(y, y_pred):
p=calculate_precision(y, y_pred)
r=calculate_recall(y, y_pred)
return2*p*r/ (p+r)

AUC-ROC

AUC-ROC是用于二分类问题的非常常见的评估指标之一。这是一条曲线,绘制在y轴的TPR(正确率)和x轴的FPR(错误率)之间,其中TPR和FPR定义为-

640.png

如果您注意到,TPR和Recall具有相同的表示形式,就像您正确分类了多少正确样本一样。另一方面,FPR是被错误分类的负面示例的比例。ROC图总结了每个阈值的分类器性能。因此,对于每个阈值,我们都有TPR和FPR的新混淆矩阵值,这些值最终成为ROC 2-D空间中的点。ROC曲线下的AUC(曲线下的面积)值越接近1,模型越好。这意味着一般而言,对于具有较高AUC的每个阈值,我们的模型都比其他模型具有更好的性能。

您可以如下所示进行计算-

fromsklearn.metricsimportroc_auc_scoredefroc_auc(y, y_pred):
returnroc_auc_score(y, y_pred)

640.png

Precision @ k

Precision @ k是用于多标签分类设置的流行指标之一。在此之下,我们计算给定示例的前k个预测,然后计算出这k个预测中有多少个实际上是真实标签。我们将Precision @ k计算为-

Precision@k = (# of correct predictions from k) / (# of items in k)

actual_label= [1, 1, 0, 0, 1]
predicted_label= [1, 1, 1, 0, 0]
Letk=3Precision@k=2/3   (It's same as TP/(TP+FP))

log损失

当您遇到二分类问题时,log损失是相当不错的。当您有一个模型输出概率时,该模型将使用该模型,该模型会根据预测与实际标签的偏差来考虑预测的不确定性。

您可以如下所示进行计算-

defcalculate_log_loss(y, y_pred_probs):
log_loss=-1.0*(t*log(p) + (1-t)*(t*log(1-p))
returnlog_loss

在不平衡数据集的情况下,您还可以添加类权重来惩罚少数类相对于多数类的错误。在代码中,w1和w2分别对应正类和负类的权重。

defcalculate_log_loss_weighted(y, y_pred):
log_loss=-1.0*(w1*t*log(p) +w2*(1-t)*(t*log(1-p))
returnlog_loss

附注:您可以很容易地将其扩展到称为交叉熵的多类设置。

Brier分数

当任务本质上是二元分类时,通常使用Brier分数。它只是实际值和预测值之间的平方差。对于N组样本,我们将其取平均值。

您可以如下所示进行计算-

defbrier_score(y, y_pred):
s=0fori, jinzip(y, y_pred):
s+= (j-i)**2returns* (1/len(y))

在本篇文章中,我们看到了一些流行的评估指标,每个数据科学家在根据手头问题的性质评估机器学习分类模型时都必须牢记这些评估指标。

目录
相关文章
|
1月前
|
数据采集 缓存 Java
Python vs Java:爬虫任务中的效率比较
Python vs Java:爬虫任务中的效率比较
|
1天前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
7 3
|
3天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
13 3
|
8天前
|
运维 监控 Linux
自动化运维:如何利用Python脚本优化日常任务##
【10月更文挑战第29天】在现代IT运维中,自动化已成为提升效率、减少人为错误的关键技术。本文将介绍如何通过Python脚本来简化和自动化日常的运维任务,从而让运维人员能够专注于更高层次的工作。从备份管理到系统监控,再到日志分析,我们将一步步展示如何编写实用的Python脚本来处理这些任务。 ##
|
28天前
|
运维 监控 网络安全
自动化运维的魔法:如何用Python简化日常任务
【10月更文挑战第9天】在数字时代的浪潮中,运维人员面临着日益增长的挑战。本文将揭示如何通过Python脚本实现自动化运维,从而提高效率、减少错误,并让运维工作变得更具创造性。我们将探索一些实用的代码示例,这些示例将展示如何自动化处理文件、监控系统性能以及管理服务器配置等常见运维任务。准备好让你的运维工作升级换代了吗?让我们开始吧!
|
27天前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
49 1
|
28天前
|
数据采集 开发框架 数据处理
探索Python的灵活性:简化日常编程任务
【10月更文挑战第7天】 【10月更文挑战第9天】 在本文中,我们将深入探讨Python编程语言的强大功能和灵活性。通过具体的代码示例,我们会展示如何利用Python简化日常编程任务,提高效率。无论是数据处理、自动化脚本还是Web开发,Python都能提供简洁而强大的解决方案。我们还将讨论一些最佳实践,帮助你编写更清晰、更高效的代码。
18 1
|
1月前
|
机器学习/深度学习
如何用贝叶斯方法来解决机器学习中的分类问题?
【10月更文挑战第5天】如何用贝叶斯方法来解决机器学习中的分类问题?
|
25天前
|
机器学习/深度学习 算法 数据可视化
机器学习的核心功能:分类、回归、聚类与降维
机器学习领域的基本功能类型通常按照学习模式、预测目标和算法适用性来分类。这些类型包括监督学习、无监督学习、半监督学习和强化学习。
24 0
|
1月前
|
机器学习/深度学习 传感器 算法
机器学习入门(一):机器学习分类 | 监督学习 强化学习概念
机器学习入门(一):机器学习分类 | 监督学习 强化学习概念
下一篇
无影云桌面