今年是数据科学领域创新迭出的年份,人工智能与机器学习频频登上头条。尽管 2023 年的进展有目共睹,但同样重要的是认识到:许多机器学习的突破,之所以成为可能,是因为模型经历了正确的评估流程。数据从业者的任务,是确保采用准确的评估与流程来衡量机器学习模型的表现。这不是锦上添花,而是必不可少。
如果您正在学习数据科学之道,本文将带您通过混淆矩阵这一相对简单却功能强大的工具,掌握模型评估的关键步骤。
那么,让我们开始深入了解混淆矩阵。
什么是混淆矩阵?
混淆矩阵是用于评估模型性能的工具,通常以表格形式可视化呈现。它能为数据从业者提供更深入的洞察,了解模型的表现、错误与薄弱环节,从而进一步通过微调来分析与改进模型。
混淆矩阵的结构
我们先用“识别一封邮件是否为垃圾邮件”的例子,来学习混淆矩阵的基本结构。
真正类(TP) - 模型预测为正类且正确。例如,将垃圾邮件识别为垃圾邮件。
真负类(TN) - 模型预测为负类且正确。例如,将正常邮件识别为非垃圾邮件。
假正类(FP) - 模型将负类错误预测为正类。例如,将正常邮件识别为垃圾邮件。
假负类(FN) - 模型将正类错误预测为负类。例如,将垃圾邮件识别为正常邮件。
要真正理解混淆矩阵,请看下面这张可视化图:
混淆矩阵的基本结构
混淆矩阵相关术语
要深入理解混淆矩阵,必须掌握用于衡量模型表现的重要指标。
我们来定义这些关键指标:
准确率(Accuracy)
准确率衡量正确分类的总数占全部样本的比例。
召回率/灵敏度(Recall/Sensitivity)
召回率/灵敏度衡量真正类数量占实际正类总数的比例。
精确率(Precision)
精确率衡量真正类数量占被预测为正类总数的比例。
特异度(Specificity)
特异度衡量真负类数量占实际负类总数的比例。
F1 分数
F1 分数是精确率与召回率的调和平均,给出单一综合指标。
混淆矩阵的作用
要更好地理解混淆矩阵,您需要知道它的目的及其广泛应用的原因。
在衡量模型表现或一般事物时,人们往往关注准确率。然而,过度依赖准确率可能导致错误决策。为理解这一点,我们将讨论将准确率作为单一指标使用的局限性。
将准确率作为单一指标的局限
如上所述,准确率衡量正确分类总数占样本总数的比例。但单独使用这一指标有如下局限:
类别不平衡 :没有任何数据是完美的,使用准确率应结合其预测能力来评估。例如,当数据集中某一类远多于另一类时,模型可能只要预测多数类就能获得很高的准确率。
错误类型 :在具体情境下理解模型的表现,有助于微调并提升效果。例如,通过混淆矩阵区分 FP 与 FN 等错误类型,能帮助您探索模型的局限。
针对这些局限,混淆矩阵结合多种指标,能够为如何改进模型性能提供更细致的洞察。
混淆矩阵的优势
如混淆矩阵的基本结构所示,预测被分解为四类:真正类、真负类、假正类与假负类。
这一细分带来了有价值的洞见与改进方案:
解决类别不平衡 :如前所述,单独使用准确率在处理不平衡数据时存在局限。引入精确率与召回率等指标,能够提供更均衡、更准确的刻画。例如,在金融等行业,假正与假负可能带来严重后果。
区分错误类型 :了解机器学习模型产生的不同错误类型,有助于识别其局限与改进空间。
权衡关系 :在混淆矩阵中使用不同指标存在权衡关系,并会相互影响。例如,提升精确率通常会降低召回率。理解这些受影响的指标值,将指导您改进模型表现。
计算混淆矩阵
现在我们已经了解了混淆矩阵的基础、术语与用途,接下来手动计算一个混淆矩阵,并通过实践例子来说明。
手动计算混淆矩阵
以下是手动计算混淆矩阵的分步指南。
定义结果
第一步是明确任务的两种可能结果:正类或负类。
收集预测
确定可能结果后,下一步是收集模型的所有预测,包括各类别被预测的次数及其出现情况。
分类结果
汇总所有预测后,将结果归入四类:
真正类(TP)
真负类(TN)
假正类(FP)
假负类(FN)
创建矩阵
完成分类后,将其以矩阵表格呈现,便于使用多种指标进一步分析。
混淆矩阵实践示例
让我们通过一个实际示例来演示这一过程。
继续沿用“识别邮件是否为垃圾邮件”的例子,构造一份假想数据集,其中垃圾邮件为正类,非垃圾邮件为负类。我们有如下数据:
在 200 封邮件中,实际有 80 封是垃圾邮件,模型正确识别出其中60 封为垃圾邮件(TP)。
在 200 封邮件中,实际有 120 封不是垃圾邮件,模型正确识别出其中100 封为非垃圾邮件(TN)。
在 200 封邮件中,模型将20 封非垃圾邮件错误识别为垃圾邮件(FP)。
在 200 封邮件中,模型漏检20 封垃圾邮件并将其识别为非垃圾邮件(FN)。
至此我们已定义结果并收集了数据;下一步是将结果归入四类:
真正类:60
真负类:100
假正类:20
假负类:20
接下来将其整理为混淆矩阵:
实际 / 预测
垃圾邮件(正类)
非垃圾邮件(负类)
垃圾邮件(正类)
60(TP)
20(FN)
非垃圾邮件(负类)
20(FP)
100(TN)
那么,这个混淆矩阵告诉了我们什么?
真正类 与真负类 代表预测准确。
假正类 代表模型将负类错误预测为正类。
假负类 代表模型未能识别并预测正类。
基于该混淆矩阵,我们可以计算多种指标:准确率、召回率/灵敏度、精确率、特异度以及 F1 分数。
混淆矩阵的指标输出
精确率 vs. 召回率
您可能会好奇,为什么 F1 分数的公式要同时包含精确率与召回率。当处理类别不平衡数据,或需要在精确率与召回率 之间取得平衡时,F1 分数尤为关键。
精确率衡量正类预测的准确性。它回答的是:“当模型预测为 TRUE 时,有多大概率是对的?”尤其在假正成本很高的情境中,精确率很重要。
召回率(或灵敏度)衡量模型正确识别的实际正类比例。它回答的是:“当实际类别为 TRUE 时,分类器有多大概率预测正确?”
当漏检正类(FN)的代价显著高于将负类误判为正类时,召回率就尤为重要。
精确率的使用场景 :假正可能带来严重后果。例如,金融领域的分类模型将交易误判为欺诈。在这类场景中,精确率至关重要。
召回率的使用场景 :识别所有正类案例可能至关重要。例如,医疗领域的分类模型若未能正确诊断将造成严重影响。在必须尽可能识别全部正类的情形下,召回率很重要。
在 Python 中使用 Scikit-learn 构建混淆矩阵
为更直观地理解,我们将使用 Python 的 Scikit-learn 与随机森林分类器 来创建一个混淆矩阵。
第一步是导入所需的库并构建合成数据集。
from sklearn. datasets import make_classification
from sklearn. model_selection import train_test_split
from sklearn. ensemble import RandomForestClassifier
from sklearn. metrics import confusion_matrix
import matplotlib. pyplot as plt
import seaborn as sns
X, y = make_classification( n_samples= 1000 , n_features= 20 ,
n_classes= 2 , random_state= 42 )
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size= 0.3 , random_state= 42 ) 技术支持
下一步,使用一个简单的随机森林分类器来训练模型。
model = RandomForestClassifier( random_state= 42 )
model. fit( X_train, y_train) 技术支持
与实践示例相同,我们需要对结果进行分类并生成混淆矩阵。先在测试集上进行预测,然后生成混淆矩阵:
y_pred = model. predict( X_test)
cm = confusion_matrix( y_test, y_pred) 技术支持
接下来,生成混淆矩阵的可视化:
plt. figure( figsize= ( 8 , 8 ) )
sns. heatmap( cm, annot= True , fmt= 'd' , cmap= 'Greens' )
plt. title( 'Confusion Matrix' )
plt. ylabel( 'True label' )
plt. xlabel( 'Predicted label' )
plt. show( ) 技术支持
输出如下:
随机森林的混淆矩阵输出
搞定 🎉 您已成功使用 Scikit-learn 创建了第一个混淆矩阵!
结语
本文探讨了混淆矩阵的定义、围绕该评估工具的重要术语,以及不同指标的局限与意义。能够手动计算混淆矩阵,是您数据科学知识体系中的重要一环;同时,使用 Scikit-learn 等库将其落地执行同样必不可少。
如果您希望进一步学习混淆矩阵,可在 R 中练习:Understanding Confusion Matrix in R 。也可以通过我们的Model Validation in Python 课程更深入学习,在其中掌握模型验证基础、验证技术,并开始创建经过验证且高性能的模型。
今年是数据科学领域创新迭出的年份,人工智能与机器学习频频登上头条。尽管 2023 年的进展有目共睹,但同样重要的是认识到:许多机器学习的突破,之所以成为可能,是因为模型经历了正确的评估流程。数据从业者的任务,是确保采用准确的评估与流程来衡量机器学习模型的表现。这不是锦上添花,而是必不可少。
如果您正在学习数据科学之道,本文将带您通过混淆矩阵这一相对简单却功能强大的工具,掌握模型评估的关键步骤。
那么,让我们开始深入了解混淆矩阵。
什么是混淆矩阵?
混淆矩阵是用于评估模型性能的工具,通常以表格形式可视化呈现。它能为数据从业者提供更深入的洞察,了解模型的表现、错误与薄弱环节,从而进一步通过微调来分析与改进模型。
混淆矩阵的结构
我们先用“识别一封邮件是否为垃圾邮件”的例子,来学习混淆矩阵的基本结构。
要真正理解混淆矩阵,请看下面这张可视化图:
混淆矩阵的基本结构
混淆矩阵相关术语
要深入理解混淆矩阵,必须掌握用于衡量模型表现的重要指标。
我们来定义这些关键指标:
准确率(Accuracy)
准确率衡量正确分类的总数占全部样本的比例。
召回率/灵敏度(Recall/Sensitivity)
召回率/灵敏度衡量真正类数量占实际正类总数的比例。
精确率(Precision)
精确率衡量真正类数量占被预测为正类总数的比例。
特异度(Specificity)
特异度衡量真负类数量占实际负类总数的比例。
F1 分数
F1 分数是精确率与召回率的调和平均,给出单一综合指标。
混淆矩阵的作用
要更好地理解混淆矩阵,您需要知道它的目的及其广泛应用的原因。
在衡量模型表现或一般事物时,人们往往关注准确率。然而,过度依赖准确率可能导致错误决策。为理解这一点,我们将讨论将准确率作为单一指标使用的局限性。
将准确率作为单一指标的局限
如上所述,准确率衡量正确分类总数占样本总数的比例。但单独使用这一指标有如下局限:
针对这些局限,混淆矩阵结合多种指标,能够为如何改进模型性能提供更细致的洞察。
混淆矩阵的优势
如混淆矩阵的基本结构所示,预测被分解为四类:真正类、真负类、假正类与假负类。
这一细分带来了有价值的洞见与改进方案:
计算混淆矩阵
现在我们已经了解了混淆矩阵的基础、术语与用途,接下来手动计算一个混淆矩阵,并通过实践例子来说明。
手动计算混淆矩阵
以下是手动计算混淆矩阵的分步指南。
定义结果
第一步是明确任务的两种可能结果:正类或负类。
收集预测
确定可能结果后,下一步是收集模型的所有预测,包括各类别被预测的次数及其出现情况。
分类结果
汇总所有预测后,将结果归入四类:
创建矩阵
完成分类后,将其以矩阵表格呈现,便于使用多种指标进一步分析。
混淆矩阵实践示例
让我们通过一个实际示例来演示这一过程。
继续沿用“识别邮件是否为垃圾邮件”的例子,构造一份假想数据集,其中垃圾邮件为正类,非垃圾邮件为负类。我们有如下数据:
至此我们已定义结果并收集了数据;下一步是将结果归入四类:
接下来将其整理为混淆矩阵:
实际 / 预测
垃圾邮件(正类)
非垃圾邮件(负类)
垃圾邮件(正类)
60(TP)
20(FN)
非垃圾邮件(负类)
20(FP)
100(TN)
那么,这个混淆矩阵告诉了我们什么?
基于该混淆矩阵,我们可以计算多种指标:准确率、召回率/灵敏度、精确率、特异度以及 F1 分数。
混淆矩阵的指标输出
精确率 vs. 召回率
您可能会好奇,为什么 F1 分数的公式要同时包含精确率与召回率。当处理类别不平衡数据,或需要在精确率与召回率之间取得平衡时,F1 分数尤为关键。
精确率衡量正类预测的准确性。它回答的是:“当模型预测为 TRUE 时,有多大概率是对的?”尤其在假正成本很高的情境中,精确率很重要。
召回率(或灵敏度)衡量模型正确识别的实际正类比例。它回答的是:“当实际类别为 TRUE 时,分类器有多大概率预测正确?”
当漏检正类(FN)的代价显著高于将负类误判为正类时,召回率就尤为重要。
在 Python 中使用 Scikit-learn 构建混淆矩阵
为更直观地理解,我们将使用 Python 的 Scikit-learn 与随机森林分类器来创建一个混淆矩阵。
第一步是导入所需的库并构建合成数据集。
下一步,使用一个简单的随机森林分类器来训练模型。
与实践示例相同,我们需要对结果进行分类并生成混淆矩阵。先在测试集上进行预测,然后生成混淆矩阵:
接下来,生成混淆矩阵的可视化:
输出如下:
随机森林的混淆矩阵输出
搞定 🎉 您已成功使用 Scikit-learn 创建了第一个混淆矩阵!
结语
本文探讨了混淆矩阵的定义、围绕该评估工具的重要术语,以及不同指标的局限与意义。能够手动计算混淆矩阵,是您数据科学知识体系中的重要一环;同时,使用 Scikit-learn 等库将其落地执行同样必不可少。
如果您希望进一步学习混淆矩阵,可在 R 中练习:Understanding Confusion Matrix in R。也可以通过我们的Model Validation in Python课程更深入学习,在其中掌握模型验证基础、验证技术,并开始创建经过验证且高性能的模型。