混淆矩阵和数据不平衡 (1/3)

news2024/12/24 20:48:07

一、说明

        如果数据集数据不平恒,如何评估分类器的效果?如果分类器不好,如何改进分类器?本篇将讲述不平衡数据下,混淆矩阵的应用。

二、混淆矩阵的基本概念

2.1 连续数据分布

        LET将数据视为连续的,分类的或有序的(分类的,但有顺序的)。混淆矩阵是评估分类模型性能的一种方法。对于它如何工作的上下文,我们将首先刷新有关连续数据的知识。通过这个,我们可以看到混淆矩阵只是我们已经知道的直方图的扩展。

        当我们想要了解连续数据时,第一步通常是查看它是如何分布的。请考虑以下直方图。

我们可以看到,标签平均约为零,大多数数据点介于 -1 和 1 之间。它看起来是对称的;有一个比平均值小和大的数字的近似偶数。如果我们愿意,我们可以使用表格而不是直方图,但它可能很笨拙。

2.2 分类数据分布

        在某些方面,分类数据与连续数据没有太大区别。我们仍然可以生成直方图来评估每个标签的值出现的频率。例如,二进制标签(真/假)的出现频率可能如下所示:

        这告诉我们,有 750 个样本以 false 作为标签,250 个样本以 true 作为标签。

        三个类别的标签类似:

        这告诉我们有 200 个样本是,400 个是动物,100 个是

由于分类标签更简单,我们通常可以将它们显示为简单的表。前面的两个图如下所示:

Label       False       True
Count        750         250 

Label       Person       Animal       Tree
Count        200          400          100 

2.3 查看预测

        我们可以查看模型做出的预测,就像查看数据中的真实标签一样。例如,我们可能会看到,在测试集中,我们的模型预测了 700 次错误和 300 次 true

Prediction       Count
False             700
True              300 

        这提供了有关我们的模型所做的预测的直接信息,但它并没有告诉我们哪些是正确的。虽然我们可以使用成本函数来了解给出正确响应的频率,但成本函数不会告诉我们犯了哪种错误。
例如,模型可能正确猜测所有真值,但在应该猜到时也会猜测

2.4 混淆矩阵

        了解模型性能的关键是将模型预测表与真实数据标签表组合在一起:

我们尚未填写的方块称为混淆矩阵

混淆矩阵中的每个单元格都告诉我们有关模型性能的一件事。这些是阴性 (TN)、假阴性 (FN)、
假阳性 (FP) 和真阳性 (TP)。

让我们一一解释这些,将这些首字母缩略词替换为实际值。蓝绿色方块表示模型做出了正确的预测,橙色方块表示模型做出了错误的预测。

2.5 真阴性 (TN)

        左上角的值将列出模型预测为假的次数,实际标签也是假的。换句话说,这列出了模型正确预测错误的次数。假设,对于我们的示例,这种情况发生了 500 次:

2.6 漏报 (FN)

        右上角的值告诉我们模型预测为假的次数,但实际标签为真。我们现在知道这是200。如何?因为模型预测错误了 700 次,其中 500 次它正确地预测了。因此,它必须预测200次,而它不应该预测错误。

2.7 False Positives (FP)

        左下角的值包含误报。这告诉我们模型预测为真的次数,但实际标签是假的。我们现在知道这是250,因为有750次正确答案是错误的。其中 500 次显示在左上角单元格 (TN) 中:

2.8 真阳性 (TP)

        最后,我们有真正的积极因素。这是模型正确预测 true 的次数。我们知道这是50,原因有两个。首先,模型预测了 300 次为真,但 250 次不正确(左下角单元格)。其次,有250次是真答案,但模型预测是假的200次。

2.9  最终混淆矩阵

        我们通常会稍微简化我们的混淆矩阵,如下所示:

        我们在此处对单元格进行了着色,以突出显示模型何时做出正确的预测。由此,我们不仅知道模型做出某些类型预测的频率,还知道这些预测正确或不正确的频率。

        当有更多标签时,也可以构造混淆矩阵。例如,对于我们的/动物/的例子,我们可能会得到一个矩阵,如下所示:

        当有三个类别时,像真阳性这样的指标不再适用,但我们仍然可以准确地看到模型犯某些类型错误的频率。例如,我们可以看到,当实际正确结果是动物时,模型预测了该 200 次。

        在本练习中,我们将更详细地使用不平衡数据集准确性混淆矩阵的概念来衡量分类模型的性能。

三、数据可视化

        我们的新数据集代表了在雪中发现的不同类别的物体。让我们通过加载并查看我们的数据来开始这个练习:

import pandas
!wget https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to-machine-learning/main/graphing.py
!wget https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to-machine-learning/main/Data/snow_objects.csv

#Import the data from the .csv file
dataset = pandas.read_csv('snow_objects.csv', delimiter="\t")

#Let's have a look at the data
dataset
           size     roughness     color     motion     label
0       50.959361    1.318226     green    0.054290    tree
1       60.008521    0.554291     brown    0.000000    tree
2       20.530772    1.097752     white    1.380464    tree
3       28.092138    0.966482     grey     0.650528    tree
4       48.344211    0.799093     grey     0.000000    tree
 ...       ...          ...        ...        ...       ...
2195    1.918175     1.182234     white    0.000000    animal
2196    1.000694     1.332152     black    4.041097    animal
2197    2.331485     0.734561     brown    0.961486    animal
2198    1.786560     0.707935     black    0.000000    animal
2199    1.518813     1.447957     brown    0.000000    animal

2200 rows × 5 columns

四、数据探索

我们可以看到数据集既有连续数据(大小、粗糙度、运动),也有分类数据(颜色标签)。让我们进行一些快速的数据探索,看看我们有哪些不同的标签分类及其各自的计数:

import graphing # custom graphing code. See our GitHub repo for details

# Plot a histogram with counts for each label
graphing.multiple_histogram(dataset, label_x="label", label_group="label", title="Label distribution")

        前面的直方图使我们很容易理解数据集中的标签及其分布。

        需要注意的一个重要信息是,这是一个数据集不平衡:类别的比例不同(例如,我们的岩石和树木是动物的 4 倍)。这是相关的,因为不平衡的集合在“野外”非常常见。将来,我们将学习如何解决这个问题以构建更好的模型。

        我们可以对颜色特征进行相同的分析:

# Plot a histogram with counts for each label
graphing.multiple_histogram(dataset, label_x="color", label_group="color", title="Color distribution")

我们可以注意到:

  • 我们有 8 种不同的颜色类别。
  • 颜色特征也严重不平衡。
  • 绘图算法不够智能,无法为各自的名称分配正确的颜色。

让我们看看我们可以找到有关其他功能的内容:

graphing.box_and_whisker(dataset, label_y="size", title='Boxplot of "size" feature')

        在前面的箱图中,我们注意到大多数样本相对较小,大小范围从 0 到 70,但我们有一些更大的异常值。

        让我们绘制粗糙度特征:

graphing.box_and_whisker(dataset, label_y="roughness", title='Boxplot of "roughness" feature')

这里没有太多变化:粗糙度值的范围从 0 到略高于 2,大多数样本的值接近平均值。

让我们绘制运动特征:

graphing.box_and_whisker(dataset, label_y="motion", title='Boxplot of "motion" feature')

        大多数物体似乎要么是静止的,要么移动得非常缓慢。移动速度较快的对象数量较少,有几个异常值超过 10。

        从前面的数据中,人们可以假设更小、更快的物体可能是徒步旅行者和动物,而更大、更静态的元素是树木岩石

五、构建分类模型

让我们使用随机森林构建和训练一个分类模型,以根据数据集中的特征预测对象的类别:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# Split the dataset in an 70/30 train/test ratio. 
train, test = train_test_split(dataset, test_size=0.3, random_state=2)
print(train.shape)
print(test.shape)
(1540, 5)
(660, 5)

现在,我们可以使用刚刚创建的训练数据集来训练模型:

# Create the model
model = RandomForestClassifier(n_estimators=1, random_state=1, verbose=False)

# Define which features are to be used (leave color out for now)
features = ["size", "roughness", "motion"]

# Train the model
model.fit(train[features], train.label)

print("Model trained!")
Model trained! 

六、评估模型

        现在,我们可以使用新训练的模型来使用测试集进行预测。通过将预测值与实际标签(也称为 true 值)进行比较,我们可以使用不同的指标来衡量模型的性能。

例如,准确度是执行的所有预测中正确预测的标签数:

Accuracy = Correct Predictions / Total Predictions

让我们看看如何在代码中完成此操作:

# Import a function that measures a models accuracy
from sklearn.metrics import accuracy_score

# Calculate the model's accuracy on the TEST set
actual = test.label
predictions = model.predict(test[features])

# Return accuracy as a fraction
acc = accuracy_score(actual, predictions)

# Return accuracy as a number of correct predictions
acc_norm = accuracy_score(actual, predictions, normalize=False)

print(f"The random forest model's accuracy on the test set is {acc:.4f}.")
print(f"It correctly predicted {acc_norm} labels in {len(test.label)} predictions.")
The random forest model's accuracy on the test set is 0.8924.
It correctly predicted 589 labels in 660 predictions.

我们的模型似乎做得很好!

然而,这种直觉可能会产生误导:

  • 准确性不考虑模型做出的错误预测。
  • 它也不擅长在类不平衡的数据集中描绘清晰的画面,比如我们的数据集,其中可能的类的数量分布不均匀(回想一下,我们有 800 棵,800 块岩石,但只有 200 只动物)。

七、构建混淆矩阵

        混淆矩阵是一个表格,我们将实际标签与模型预测的内容进行比较。它让我们更详细地了解模型是如何工作的,以及它在哪里做对或缺失。

这是我们可以在代码中执行此操作的方法之一:

# sklearn has a very convenient utility to build confusion matrices
from sklearn.metrics import confusion_matrix

# Build and print our confusion matrix, using the actual values and predictions 
# from the test set, calculated in previous cells
cm = confusion_matrix(actual, predictions, normalize=None)

print("Confusion matrix for the test set:")
print(cm)
Confusion matrix for the test set:
[[ 28  38   0   0]
 [ 30 103   1   0]
 [  0   1 217   1]
 [  0   0   0 241]] 

虽然前面的矩阵在计算中很有用,但它不是很有帮助或直观。让我们添加一个带有标签和颜色的绘图,以将该数据转化为实际见解:

# We use plotly to create plots and charts
import plotly.figure_factory as ff

# Create the list of unique labels in the test set, to use in our plot
# I.e., ['animal', 'hiker', 'rock', 'tree']
x = y = sorted(list(test["label"].unique()))

# Plot the matrix above as a heatmap with annotations (values) in its cells
fig = ff.create_annotated_heatmap(cm, x, y)

# Set titles and ordering
fig.update_layout(  title_text="<b>Confusion matrix</b>", 
                    yaxis = dict(categoryorder = "category descending"))

fig.add_annotation(dict(font=dict(color="black",size=14),
                        x=0.5,
                        y=-0.15,
                        showarrow=False,
                        text="Predicted label",
                        xref="paper",
                        yref="paper"))

fig.add_annotation(dict(font=dict(color="black",size=14),
                        x=-0.15,
                        y=0.5,
                        showarrow=False,
                        text="Actual label",
                        textangle=-90,
                        xref="paper",
                        yref="paper"))

# We need margins so the titles fit
fig.update_layout(margin=dict(t=80, r=20, l=100, b=50))
fig['data'][0]['showscale'] = True
fig.show()

        请注意,该图在 y 轴上具有“实际标签”,在 x 轴上具有“预测”标签,如confusion_matrix函数调用所定义。

        我们可以看到该模型通常是准确的,但这只是因为我们的集合中有如此多的岩石树木,并且因为它在这些类上表现良好。

        当涉及到徒步旅行者和动物时,模型会感到困惑(它显示了大量的FP和FN),但由于这些类在数据集中的代表性较少,因此准确性分数仍然很高。

八、总结

在本练习中,我们讨论了以下概念:

  • 不平衡数据集,其中要素或类可能由不成比例的样本表示。
  • 准确性作为评估模型性能及其缺点的指标。
  • 如何生成、绘制和解释混淆矩阵,以更好地了解分类模型的性能。
  • V笔记本

祝你学习愉快!
下一>> 混淆矩阵和数据不平衡 (2/3)

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

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

相关文章

阿里云服务器价格更新,轻量应用服务器108元,云服务器182.04元起

阿里云服务器价格更新了&#xff0c;不同时期阿里云服务器的租用价格不同&#xff0c;目前阿里云在官网活动中新增加了一款经济型e实例规格的云服务器&#xff0c;现在购买阿里云轻量应用服务器最低为108元&#xff0c;购买云服务器最低为182.04元&#xff0c;换算到每天只要0.…

零基础学前端(四)3. 重点讲解 CSS:实战补全百度网站首页

1. 该篇适用于从零基础学习前端的小白 2. 初学者不懂代码得含义也要坚持模仿逐行敲代码&#xff0c;以身体感悟带动头脑去理解新知识 3. 初学者切忌&#xff0c;不要眼花缭乱&#xff0c;不要四处找其它文档&#xff0c;要坚定一个教授者的方式&#xff0c;将其学通透&#xff…

前端学习路线,带你入门程序猿

相信很多想学前端的小伙伴是非常迷茫的 前端知识体系很多&#xff0c;不知从何学起 而且框架也有不少&#xff0c;不知道该如何下手 很多学习前端的小伙伴都没有一个很好的学习路线图&#xff0c;简直可以说是看见啥学啥 而且自己在学习的时候非常吃力&#xff0c;感觉总是学不…

SQLite 学习笔记1 - 简介、下载、安装

SQLite 简介 SQLite是一款非常轻量级的关系数据库系统&#xff0c;支持多数SQL92标准。SQLite 是世界上使用最广泛的数据库引擎。SQLite 内置于所有手机和大多数计算机中&#xff0c;并捆绑在人们每天使用的无数其他应用程序中。 SQLite 是一个由C语音开发的嵌入式库&#xff…

DataGrip汉化

一、关闭DataGrip&#xff0c;下载新的jar包 链接&#xff1a;https://pan.baidu.com/s/1gTHpyMuIME_n8qC9KYbOzA 提取码&#xff1a;ute3 二、把下载的jar包放在lib文件里&#xff0c;把原来自带的jar替换掉 三、打开datagrip

nginx代理故障总结

一、故障现象 今天公司的某个系统文件下载功能失败&#xff0c;报错network error&#xff0c;其他功能正常。 二、故障定位 首先我们检查了公司的网络情况&#xff0c;包括网络路由、防火墙策略、终端安全产品等&#xff0c;均未发现异常。 尝试访问http://X.X.X.X:7002端口&…

uniapp——实现二维码生成+保存二维码图片——基础积累

最近在做二维码推广功能&#xff0c;自从2020年下半年到今天&#xff0c;大概有三年没有用过uniapp了&#xff0c;而且我之前用uniapp开发的程序还比较少&#xff0c;因此很多功能都浪费了很多时间去查资料&#xff0c;现在把功能记录一下。 这里写目录标题 效果图1.根据接口返…

元数据管理平台Datahub0.10.5版本安装部署与导入各种元数据手册

官网文档连接 DataHub Quickstart Guide | DataHub (datahubproject.io) 本文所选择的Python的版本为3.8.16&#xff0c;Docker版本为20.10.0&#xff0c;Datahub为0.10.5版本 python必须为3.7以上的版本。0.10.5不支持以下的版本 如果要使用web上的 添加数据源 直接调用的…

开源分布式存储系统(HDFS、Ceph)架构分析

文章目录 中间控制节点架构-HDFSNameNode节点分析DataNode节点分析SecondNameNode节点分析Client分析 完全无中心架构-CephCeph Monitor分析Ceph OSD分析Ceph Manager分析Ceph Clients分析 小结HDFS优点缺点 Ceph优点缺点 参考 中间控制节点架构-HDFS 以HDFS&#xff08; Hado…

五、点击切换、滚动切换、键盘切换

简介 通过事件改变当前展示的信息组件&#xff0c;交互的事件有点击上下切换、鼠标轮动上下切换、键盘上下键切换。欢迎访问个人的简历网站预览效果 本章涉及修改与新增的文件&#xff1a;App.vue、public 一、鼠标点击上下箭头切换 <template><div class"a…

Learn Prompt-Prompt 高级技巧:Agent的颠覆性影响

OpenAI联合创始人Andrej Karpathy在一个开发者活动上发表讲话&#xff0c;谈及了他和OpenAI对AI Agents的看法。他将过去开发 AI Agents 的困难与现在依靠新技术工具而带来的新机会进行了对比。Andrej Karpathy 认为普通人、创业者和极客在构建 AI Agents 方面相比 OpenAI 这样…

还有一天活动就开始我定好闹钟准时上线

&#xff08;整理衣服&#xff09;&#xff08;大步流星走上台&#xff09;&#xff08;拿起麦克风&#xff09;&#xff08;激情发言&#xff09;请大家&#xff08;热泪盈眶&#xff09;&#xff08;哽咽&#xff09;关注&#xff08;流泪&#xff09;&#xff08;擦眼泪&…

蓝桥杯打卡Day11

文章目录 最长上升子序列最长上升子序列II 一、最长上升子序列IO链接 本题思路:本题是一关于dp问题中的一个类型是最长上升子序列问题&#xff0c;首先我们将状态表示出来&#xff1a;f[i]表示以a[i]结尾的最大的上升序列。状态计算&#xff08;集合划分&#xff09;&#xf…

如何防盗版软件

有多少公司&#xff0c;至今都无法摆脱被盗版软件支配的恐惧&#xff1f; 其实大多数时候&#xff0c;企业都是被动当了大冤种&#xff0c;因为他们也并不会主动要求员工使用破解软件。实在是架不住有些不懂版权的、心存侥幸的员工私下里使用。只要公司联网&#xff0c;就一定…

猫头虎博主第5️⃣期赠书活动:《Java官方编程手册(第12版·Java 17)套装上下册》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

JK405R-SOP16录音芯片ic方案的常见问题集锦包含录音长度功耗以及外挂spiflash

目录 问题1 1、KT405R是什么&#xff1f; 具备哪些功能&#xff1f; 有什么特色&#xff1f; 问题2 2、KT405R录音的机制是怎样的&#xff1f; 问题3 3、KT405R的供电电压详细说明&#xff1f;以及功耗控制手段 问题4 4、KT405R支持多段录音&#xff1f;每段时长如何划…

招商信诺人寿基于 Apache Doris 统一 OLAP 技术栈实践

本文导读&#xff1a; 当前&#xff0c;大数据、人工智能、云计算等技术应用正在推动保险科技发展&#xff0c;加速保险行业数字化进程。在这一背景下&#xff0c;招商信诺不断探索如何将多元数据融合扩充&#xff0c;以赋能代理人掌握更加详实的用户线索&#xff0c;并将智能…

mysql redis的区别

.mysql和redis的数据库类型 mysql是关系型数据库&#xff0c;主要用于存放持久化数据&#xff0c;将数据存储在硬盘中&#xff0c;读取速度较慢。 redis是NOSQL&#xff0c;即非关系型数据库&#xff0c;也是缓存数据库&#xff0c;即将数据存储在缓存中&#xff0c;缓存的读取…

Stm32_点灯

利用HAL库基本语法实现C8T6点灯操作 引脚配置 PB3、4 、5 //设置为output PB6、7 设置Input且为上拉初始化代码&#xff1a; 由于3、4、5引脚默认输出为0灯泡默认点亮所以要将他们初始化为1 void Inint(){//初始化灯泡函数熄灭HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PI…

无涯教程-JavaScript - RADIANS函数

描述 RADIANS函数将度数转换为弧度。度和弧度之间的转换是通过以下关系式计算的 180度π弧度 其中π是数学常数,PI3.14159265358979 ... 语法 RADIANS (angle)争论 Argument描述Required/OptionalAngleAn angle in degrees that you want to convert.Required 适用性 E…