机器学习之类别不平衡问题 (1) —— 各种评估指标

简介: 在二分类问题中,通常假设正负类别相对均衡,然而实际应用中类别不平衡的问题,如100, 1000, 10000倍的数据偏斜是非常常见的,比如疾病检测中未患病的人数远超患病的人数,产品质量检测中合格产品数量远超不合格产品等。

在二分类问题中,通常假设正负类别相对均衡,然而实际应用中类别不平衡的问题,如100, 1000, 10000倍的数据偏斜是非常常见的,比如疾病检测中未患病的人数远超患病的人数,产品质量检测中合格产品数量远超不合格产品等。在检测信用卡欺诈问题中,同样正例的数目稀少,而且正例的数量会随着时间和地点的改变而不断变化,分类器要想在不断变化的正负样本中达到好的检测效果是非常困难的。

由于类别不平衡问题的特性使然,一般常使用于评估分类器性能的准确率错误率可能就不再适用了。因为在类别不平衡问题中我们主要关心数目少的那一类能否被正确分类,而如果分类器将所有样例都划分为数目多的那一类,就能轻松达到很高的准确率,但实际上该分类器并没有任何效果。


所以在这种时候学习的前提往往是采用不同的评估指标。学习机器学习的过程中总不免碰到各种评估指标,刚开始很容易被五花八门的术语绕晕了,所以类别不平衡问题的第一篇先对这些指标进行梳理。毕竟评估指标不明确的话,后面模型的效果好坏也就无从谈起。

在二分类问题中,一般将数目少的类别视为正例,数目多的类别视为负例,下面先用matplotlib画张混淆矩阵图来直观地感受一下:

plt.figure(figsize=(10,6))
plt.text(0.5,2.25,'True Positive (TP)',size=20,horizontalalignment="center",verticalalignment="center")
plt.text(1.5,2.4,'False Positive (FP)',size=20,horizontalalignment="center",verticalalignment="center")
plt.text(0.5,0.9,'False Negative (FN)',size=20,horizontalalignment="center",verticalalignment="center")
plt.text(1.5,0.75,'True Negative (TN)',size=20,horizontalalignment="center",verticalalignment="center")
plt.text(1,3.4,'$True\ Class$',size=25,horizontalalignment="center")
plt.text(-0.5,1.5,'$Predicted$\n$Class$',size=23,verticalalignment="center")
plt.text(0.5,3.1,'$P$',size=20,horizontalalignment="center")
plt.text(1.5,3.1,'$N$',size=20,horizontalalignment="center")
plt.text(-0.1,2.25,'$Y$',size=20,va="center")
plt.text(-0.1,0.75,'$N$',size=20,va="center")
plt.text(2.4,2.25,r'Precision = $\frac{TP}{Y}$ = $\frac{TP}{TP+FP}$ ',size=18,ha="center",va="center")
plt.text(0.5,-0.3,'Recall, Sensitivity, TPR = ',size=16,ha="center",va="center")
plt.text(0.5,-0.6,'$\\frac{TP}{P}$ = $\\frac{TP}{TP+FN}$',size=18,ha="center",va="center")
plt.text(1.5,-0.3,'FPR = $\\frac{FP}{N}$ = $\\frac{FP}{FP+TN}$',size=16,ha="center",va="center")
plt.text(1.5,-0.7,'TNR, Specificity = $\\frac{TN}{N}$ = $\\frac{TN}{FP+TN}$',size=16,ha="center",va="center")
plt.text(1.5,2.1,'Type I Error',size=20,horizontalalignment="center",verticalalignment="center")
plt.text(0.5,0.6,'Type II Error',size=20,horizontalalignment="center",verticalalignment="center")
plt.xticks([])
plt.yticks([])
plt.plot([1,1],[0,3],'k--')
plt.plot([0,3],[1.5,1.5],'k:')
plt.axis([0,2,0,3])

plt.fill_between([0,1],[1.5,1.5],[3,3],color='#98FB98')
plt.fill_between([0,1],[0,0],[1.5,1.5],color='#EEA9B8')
plt.fill_between([1,2],[0,0],[1.5,1.5],color='#9AFF9A')
plt.fill_between([1,2],[1.5,1.5],[3,3],color='#EEB4B4')

img_39ddb57d523671e9075a71294cf2e158.png


True Positive (真正例,TP):实际为正例,预测为正例。

False Negative (假负例,FN):实际为正例,预测为负例。

True Negative (真负例,TN):实际为负例,预测为负例。

False Positive (假正例,FP):实际为负例,预测为正例。

Precision (查准率) = \(\frac{TP}{TP+FP}\) ,Precision衡量的是所有被预测为正例的样本中有多少是真正例。但Precision并没有表现有多少正例是被错判为了负例(即FN),举个极端的例子,分类器只将一个样本判为正例,其他所有都判为负例,这种情况下Precision为100%,但其实遗漏了很多正例,所以Precision常和下面的Recall (TPR) 相结合。

True Positive Rate (TPR,真正例率) = \(\frac {TP}{TP+FN}\) ,又称__Recall__(查全率),Sensitivity(灵敏性)。Recall (TPR)衡量的是所有的正例中有多少是被正确分类了,也可以看作是为了避免假负例(FN)的发生,因为TPR高意味着FN低。Recall的问题和Precision正相反,没有表现出有多少负例被错判为正例(即FP),若将所有样本全划为正例,则Recall为100%,但这样也没多大用。

False Negative Rate (FNR,假负例率) = \(\frac{FN}{TP+FN}\) = \(1 - TPR\),由混淆矩阵可以看出该指标的着眼点在于正例,意为有多少正例被错判成了负例。

True Negative Rate (TNR,真负例率) = \(\frac{TN}{TN+FP}\) ,又称Specificity(特异性)。Specificity衡量的是所有的负例中有多少是被正确分类了,由于类别不平衡问题中通常关注正例能否正确被识别,Specificity高则FP低,意味着很少将负例错判为正例,即该分类器对正例的判别具有“特异性”,在预测为正例的样本中很少有负例混入。

False Positive Rate (FPR,假正例率) = \(\frac{FP}{TN+FP}\) = \(1 - TNR\), 由混淆矩阵可以看出该指标的着眼点在于负例,意为有多少负例被错判成了正例。在ROC曲线中分别以TPR和FPR作为纵、横轴作图,显示出一种正例与负例之间的“博弈”,在下篇文章中详解。

F1 score = \[\frac{2}{\frac{1}{recall}+\frac{1}{precision}} = \frac{2 × precision × recall}{precision + recall}\],是一个综合指标,为Precision和Recall的调和平均 (harmonic mean),数值上一般接近于二者中的较小值,因此如果F1 score比较高的话,意味着Precision和Recall都较高。


FP和FN还有个还有个与之相关的概念,那就是统计假设检验中的第一类错误 (Type I error)第二类错误 (Type II error) 。由于我们比较关心正例,所以将负例视为零假设,正例视为备选假设,则第一类错误为错误地拒绝零假设 (负例),选择备选假设,则为FP;第二类错误为错误地接受零假设,则为FN。



相关文章
|
21天前
|
机器学习/深度学习 Python
机器学习中评估模型性能的重要工具——混淆矩阵和ROC曲线。混淆矩阵通过真正例、假正例等指标展示模型预测情况
本文介绍了机器学习中评估模型性能的重要工具——混淆矩阵和ROC曲线。混淆矩阵通过真正例、假正例等指标展示模型预测情况,而ROC曲线则通过假正率和真正率评估二分类模型性能。文章还提供了Python中的具体实现示例,展示了如何计算和使用这两种工具来评估模型。
43 8
|
21天前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
28 6
|
23天前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段。本文介绍了 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,强调了样本量、随机性和时间因素的重要性,并展示了 Python 在 A/B 测试中的具体应用实例。
26 1
|
2月前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
115 1
|
2月前
|
机器学习/深度学习 算法 API
机器学习入门(六):分类模型评估方法
机器学习入门(六):分类模型评估方法
|
3月前
|
机器学习/深度学习 算法 数据挖掘
Python数据分析革命:Scikit-learn库,让机器学习模型训练与评估变得简单高效!
在数据驱动时代,Python 以强大的生态系统成为数据科学的首选语言,而 Scikit-learn 则因简洁的 API 和广泛的支持脱颖而出。本文将指导你使用 Scikit-learn 进行机器学习模型的训练与评估。首先通过 `pip install scikit-learn` 安装库,然后利用内置数据集进行数据准备,选择合适的模型(如逻辑回归),并通过交叉验证评估其性能。最终,使用模型对新数据进行预测,简化整个流程。无论你是新手还是专家,Scikit-learn 都能助你一臂之力。
153 8
|
3月前
|
机器学习/深度学习 数据采集 算法
利用未标记数据的半监督学习在模型训练中的效果评估
本文将介绍三种适用于不同类型数据和任务的半监督学习方法。我们还将在一个实际数据集上评估这些方法的性能,并与仅使用标记数据的基准进行比较。
287 8
|
2月前
|
机器学习/深度学习 算法 数据建模
【机器学习】类别不平衡数据的处理
【机器学习】类别不平衡数据的处理
|
3月前
|
机器学习/深度学习 算法 数据挖掘
从菜鸟到大师:Scikit-learn库实战教程,模型训练、评估、选择一网打尽!
【9月更文挑战第13天】在数据科学与机器学习领域,Scikit-learn是不可或缺的工具。本文通过问答形式,指导初学者从零开始使用Scikit-learn进行模型训练、评估与选择。首先介绍了如何安装库、预处理数据并训练模型;接着展示了如何利用多种评估指标确保模型性能;最后通过GridSearchCV演示了系统化的参数调优方法。通过这些实战技巧,帮助读者逐步成长为熟练的数据科学家。
128 3
|
4月前
|
机器学习/深度学习 数据挖掘
机器学习模型的选择与评估:技术深度解析
【8月更文挑战第21天】机器学习模型的选择与评估是一个复杂而重要的过程。通过深入理解问题、选择合适的评估指标和交叉验证方法,我们可以更准确地评估模型的性能,并选择出最适合当前问题的模型。然而,机器学习领域的发展日新月异,新的模型和评估方法不断涌现。因此,我们需要保持对新技术的学习和关注,不断优化和改进我们的模型选择与评估策略。