Mathworks-Matlab-实用数据科学笔记-全-

Mathworks Matlab 实用数据科学笔记(全)

1:课程概述 🎼

在本课程中,我们将学习《实用数据科学与MATLAB》专项课程的总体介绍。我们将了解数据科学的重要性、MATLAB工具的优势以及整个专项课程的结构与学习目标。

你可能听说过数据科学正在彻底改变医疗保健、汽车、消费电子等众多领域。实际上,几乎每个行业都受到了影响。如果你正在考虑学习这个专项课程,你很可能已经看到了数据科学在你自身领域的潜力。

无论你身处哪个领域,拥有强大的数据科学技能都能让你脱颖而出,并帮助你将原始数据转化为有意义的结果。这就是MathWorks创建《实用数据科学与MATLAB》专项课程的原因。完成这个专项课程将赋予你快速取得实际成果所需的技能和信心。

在整个专项课程中,你将使用MATLAB。

MATLAB是数百万工程与科学领域专业人士的首选工具,它提供了完成数据科学任务所需的能力。MATLAB使用熟悉的数学符号,并附带图形化应用程序,帮助你快速迭代常见的分析任务。这些应用程序减少了进行有意义的数据科学工作所需的时间,并帮助你立即开始处理数据。

你了解你的领域,也了解你的数据。借助正确的工具和一些实践,你可以构建能够基于数据中的模式进行准确预测的模型。这些技术对于任何希望保持竞争力的公司都至关重要。

完成这个专项课程后,你将能够使用你的数据构建预测模型。这是当今雇主最需要的高需求职业技能之一。

在这个包含四门课程的专项课程中,第一门课程将教你如何探索数据。你将使用MATLAB中可用的图形化工具来生成可视化图表并执行常见的统计分析。

这门课程旨在成为所有技能水平学习者的入门点。图形化工具使你能够快速尝试不同的技术和可视化方法。

你所执行操作对应的代码会显示在屏幕上,帮助你掌握MATLAB语言并开始自己编写完整的脚本。

在第二门课程中,你将在基础上继续学习,增加为后续探索和建模而对数据进行预处理的关键技能。

完成这门课程将使你能够整合来自不同来源的数据,去除不需要的干扰(如异常值和缺失数据点),并开始构建用于分类和回归的基本模型。这门课程还探讨了你可能会遇到的特定类型数据。

例如音频信号、图像和文本。

即使你并非每天处理这类数据,当需要时,你仍然有机会应用相关的概念和应用程序。

当你进入第三门课程时,你将准备好开始使用MATLAB应用程序构建机器学习模型,尝试多种不同的建模技术和参数。当你找到喜欢的组合时,你将构建一个模型并用它进行预测。与任何新技能一样,数据科学成功的关键在于实践。

最终的毕业项目涵盖了完整的数据科学工作流程。

你将应用专项课程中所有课程学到的技能来构建一个预测模型。

你将与同伴合作评估模型,更重要的是,从他们独特的视角中学习。准备好开始构建实用的数据科学技能,以便在你的组织和行业中发挥作用了吗?很好,让我们开始吧。


本节课中,我们一起学习了《实用数据科学与MATLAB》专项课程的总体介绍。我们了解了数据科学在现代各行业中的变革作用,认识了MATLAB作为强大工具在简化分析流程、加速模型构建方面的优势,并预览了整个专项课程从数据探索、预处理、机器学习建模到最终毕业项目的完整学习路径。

2:使用MATLAB进行探索性数据分析概述 🎯

在本课程中,我们将学习如何使用MATLAB进行探索性数据分析。探索性数据分析是数据科学流程中的关键第一步,它涉及理解数据、发现模式、识别异常并提出初步假设。通过本课程,你将掌握导入、可视化数据以及执行常见统计分析所需的实用技能,为后续的机器学习建模等高级主题打下坚实基础。


课程结构与学习路径 📊

上一段我们概述了课程目标,接下来我们详细了解一下整个课程的结构。本课程包含五个循序渐进的模块,每个模块都旨在帮助你构建特定的数据分析能力。

以下是五个核心模块的详细介绍:

  1. 模块一:数据科学入门
    你将学习如何着手探索数据,以及如何提出能够通过数据分析来解答的问题。你将使用名为“实时脚本”的交互式文档来探索一个已准备好的分析案例,并从真实数据集中获得洞察。

  1. 模块二:数据表示与导入
    在本模块中,你将学习数据是如何表示的,以及如何将数据导入MATLAB。将大量数据转换为可用于分析的形式是许多应用中的常见挑战。你将使用相关工具快速将文件导入MATLAB,同时生成可用于未来重复此过程的代码。

  1. 模块三:数据筛选与可视化
    进入第三模块后,你将把数据筛选成你想要分析的子集。接着,你将通过可视化来理解如何回答问题,并获得新的理解。本课程的主要数据集包含带有经纬度坐标的地理数据。除了绘制标准图表,你还将生成数据叠加在熟悉地理边界上的地图,以及其他能提供实用洞察的可视化图表。

  2. 模块四:分组统计分析
    此时,你已经完成了数据的筛选和可视化。现在,在第四模块中,你已准备好进行统计分析。你将超越电子表格的思维,按不同组别分析数据,快速迭代地对不同数据组执行操作。这些任务是探索和试验数据的基础。

  1. 模块五:整合分析与成果展示
    最后,在第五模块中,你将整合所有技能,讲述数据背后的故事。当今的数据科学世界远不止代码和数字运算。实时脚本可以帮助你让数据分析变得生动。在整个课程中,它们将支持你的分析,并使你能够将相同的思维过程应用到其他类似的数据集上,以深化你的分析。


学习建议与展望 🚀

为了从课程中获得最大收益,请思考如何将学到的概念应用到你自己的数据中。你在课程中遇到的数据集旨在代表你实际工作中可能看到的数据类型。

听起来很有趣吗?加入数百万使用MATLAB来探索、筛选、可视化和分析数据的行业专业人士行列吧。

现在就开始学习,如果你有任何问题,请使用讨论区。


总结

在本节课中,我们一起学习了《实用数据科学与MATLAB》课程中探索性数据分析部分的概述。我们明确了课程目标,即掌握数据导入、可视化与基础统计分析的核心技能。随后,我们详细了解了课程的五个模块:从数据科学入门和问题定义,到数据导入、筛选可视化、分组统计,最后整合分析并讲述数据故事。整个学习路径旨在为你打下坚实的数据探索基础,以便后续进行更高级的预测建模。请记住,将所学应用于你自己的数据集是巩固技能的最佳方式。

P03:课程讲师介绍 👨‍🏫

在本节课中,我们将认识本系列课程的讲师团队。了解他们的背景、专业领域以及与MATLAB和数据科学相关的经历,有助于我们更好地跟随课程学习。

大家好。我是Adam Filian。我是Heather Gorr。我是Brendan Hamm。我是Erin Byrne。

我是MathWorks的在线课程开发人员。我是MathWorks的产品经理。我是MATLAB和数据科学领域的技术产品营销经理。我是MathWorks的在线内容开发人员。

我从小就是一个科学爱好者。在四年级时,我最想成为一名迪士尼幻想工程师。

我早在2004年就开始使用MATLAB,当时我在弗吉尼亚理工大学攻读航空航天工程学士学位。我在研究和教学中使用MATLAB已超过10年。

我第一次接触MATLAB是在攻读物理学博士学位期间,购买了学生版本。我主要使用MATLAB来可视化数据并拟合简单模型。

我第一次使用它是在哈维穆德学院攻读工程学学生时期。

我博士学位期间的主要项目是关于生物流体模式识别的机器学习。那非常有趣。我的研究生研究集中在一种称为“晕轨道”的领域。我在这个领域的研究涉及寻找从低地球轨道到这些晕轨道的最优转移轨迹,自然地,我用代码实现了它。

在MATLAB中,最近一个很酷的项目是部署用于实时预测的机器学习模型。我在MATLAB中创建了信号处理和机器学习算法,然后在云上的流式架构中使用这些预测。

我的职业生涯始于航空航天工程师。我为卫星和星际任务(包括火星探测漫游者)进行系统级设计和分析。

在MathWorks,我的职责是帮助其他人学习如何将机器学习、深度学习和数据科学应用到他们的工作中。我与我们的开发组织合作,确定接下来要构建哪些新的数据科学工具。基本上,我的全部工作就是帮助像您这样的人开始并熟练地将MATLAB用于您的应用。

我曾经是一名职业摇摆舞者。我是一名音乐家。我弹吉他、打鼓,喜欢唱歌和创作音乐。我认为我对音乐的热情确实对我的职业生涯有所帮助,因为我很有创造力,并且能从不同的角度思考问题,这在数据科学中很重要。

我开始涉足一些天文摄影。我最喜欢的一张是从邻居家车道上拍摄的猎户座星云照片,因为我的院子视野不够好。

实际上,我在业余时间也会使用MATLAB,我就是喜欢摆弄数据。我每天早上在查看邮件或做任何其他事情之前,都会先打开MATLAB,在开始一天的工作前,我会有一段小小的MATLAB时间。

我非常高兴能在这个系列课程中与您分享我的一些经验和来之不易的教训。我希望您能看到MATLAB如何帮助像您这样的领域专家在数据科学领域表现出色。

本节课中,我们一起认识了本系列课程的四位讲师。他们来自MathWorks的不同岗位,拥有工程、物理、机器学习等多元背景,并且都长期使用MATLAB解决实际问题。他们的共同目标是帮助学习者掌握使用MATLAB进行数据科学的技能。了解讲师团队的经历,有助于我们建立对课程内容的信任和期待。

P04:为什么我们需要数据科学

在本节课中,我们将探讨数据科学在现代世界中的重要性,了解其基本定义、核心组成部分以及MATLAB如何帮助不同领域的专家实践数据科学。

我们生活的世界时刻处于连接状态。在社交媒体上互动、请求出租车服务、进行购物、追踪日常身体活动,你所做的一切都会产生数据。一旦开始汇总来自每个人的数据,其数量将变得难以估量。可以说,我们生活在一个数据驱动的世界。

那么,面对如此海量的数据,我们该如何处理?这正是数据科学发挥作用的地方。

数据科学在今天比以往任何时候都更具相关性,因为我们拥有海量的可用数据。但首先,什么是数据科学?正如你所猜测的,数据科学是对数据的研究。它结合了来自计算机科学、统计分析的技术以及你自身的领域知识。

如果你拥有数据并对其感到好奇,数据科学就是一条探索和分析数据、从中获取答案,然后传达你发现的路径。

换句话说,数据科学是关于从你的数据中讲述一个引人入胜的故事的能力。

如今在数据科学领域,问题不在于缺乏可用数据,而恰恰相反——数据以洪流之势从多种来源、以多种形式涌来,包括文本、数字、图像、音频、视频、信号。因此,你的第一步是理解你正在处理的数据类型。你可以通过访问和探索数据来完成这一步。

近期的技术专注于理解我们可用的、不断增长的海量数据,这种现象你可能听说过,即“大数据”。在探索数据之后,下一步可能是对其进行建模。

为了提取数据中蕴含的洞见,很多时候你需要一个精确的预测模型。近年来,像机器学习和深度学习这样的技术成为头条新闻,并且现在对每个人来说都触手可及。

例如,机器学习教会计算机做对人类来说自然而然的事情——从经验中学习。它非常适用于涉及大量数据和众多变量的复杂问题,但这些问题没有描述系统的现成公式或方程。

随着可用于学习的样本数量增加,算法会自适应地提高其性能。

但是,你需要成为一名软件工程师或经验丰富的统计学家才能做这些事情吗?幸运的是,并不需要。许多数据科学技术被其自身领域的科学家和工程师所使用,他们不一定接受过编程训练。而这正是MATLAB可以帮助你的地方。

MATLAB专为科学探索、分析和可视化的工作流程而优化。MATLAB包含现成的、跨多个领域的分析和建模功能。

因此,你可以专注于你的工作,而不是成为软件工程师或统计学专家。MATLAB使领域专家能够进行数据科学工作。使用MATLAB,你可以逐步展示你的工作,并辅以强大的可视化效果,帮助你向他人传达一个故事。

通过使你能够从数据中获得有价值的见解并进行预测,数据科学使得解决最棘手的问题成为可能。

例如,工程师使用机器学习和传感器数据来检测汽车何时开始转向过度。或者,工程师通过处理植入大脑的电极阵列发出的信号,创建了一个系统,为四肢瘫痪者恢复手臂和手部控制能力。

数据科学也使你能够解决日常问题。许多数据科学技术每天都被用于在医疗诊断、股票交易、能源负荷预测、语音识别等领域做出关键决策。

甚至媒体网站也依赖机器学习,从数百万选项中筛选,为你提供歌曲或电影推荐。

数据科学已经成为你生活的重要组成部分。因此,加入我们的旅程,开始使用MATLAB进行数据科学的道路。

在本节课中,我们一起学习了数据科学在当今数据驱动世界中的核心作用。我们了解到数据科学结合了多种技术,旨在从海量、多样的数据中提取洞见并讲述故事。我们还探讨了机器学习等关键技术,并认识到MATLAB如何通过其专业工具和易用性,赋能各领域专家实践数据科学,解决从日常到前沿的各种复杂问题。

5:MATLAB作为数据科学工具 🛠️

在本节课中,我们将要学习MATLAB如何作为一个强大的工具来支持数据科学的完整工作流程。我们将探讨MATLAB在数据导入、清理、探索、建模以及部署解决方案方面的核心功能。

概述

数据科学结合了计算机科学、统计分析以及特定领域的专业知识。对于希望开始实践数据科学的人来说,选择合适的工具至关重要。MATLAB正是为此而设计,它旨在简化数据科学的各项任务,让用户能够专注于从数据中获取洞见。

MATLAB的起源与设计理念

在20世纪60年代和70年代,使用计算机解决问题需要编写大量代码。Cleve Moler教授希望他的学生能够专注于解决数学和工程问题,因此他创建了MATLAB。其语法设计旨在反映常见的科学与工程符号表示法。

今天,MATLAB仍然是同一种语言,但增加了许多新的、强大且易于使用的功能。MATLAB环境允许您创建实时脚本,这是一种将代码、输出和格式化文本结合在一个可执行文档中的形式。

% 示例:一个简单的MATLAB实时脚本单元格
data = readtable('mydata.csv');
summary(data)

MATLAB为何是优秀的数据科学工具

MATLAB为数据科学的每个关键步骤都提供了函数和交互式应用程序。这些步骤包括:导入、清理和探索数据;构建和评估模型;以及进行预测。

上一节我们介绍了MATLAB的设计初衷,本节中我们来看看它在数据科学工作流中的具体应用。

数据获取与处理

首先,进行数据科学需要数据。MATLAB可以从多种来源读取不同类型的数据,并帮助您将所有数据整合在一起。

有时,您会遇到数据量过大,以至于计算机无法一次性处理的情况。MATLAB可以为您处理这个问题。您可以在处理整个数据集之前,先用少量数据测试您的想法。

数据清理

不幸的是,收集并提供给数据科学家的数据通常并不完美。您可能需要处理噪声、缺失数据和异常值。清理数据通常是数据处理中最耗时的部分。

以下是MATLAB中一些有助于快速清理杂乱数据的功能:

  • 高级函数:这些函数允许您通过几个快速步骤预处理数据,而无需编写多行代码。这有助于您更快地完成工作。
  • 交互式工具:MATLAB提供了交互式应用程序,让您能够直观地识别和处理数据问题。

数据探索与建模

清理数据后,数据科学的核心就是探索数据并构建模型来回答有趣的问题。例如,一场风暴会造成多少损失?

有许多标准的建模技术可以用来回答这个问题。MATLAB提供了实现这些方法的简单函数,同时也提供了交互式应用程序,让您可以探索不同的模型和选项。

例如,机器学习技术使用计算方法直接从数据中学习,而不依赖于预定的方程作为模型。

您可以从对可能影响预测结果的特征做出最佳猜测开始。MATLAB使您能够使用多种技术执行特征提取步骤。然后,借助MATLAB中的交互式应用程序,您可以快速识别出能提供最准确估计的模型。

通过这些应用程序,您无需成为统计学和其他技术的专家,也能利用强大的机器学习模型。

例如,您可以使用回归学习器应用程序尝试多种模型来预测风暴损失的成本。该应用程序允许您交互式地探索各种回归模型。一旦确定了最佳模型,您可以生成MATLAB代码,以便将来自动化该过程。

这些工具引导您完成模型探索阶段,让您对模型的准确性和稳健性更有信心。

工作流的交互性与可重复性

能够交互式探索并保存重复和自动化工作所需的步骤非常重要,因为真正的数据科学,就像任何科学一样,是混乱且具有实验性的。在回答一个问题的过程中,您必须尝试不同的事物,并且常常会提出其他需要探索的问题。

模型部署与应用

数据科学的目标是回答具有实际影响的问题。如果您构建了一个预测风暴造成损失的模型,您会希望使用它,并让他人也能够使用。您可能希望将此模型放入Web应用程序中。

使用MATLAB,您无需将所有内容用另一种语言重新编码,就可以将已完成的工作集成到其他系统中。您可以将MATLAB代码与使用其他语言的应用程序集成,也可以将您的解决方案部署到嵌入式硬件。

这里您可以看到一个MATLAB Web应用程序的示例。您可以将其部署到您组织的MATLAB Web应用程序服务器上,让组织内的每个人都能通过Web浏览器访问该应用程序。

无论您决定以何种方式提供您的解决方案,都只需开发和维护一个算法;在哪里运行它则由您决定。

总结

本节课中我们一起学习了MATLAB作为数据科学工具的强大之处。在本专项课程中,您将学习数据科学工作流程中的不同步骤。在数据科学中取得成功需要合适的工具。您将很快熟练掌握MATLAB,这是一个为数据科学家设计的、能够解决跨多个学科广泛问题的强大工具。

6:开始使用MATLAB环境 🚀

在本节课中,我们将学习MATLAB环境的基础知识,包括其界面布局、核心面板的功能以及如何创建和运行脚本。掌握这些是进行数据探索和分析的第一步。

认识MATLAB界面

上一节我们了解了MATLAB在数据科学中的应用,本节中我们来看看MATLAB的工作环境,以便快速开始探索数据。

在MATLAB中,首先映入眼帘的是工具条。它将MATLAB的功能组织在一系列选项卡中。

每个选项卡被划分为多个区域,这些区域包含相关的控件,如按钮、下拉菜单和其他元素。工具条便于访问您常用的MATLAB功能,并有助于了解您可能不熟悉的新功能。

首次打开MATLAB时,您会看到三个选项卡,分别标记为“主页”、“绘图”和“APP”。

这些是全局选项卡,无论您在MATLAB中执行什么操作,它们始终存在。

除了全局选项卡,工具条还有上下文选项卡。这些选项卡仅在您执行特定任务时才会出现。

  • 主页选项卡用于通用操作,如创建新文件和导入数据。
  • 绘图选项卡包含一个绘图库,用于显示选定的变量。
  • APP选项卡提供对MATLAB内置交互式应用程序的访问。在本专项课程后面,您将使用这些应用程序来测试不同的机器学习模型。

核心工作面板

工具条下方,默认布局包含三个主要面板:当前文件夹浏览器、命令窗口和工作区。

  • 命令窗口是您通过在提示符处键入命令来执行计算的地方。
  • 一些命令会创建新的变量来保存计算结果。您会看到这些变量出现在工作区窗口中。
  • 请注意,如果在命令行的末尾添加分号 ;,结果将不会显示。
% 不显示结果
result = 1 + 1;
% 显示结果
result = 1 + 1

如果您需要查看变量的内容,可以在工作区中双击该变量以打开变量编辑器。

在命令行中,您可以按向上箭头键查看命令历史记录,从而重新调用或重新运行之前执行的命令。然后,您可以选择一个命令进行编辑或再次运行。

创建与使用实时脚本

很快您就会希望重用一系列命令或保存工作以供日后使用,这可以通过使用脚本来实现。脚本是按顺序执行以实现某个结果的一系列命令。

特别是,实时脚本是一种交互式文档,它包含了命令序列、输出以及格式化的文本。

以下是创建和使用实时脚本的步骤:

  1. 创建新脚本:点击主页选项卡中的“新建实时脚本”按钮,这将打开MATLAB实时编辑器窗口。

  2. 编辑脚本:从命令历史记录中复制命令,并使用编辑器进行修改。请注意工具条中出现了新的上下文选项卡。

  3. 组织内容:开始使用实时脚本后,您可以通过将命令组拆分为节,并添加文本、注释、标题、图像、方程式等来组织您的分析。在本课程中,您将了解更多关于实时脚本的知识。

您也可以从他人分享的实时脚本开始。在这种情况下,您需要先在当前文件夹浏览器中导航到该文件。

  • 导航到文件所在位置,然后双击打开它。
  • 实时脚本是扩展名为 .mlx 的文件。

运行脚本与获取帮助

仔细观察当前文件夹工具栏。它显示了当前文件夹路径,这是MATLAB在运行脚本时用来查找文件的参考位置。

  • 设置路径:确保将当前文件夹更改为存储实时脚本的项目目录。
  • 运行脚本:只需点击“运行”按钮即可运行整个实时脚本。如果您的代码被划分为多个节,您也可以逐节运行脚本,并在工作时检查结果。
  • 切换输出显示:您可以在右侧或内联切换输出的显示方式。

如果您想更改布局以获得更多空间来显示实时脚本及其输出,可以最小化默认显示的面板。您可以使用主页选项卡中的布局菜单快速恢复默认布局。

如果您对实时脚本中的特定函数有疑问,可以通过右键单击它并选择“帮助”来查找更多信息。所有MATLAB函数都有一个文档页面,其中包含调用语法、描述和示例。

除了文档,您还可以使用自动补全功能来查看正确的语法或选择要使用的变量。这有助于避免拼写错误和其他错误。

总结与展望

这是一个很好的开始。现在您已经学习了MATLAB环境的基础知识,是时候开始探索一些实际数据了。

本节课中我们一起学习了MATLAB界面的主要组成部分,包括工具条、核心工作面板(命令窗口、工作区、当前文件夹)的功能,以及如何创建、编辑和运行实时脚本。我们还了解了如何获取函数帮助和使用自动补全功能。掌握这些基础操作是后续进行数据导入、处理和可视化的前提。

7:如何提出好的数据问题 🎯

在本节课中,我们将学习数据科学中一个至关重要的初始步骤:如何针对数据提出有效的问题。提出正确的问题是连接原始数据与可执行见解的桥梁,它能帮助我们明确分析方向,并最终利用数据做出更明智的决策。

上一节我们探讨了数据科学的重要性,本节中我们来看看如何为数据分析设定正确的起点。

提出数据问题的意义

提出好的问题是数据科学中重要的第一步。它能帮助你将复杂的数据转化为可操作的信息。换句话说,提出正确的问题将帮助你利用数据做出更好的决策。

数据问题的类型

你可以通过多种不同的方式来提出问题。以下是几种常见的问题类型,它们代表了数据分析的不同层次和深度。

描述性问题:发生了什么?

最简单直接的方式是提出各种形式的“发生了什么”。例如,可用的确切信息是什么?让我们在一个更具体的例子中看看这一点:探索一台需要维护的机器的数据。此时,你的问题可能是:哪个部件坏了?

这类描述性问题侧重于分析数据,以识别模式、趋势或倾向,通常与探索性数据分析相关。

诊断性问题:为什么会发生?

你可以更进一步,然后问:为什么会发生这种情况?在机器的例子中,你可能会问:为什么这个部件会坏?

提出诊断性问题有助于你识别需要进一步研究的领域,因为这类问题通常不能简单地通过查看数据来回答。

预测性问题:接下来会发生什么?

此时,你可以更进一步,问:接下来会发生什么?这是一个开始预测未来可能发生情况的机会。在这里,机器学习技术可以帮助你构建预测模型,以预测事件或结果。对于损坏的机器,你也可以问:哪些类似部件可能会损坏?

指导性问题:应该采取什么措施?

最后,你可能会问:应该对此采取什么措施?现在你不仅仅是在预测未来会发生什么,还在自动化确定最佳行动方案的过程。例如,对于机器,如果你知道某个部件可能失效,你能否优化你的操作,以确保在恰当时机执行维护?

总结与过渡

组织期望数据科学家帮助指导他们的决策。对现有数据提出正确的问题将帮助你定义数据分析的范围。现在,让我们开始交互式数据探索的旅程。

本节课中,我们一起学习了如何针对数据提出不同层次的问题,从描述“发生了什么”到诊断“为什么发生”,再到预测“未来如何”以及指导“应该怎么做”。掌握提问的艺术是开启任何成功数据分析项目的关键第一步。

P08:交互式数据探索 🧭

在本节课中,我们将学习如何使用MATLAB的交互式环境进行数据探索。你将了解如何利用实时脚本(Live Script)来可视化数据、调整参数并计算统计量,而无需一开始就成为编程专家。


你拥有数据,大量的数据,并且你想利用这些数据来回答问题。你应该使用什么工具进行探索和分析?

电子表格允许用户在不编写代码的情况下创建图表和计算基本统计量。

如果你只有少量文件,且你的问题不需要复杂计算,这非常有效。

但是,如果你有大量文件,或者你的文件格式差异很大,情况会如何?

又或者数据中存在许多可能的预测变量,你需要确定哪些是最重要的。

使用电子表格分析数据难以扩展。

学习一门编程语言提供了使用复杂模型分析大量数据的灵活性。

那么,在开始数据科学之前,你是否需要成为一名经验丰富的程序员?

这就是MATLAB的用武之地。MATLAB既是一个用于与数据交互的环境,也是一门强大的编程语言。

然而,与其他语言不同,MATLAB允许你在自动生成代码的同时探索数据和构建模型。

让我们看一个例子。在本视频中,你将学习如何与实时脚本交互以探索数据。

你还将使用交互式控件来修改可视化效果并计算统计量。

在本课程中,你将使用实时脚本来分析数据。到最后,你将能够自己创建它们。

实时脚本不仅仅是代码,它还包含富文本和图形,以帮助记录和交流你的结果。

这个脚本使用前面描述的气象事件数据来查看龙卷风的位置和损失成本。

点击目录中的项目可以跳转到相应部分。

活动部分由包围它的蓝色线条标识。

将代码分成多个部分很有帮助,因为你可以先与一个部分的结果交互,然后再继续。

你可以通过点击实时编辑器选项卡中的“运行节”按钮来运行一个节。

这个部分导入了数据。数据的预览显示在节的旁边,带有滚动条,以便我们可以查看大型表格。

然而,这不是静态预览。点击一个变量可以预览其内容、筛选数据、对表格排序等。

执行这些更改的代码会被捕获并显示给你。这让你可以在实验的同时记录更改并学习语言。

要继续探索,请点击下一个节并运行它。现在看这里,脚本创建了一张所有龙卷风位置的地图。

你已经开始对受龙卷风影响最严重的区域有了初步感觉。

注意这个滑块。滑块使你在探索数据时能够快速更改参数。

这个滑块设置了一个最小阈值,只有造成损失超过此值的龙卷风才会被包含在图中。

图形也是交互式的。点击图形可以调出数据探索按钮。

你可以放大。并拖动地图以更详细地探索不同区域。

所做的更改会被捕获在显示的代码中,以便你将来可以自动化这个过程。

继续浏览脚本,你会发现更多控件,可以按月份可视化龙卷风。

以及计算数据的统计量。现在你知道了如何导航和使用实时脚本,是时候亲自尝试了。

这里展示的实时脚本已为你提供,请按照说明练习探索和可视化数据。


本节课中,我们一起学习了MATLAB交互式数据探索的核心方法。我们了解到,实时脚本结合了代码、文本和可视化,是探索数据、调整参数并记录分析过程的强大工具。通过交互式控件和自动代码生成,即使初学者也能高效地进行数据探索。

9:数据科学工作流程概述 📊

在本节课中,我们将要学习一个典型数据科学项目的完整工作流程。该流程主要包含三个阶段:数据分析、机器学习以及结果处理。本概述将逐一介绍每个阶段的核心任务与目标。

数据分析阶段 🔍

上一节我们介绍了数据科学项目的整体框架,本节中我们来看看第一个阶段——数据分析。此阶段的目标是在尝试从数据中学习之前,先深入了解你的数据。

首先,明确你希望从数据中学到什么,以及打算如何运用这些知识,这对项目启动非常有帮助。你的项目可能还有更具体的交付成果。

接下来,需要确定项目所需数据的类型、数量和来源。你的数据可能已经存在,也可能需要通过实验、调查或模拟来生成。一旦数据可用,就可以使用MATLAB来访问它。针对不同来源的数据,访问方法取决于数据的位置、类型和大小。

以下是MATLAB处理数据的一些方式:

  • MATLAB可以直接加载较小的文件。
  • 它也可以从数据库和流式数据源中提取远程数据。
  • 对于较大的数据集,可以进行采样,或者分块加载和分析。

在获取数据之后,就可以通过探索和可视化来了解数据了。首先,检查是否存在缺失、不完整或重复的数据,这些问题会使分析复杂化并导致误导性的结果。

接着,了解数据的组织方式以及每个变量包含的信息类型。关于变量的信息,包括其值、范围、分布和异常值,可以使用MATLAB的统计和汇总函数来获取。

使用MATLAB中的分组函数可以更细致地研究这些属性。像直方图和散点图这样的可视化工具,是了解变量值分布情况和识别潜在关系的另一种快速有效的方法。

最后,通过计算统计量、研究趋势或相关性,或者创建你计划获取的可视化图表,来完成你特定的数据分析目标。在探索和可视化过程中对数据的了解,将为你的结果提供背景信息并增强你对结果的信心。

机器学习阶段 🤖

在讨论如何处理结果之前,让我们看看许多数据科学项目中经常在数据分析之后进行的另一个组成部分:使用数据来建模变量或观测值之间的关系。

机器学习是使用算法来获取这些关系模型的过程。具体来说,机器学习算法采用一个通用模型,并使用数据来求解一个或多个模型参数,从而使其适应并描述特定的关系。你将在后续课程中了解更多关于机器学习的知识,但目前这个过程可以概括为以下步骤。

以下是机器学习的关键步骤:

  1. 模型和变量选择:选择合适的算法和输入特征。
  2. 数据预处理:准备数据以供模型使用,例如处理缺失值、标准化等。
  3. 模型训练:使用数据来调整模型参数。
  4. 模型验证:评估训练好的模型在新数据上的性能。

这个过程的结果是一个经过训练和验证的模型,然后你可以将其用于预测和进一步分析。

结果处理阶段 📈

在完成项目的数据分析或机器学习阶段后,就可以开始处理你的结果了。首先,检查你的工作中是否存在错误,并确保你的结果是可复现的。

也就是说,它们不依赖于不合理的假设或存在偏差。一旦你对方法感到满意并对定量结果充满信心,就可以利用它们得出结论,并生成你所寻求的定性理解。

最后,通过可视化、演示和报告来分享你的成果。

你还可以公开你的数据和代码,以便他人使用和扩展你的工作。最近,使用自动化仪表板发布自定义报告和指标,以及将预测模型部署到自动化系统,已成为分享数据科学成果的流行方式。

总结

本节课中我们一起学习了数据科学项目的标准工作流程,它包含三个主要阶段:数据分析(旨在深入了解数据)、机器学习(旨在构建预测模型)以及结果处理(旨在验证、解释和分享成果)。每个阶段都有其特定的任务和目标,共同构成了从原始数据到可操作见解的完整路径。在下一个视频中,你将看到一个数据分析工作流程的实例并进行练习。

10:实践中的工作流程 🚕

在本节课中,我们将通过一个出租车行程数据分析的实际案例,来观察数据科学工作流程的具体实践。你将看到如何从目标设定到结果呈现,完整地执行一个分析项目,并预览MATLAB中用于数据分析和机器学习的一些工具。

上一节我们概述了数据科学的工作流程。本节中,我们来看看这个流程在一个真实项目中的应用。

项目目标与数据概览

该分析项目设定了两个主要目标。第一个目标是更好地理解行程日志数据,特别是总费用与每次行程的距离和时间之间的关系。第二个目标是创建一个比现有计费方案更简单的替代方案,仅使用行程距离和时间来计算车费。这个定价模型还需要满足两个实际约束:生成大致相同的总收入,以及最小化车费变动。

数据科学家同时提供了数据摘要,包括数据来源、文件类型以及对每个日志条目中记录变量的描述。

数据导入与初步处理

首先,使用导入工具预览文件内容,选择感兴趣的变量,并将数据导入到MATLAB表中。随后,生成对应的代码并将其添加到实时脚本中,以便未来自动导入数据。

接下来,数据科学家使用交互式工具和可视化图表来检查表变量,并应用过滤器以移除可能影响分析的缺失数据和异常值。过滤代码被添加到实时脚本中,以便将分析重点集中在常见的距离和费用金额上。

数据探索与关系分析

虽然行程距离已包含在原始数据中,但总费用和行程时间需要从其他变量中生成。在检查后,添加了额外的字段和代码以从这些新变量中移除任何异常值。

随后,使用描述性统计和直方图探索数据集,这提供了变量值范围和分布的信息。最后,数据科学家通过计算相关系数和为每对变量生成散点图,来研究费用、距离和时间之间的关系。结果表明,这些变量之间存在很强的线性关系。

应用机器学习建模

在达成第一个目标后,下一步是使用机器学习来捕捉这种关系。正如脚本中所述,数据科学家使用了回归学习器应用程序来创建模型。以下是创建模型的步骤:

  1. 选择模型变量:由于数据已经过清理,无需额外的预处理步骤,且应用程序默认提供验证功能。
  2. 选择模型类型:根据分析目标选择合适的回归模型类型。
  3. 训练与验证:启动训练过程,应用程序会提供性能指标和可视化图表用于模型评估。

训练完成后,模型可以导出为MATLAB变量,或者生成代码并添加到脚本中,以便自动重新创建模型。

模型验证与目标达成

完成机器学习建模后,分析的最后一个步骤是检查所得模型是否满足第二个项目目标。

首先,将当前计费模型产生的总费用与新模型生成的总费用进行比较,以确保模型按预期运行。由于数据量很大,数据科学家还使用了散点图来确认简化模型捕捉到了当前系统的行为特征。

最后,分析表明该模型满足了给定的约束条件:总收入保持不变,且大多数车费的变化小于50美分或5%。

总结

本节课中,我们一起学习了一个完整的数据科学工作流程实例。通过出租车数据分析项目,我们看到了从设定目标、导入和清理数据、探索性分析、应用机器学习建模,到最终验证结果并满足业务约束的全过程。数据科学家使用实时脚本记录了整个工作流程,从目标到结果,确保了分析的可重复性和透明度。在达成两个主要目标后,数据科学家总结道,还可以做更多工作来验证和完善结果。希望这个实例能激发你使用MATLAB来执行和记录自己数据科学项目的兴趣。

11:数据科学工作流程总结 🎉

在本节课中,我们将回顾模块一的核心内容,总结数据科学的基础知识、MATLAB的作用以及初步的数据探索流程。

恭喜你完成了模块一的学习。在进入测验之前,让我们花一点时间来回顾到目前为止所学到的内容。

模块一内容回顾

上一节我们介绍了数据科学的基本概念,本节中我们将系统梳理整个模块的知识点。

以下是模块一涵盖的核心主题:

  1. 数据科学概述
    你首先学习了数据科学的定义,以及它为何在工业界和科研领域变得日益重要。

  2. MATLAB作为数据科学工具
    接下来,你了解了MATLAB为何是数据科学的强大工具,以及分析师、工程师和科学家们如何将其广泛应用于各种场景。

  1. 交互式数据探索
    在第二课中,你使用了MATLAB中的可用工具进行交互式数据探索。你也更深入地研究了你的数据可以帮助回答哪些类型的问题。

  1. 数据科学工作流程概念
    在第三课中,你获得了关于数据科学工作流程的概念性概述。

  1. 探索性数据分析示例
    随后,你看到了一个在MATLAB中执行探索性数据分析的示例。

后续学习与测验

在接下来的模块中,你将学习更多关于处理数据的方法,以及如何在MATLAB中开展你自己的探索性数据分析。

但现在,是时候通过模块一的测验来检验你的知识了。

以下是关于测验的具体说明:

  • 你将使用一个现有的实时脚本来回答关于天气事件数据的问题。
  • 请仔细遵循设置说明,以便你可以在MATLAB中打开并运行该实时脚本。
  • 实时脚本中的说明将引导你完成分析,并帮助你在测验页面上回答问题。

本节课中我们一起学习了数据科学的基本概念、MATLAB的核心优势以及初步的数据探索工作流程。你已经为进行实际的数据分析和完成模块测验做好了准备。

12:导入数据介绍 🎼

在本模块中,我们将学习数据科学工作流程中的关键一步:如何将数据导入MATLAB。上一模块我们介绍了如何识别数据源,接下来就需要访问这些数据并将其导入到MATLAB环境中进行分析。

数据来源多种多样,并以多种不同的格式存储。理解这些格式是成功导入数据的第一步。

为分析准备数据是数据科学中的一项主要挑战。这通常涉及理解数据的原始结构和含义。

例如,当数据被获取和存储时,如何确保你正确地解读了数字和文本序列的原始意图?

在本模块中,你将学习数据通常如何存储,以及MATLAB在导入数据后如何表示这些数据。你还将学习如何使用导入工具交互式地导入数据。最后,你将了解如何自动化导入过程,以简化和加速未来的分析。

让我们开始吧。


课程概述

在本节课中,我们将要学习数据导入的基础知识。我们将探讨常见的数据存储格式、MATLAB的数据表示方法,以及两种主要的导入方式:交互式导入和自动化脚本导入。


数据来源与格式

上一节我们提到了数据导入是工作流程的下一步。本节中我们来看看数据通常以哪些形式存在。

数据可以来自各种源头,例如传感器、数据库、电子表格或网页。相应地,它们也被存储为不同的文件格式。

以下是几种常见的数据存储格式:

  • 文本文件:如 .txt.csv (逗号分隔值)。
  • 电子表格:如 .xls.xlsx (Microsoft Excel)。
  • 科学数据格式:如 .mat (MATLAB 数据文件), .h5 (HDF5)。
  • 数据库:如通过 ODBC 或 JDBC 连接访问。
  • 其他专有格式:由特定硬件或软件生成。

数据导入的挑战

了解了数据格式的多样性后,我们面临的下一个挑战是数据准备。原始数据往往不能直接用于分析。

核心挑战在于准确解读数据。当数据被记录时,数字和文本的序列有其特定含义。例如,一列数字可能代表温度、压力或时间戳。导入数据时,必须确保MATLAB能按照原始意图来理解这些数据。

这涉及到处理缺失值、不一致的格式、错误的单位以及元数据(描述数据的数据)的识别。


本模块学习目标

面对这些挑战,本模块旨在为你提供解决方案。我们将重点关注以下三个核心部分:

  1. 数据表示:学习数据在MATLAB中的基本表示形式,如数组结构体。例如,表格数据可以导入为一个 table 变量:

    dataTable = readtable(‘mydata.csv’);
    
  2. 交互式导入:使用MATLAB的导入工具,通过图形界面直观地预览、选择和配置导入选项,适用于一次性或探索性任务。

  3. 自动化导入:学习编写脚本或函数来自动执行导入过程,例如使用 readtablexlsread 等函数。这对于需要重复进行的分析至关重要,能提高效率并保证一致性。

    % 自动化读取多个CSV文件的示例框架
    fileList = dir(‘*.csv’);
    for i = 1:length(fileList)
        currentData = readtable(fileList(i).name);
        % 在此处进行后续处理
    end
    

总结

本节课中我们一起学习了数据导入模块的引言部分。我们明确了在数据科学工作流程中,继识别数据源之后,必须将数据正确导入MATLAB。我们认识到数据格式的多样性以及由此带来的解读挑战。最后,我们概述了本模块将涵盖的核心内容:理解MATLAB的数据表示方法,掌握交互式导入工具的使用,以及学会编写代码实现自动化导入,为后续的数据探索和分析打下坚实的基础。

13:数据的存储方式 📁

在本节课中,我们将学习数据在计算机中是如何以数字形式存储的,并练习如何将样本数据集导入MATLAB。

数据无处不在,数据科学家通过分析数据来识别和解答问题,以帮助改善世界。为了进行分析,我们首先需要理解数据的存储方式。

数据的常见格式

数据通常以文本、数字、图像、视频和音频等形式存储,但也可以是任何需要分析的内容。数据以数字形式存储在文件中。

每个文件都有一个唯一的名称,后跟一个扩展名。这个扩展名表明了存储数据所使用的格式。

文本与数字数据的存储

当数据是纯文本或数字时,可以存储在文本文件中,其扩展名为 .txt

如果你打开一个文本文件,会看到每一行包含多个值。在这个文件中,同一行中的值由制表符分隔。以这种方式查看数据时,可能难以分辨每个值属于哪一列,但计算机能准确地读取它。

那么,所有文件类型都遵循这种一致性吗?让我们打开一个CSV文件在文本编辑器中比较一下。你注意到什么不同了吗?

这种文件格式在每个值之间使用逗号而不是制表符。CSV实际上代表“逗号分隔值”。在数据文件中,任何字符都可以用来指示列。用于分隔每列的字符称为分隔符。最常见的分隔符是逗号、空格和制表符。

电子表格软件

将数据组织成行和列是如此普遍,以至于有专门为此设计的软件程序,这使得电子表格软件成为存储数据的流行选择。

文件扩展名取决于你使用的程序。常见的扩展名有 .xlsx.ods

这些文件使用更复杂的格式来存储特定于程序的附加信息。因此,数据只能由能够解释该文件格式的程序访问。

其他数据类型的存储

类似地,不同类型的数据也使用自定义的文件格式存储,例如图像或声音文件。

如果你在文本编辑器中打开这些文件,内容将是无法识别的。这些文件将数据存储为一系列有限的数值。

MATLAB可以从常见的文件类型中提取数据,包括图像、视频和音频文件。

总结

本节课中,我们一起学习了数据的数字存储方式。所有数据科学家都处理数据,但数据的类型和格式各不相同。无论格式如何,数据本质上仍然是数字和文本。你可以使用MATLAB来加载并分析它。

现在,你已经准备好学习当数据被导入MATLAB后是如何组织的了。

14:MATLAB如何表示数据 🎼

在本节课中,我们将要学习MATLAB如何组织和表示数据。理解数据在MATLAB中的基本结构,是进行有效数据分析和处理的第一步。

数据文件与加载

正如你所见,计算机使用多种文件格式以数字和文本的形式存储数据。

你可以使用MATLAB从许多常见的文件类型中加载数据。

数据的基本组织方式

上一节我们提到了加载数据,本节中我们来看看当数据从其原始文件格式中提取出来后,它是如何组织的。理解这一点将使你能够更好地处理数据。

在MATLAB中,数据被组织成行和列。如果我们的数据是单个值,它将占据单独的一行和一列。其大小为 1 x 1,意味着它有一行长和一列宽。

如果第二个值存储在第二列中,大小将增加到 1 x 2,因为数据现在是一行长、两列宽。

当所有数据都在单一行中时,它被称为行向量

如果所有数据都在单一列中,它被称为列向量

向量与变量

一个向量通常包含单个测量变量的观测值。

数据文件通常包含多个变量的观测值,因此包含多个向量。

这些向量可能包含数字和文本的组合,代表独特的、空间的或时间的信息。例如,如果你在追踪一个航班,你可能会记录飞机的高度速度,或许还有飞行状态

多变量数据的组织

和之前一样,MATLAB将每个观测值放在其自己的行和列中。默认行为是假设每个变量都是一个列向量,每个观测值在其自己的行中。

以下是数据组织的示例:

  • 例如,如果数据由两个变量组成,每个变量有两个观测值,那么第一列将包含第一个变量的两个观测值,第二列将包含第二个变量的两个观测值。

数据被组织成行和列后,你可以使用其行索引和列索引来引用特定的值。例如,数据点 (9, 2) 保存着值 “landed”。

在索引时,第一个数字表示行,第二个数字表示列。

多维数据

到目前为止我们考虑的数据可以组织成一个二维的行列矩阵。然而,有些变量每个观测值包含多个值。考虑一个图像文件。

在这里,行和列保留了图像中像素的空间分布。数据中的每个行和列对代表一个唯一的像素位置,但每个像素关联着三个颜色值,分别表示相应的红、绿、蓝强度。

在MATLAB中,每种颜色的值被放在其自己的“页”上。

每页具有相同的行数和列数,表示图像的高度和宽度(以像素为单位)。这些页沿着第三维度堆叠在一起,首先是红色页,然后是绿色页,最后是蓝色页。

其大小为 行数 x 列数 x 3,其中 3 表示页的数量。

课程总结

本节课中我们一起学习了MATLAB中数据表示的核心概念。

总结来说,MATLAB可以从许多常见文件类型加载数据,加载的数据被组织成行、列,并在必要时组织成页。

默认情况下,每列中的观测值被认为都属于一个唯一的变量。

数据文件可以包含多个变量,观测值可以是文本或数值。

接下来,你将学习如何将数据导入MATLAB。一旦加载,你将能够利用MATLAB强大的分析能力来找到你所提问题的答案。

15:如何使用导入工具 📂

在本节课中,我们将学习如何将外部数据导入到MATLAB环境中。这是进行数据分析的第一步,掌握它至关重要。

上一节我们介绍了MATLAB如何表示数据,本节中我们来看看如何将数据文件导入到MATLAB中。

启动导入工具

首先,导航到包含数据文件的文件夹。双击数据文件,会打开一个名为“导入工具”的新窗口。

了解导入选项

在导入工具窗口中,您会看到几个导入选项,以及数据在MATLAB中显示效果的预览。

我们正在导入一个CSV文件,CSV代表“逗号分隔值”。MATLAB会自动检测正确的分隔符(这里是逗号),但您也可以根据需要手动选择其他分隔符。

同时,请注意输出类型。导入后,数据将以表格的形式表示。正如您已经学到的,MATLAB处理按行和列组织的数据。

检查列名与数据类型

这里的每一列都已经有了名称,例如“state”或“year”,这使数据更容易理解。列名正下方的一行显示了每列的数据类型。

虽然这些数据类型是自动检测的,但您仍应验证检测到的类型是否适合您的用途。在后续视频中,您将了解更多关于此处看到的数据类型,例如文本、数字、分类、日期和时间以及表格。

您的表格还有一个名称。MATLAB会根据您的文件名自动为您提供。

导入数据

当您点击“导入所选内容”时,数据将被导入到您的工作区。这非常简单:双击文件名,点击导入所选内容,您就可以开始使用了。

让我们查看导入的表格 StmEvents2013。它看起来与导入工具中的预览完全一样。您可以看到变量名,以及按行和列排序的不同数据类型。

您还可以使用滚动条来完整地探索表格。正如您所见,这里有很多数据。

导入数据子集

如果您不需要所有列怎么办?让我们回到导入工具,选择部分数据而不是整个数据集。

您是否注意到整个表格都以蓝色高亮显示?蓝色表示将被导入的数据。要选择一个子集,请按住 Ctrl 键并单击您希望包含在表格中的列。

选择范围时,请确保排除标题行,因为您只需要数据本身。

让我们更改表格名称,以免覆盖现有表格,然后导入所选内容。

现在,您拥有了一个更小的数据子集,仅包含您感兴趣的表格变量。这使得处理数据更加容易,同时也节省了时间,因为您加载的数据量没有以前那么大。

总结

本节课中我们一起学习了数据导入的基本流程。

  1. 在MATLAB中双击数据文件以打开导入工具。
  2. 在导入工具中,决定是导入全部数据还是仅导入一个子集。
  3. 然后,检查为变量自动选择的数据类型。
  4. 最后,将您的选择导入到MATLAB工作区。

在接下来的课程中,您将了解更多关于检测到的数据类型以及如何处理它们。

16:MATLAB数据类型

在本节课中,我们将要学习MATLAB中用于组织和表示数据的基本数据类型。理解这些类型是进行有效数据分析和处理的关键第一步。

数据导入与初步观察

上一节我们介绍了如何使用导入工具将数据加载到MATLAB中。本节中,我们来看看数据在MATLAB内部是如何被表示的。

导入的数据集包含一系列天气观测记录,以及时间、地点等信息。在MATLAB中,组织此类数据的常用方式是使用表格

MATLAB采用这种常见的表示形式,其中每一行代表在特定时间进行的一次观测,每一列则保存数据的不同部分。例如,日期和时间、天气事件的类别或其地理位置。这些列被称为表变量

可以看到,变量名已经包含在数据集中。在每个变量名的正下方,显示的是该变量的数据类型,这取决于你打算如何使用这些数据。在导入数据时,需要考虑如何分析它。一旦进入MATLAB,每个变量都有一个类型,该类型根据你的使用计划对数据进行分类。例如,由数字表示的数据可能对可视化或计算有用,而主要由文本组成的数据可能对分类或标记有用。

主要数据类型详解

接下来,让我们深入了解不同的数据类型及其所代表的数据种类。

以下是MATLAB表格中常见的几种核心数据类型:

数值型数据

第一种你可能会注意到的标签是数字,它通常由数据类型 double 表示。如果不熟悉这个名称,不用担心,这是计算机表示实数的一种常用方式。你的表格中有几个表变量属于这种数据类型,例如地理坐标。

数值数据可以是单个值、向量或矩阵。你可以将向量想象成排列在一行或一列中的多个值,而矩阵则是向量的数组。

文本型数据

你也看到了一些提供额外信息的文本。文本数据的数据类型称为 string

字符串用于文本数据,例如天气事件的描述或事件发生的区域。它们可以包含一个或多个单词。

分类型数据

数据集中还有一些文本数据没有被识别为文本,而是被识别为 categorical。对于这种类型的数据,变量可以取的值或类别是一个有限的、已定义的集合。这对于数据分组非常有用。

分类型数据初看可能像文本数据,但略有不同。以变量“state”为例,你会看到有几个条目具有相同的值,并且你可能也知道存在一组有限的可能值。分类型数据可用于获取对天气事件的额外洞察,例如,通过按州分析和可视化事件。

日期时间型数据

最后,你看到了天气事件发生的日期和时间,它们由数据类型 datetime 表示。

datetime 数据类型便于处理日期和时间。它表示一个时间点,例如“2018年6月6日,晚上6点10分”。这种数据类型使你能够在可视化数据时轻松更改显示格式,也便于你轻松执行涉及日期和时间的计算。

表格数据类型总结

至此,你已经了解了表格中使用的所有数据类型。表格本身也是一种数据类型,称为 table

让我们回顾一下所学内容。一个表格由行和面向列的变量组成。每个变量由一个唯一的名称标识,并且可以有不同的数据类型,例如 doublestringcategoricaldatetime。在导入数据时,请注意这些数据类型,因为这在后续的分析中非常重要。

本节课中,我们一起学习了MATLAB中用于构建表格的核心数据类型:用于数值计算的 double,用于文本信息的 string,用于有限类别分组的 categorical,以及用于时间序列处理的 datetime。理解并正确使用这些类型,是进行高效数据科学工作流的基础。

1.16:为何要自动化数据导入过程 🚀

在本节课中,我们将探讨在MATLAB中自动化数据导入过程的重要性及其带来的好处。

导入工具是将数据引入MATLAB的有效方式。当面对一个不熟悉其组织结构的新文件时,通常从导入工具开始,以查看文件内容,并根据需求自定义导入选项。

你可能会问,每次需要文件中的数据时,都必须重复这个操作吗?或者,你可能有许多格式相同的文件。为每个文件重复导入步骤会变得繁琐,因此需要一种方法来自动化这个过程。

节省时间并非自动化流程的唯一原因。记录数据导入的方式,是记录工作并与他人沟通的一部分。这也能确保在需要时能够复现你的工作。

设想一个场景:我导入数据时,设置了选项以排除所有包含缺失数据的行。然后,我将原始文件和分析结果提供给你。我们很可能在结论上产生分歧。

记录步骤,以便你和其他人都能复现结果,这是贯穿本专业课程的一个常见主题。

幸运的是,你在导入工具中选择的所有选项都会被捕获。只需点击一个按钮,你就可以创建一个脚本供未来重复使用。这使你能够节省时间、在日后复现结果,并与同事分享你的分析。

下一节视频将详细介绍如何从导入工具创建代码文件,以及如何使用该文件自动化将数据导入MATLAB的过程。

本节课中,我们一起学习了自动化数据导入过程的重要性。它不仅能够节省时间、提高效率,还能确保工作的可复现性和可沟通性,是数据科学工作流程中至关重要的一环。

17:生成和重用代码 🧑‍💻

在本节课中,我们将学习如何通过生成可重用的代码来自动化数据导入过程,从而提高数据分析的效率和可重复性。

上一节我们介绍了如何使用导入工具交互式地导入数据。本节中,我们来看看如何将这一过程自动化,生成可以反复使用的代码。

首先,打开导入工具并加载2013年的天气事件数据。导入工具会提供数据的预览,并自动选择将数据导入表格变量的选项。

以下是导入工具提供的主要功能:

  • 预览数据。
  • 自动选择导入选项。
  • 选择感兴趣的变量。
  • 修改变量和表格名称。
  • 指定变量的数据类型。

完成自定义设置后,最后一步是点击“导入选择”按钮并选择“导入数据”。但请注意,还有其他几个选项可用于生成MATLAB代码。

点击“生成实时脚本”将创建一个包含相应导入代码的实时脚本,其中包含您所做的所有自定义设置。您可以将此代码作为探索性分析的起点。这样,未来无需重复导入工具中的步骤,即可重复和分享您的分析。

如果您需要处理多个格式相同的文件,生成一个导入函数是更好的选择。该函数包含导入当前数据文件及其自定义设置的必要代码,并且当您提供其他文件名作为输入时,它也可以用于导入具有相同结构的其他文件。

以下是使用导入函数的步骤:

  1. 将生成的函数保存到与分析代码和数据文件相同的位置。
  2. 在数据分析脚本中添加代码,指定文件名。
  3. 调用您的函数,并将输出分配给一个变量。

现在,要导入不同的数据文件,您只需使用新的文件名调用该函数即可。

本节课中我们一起学习了如何通过生成实时脚本或导入函数来自动化数据导入流程。这不仅能节省时间,还能确保分析过程的一致性和可重复性,是构建高效数据科学工作流的重要一步。

模块2:数据导入总结 🎉

在本节课中,我们将回顾并总结模块二“数据导入”的核心内容。你已经学习了如何将外部数据导入MATLAB环境,这是进行数据科学分析的第一步。

首先,我们介绍了不同类型的数据以及数据在MATLAB之外的存储方式。

接下来,我们学习了数据被访问或加载后,在MATLAB内部是如何表示的。

然后,我们使用导入工具,以交互方式将外部文件中的数据加载到MATLAB的表格变量中。

数据加载完成后,我们看到MATLAB表格中每个变量的数据类型与文件中不同类型的数据相对应。

最后,我们学习了导入工具如何通过生成代码来帮助自动化数据导入过程,这使未来的工作变得更加轻松。

现在你已经掌握了将数据导入MATLAB的方法,接下来就可以开始使用可视化和描述性统计来探索你的数据了,这些内容将在后续两个模块中介绍。

但在继续前进之前,是时候通过模块二测验来检验你的数据导入技能了。

请严格按照测验页面上的设置说明进行操作,以在MATLAB中访问所需的文件。

然后,根据说明使用导入工具将每个数据集加载到MATLAB中,并回答后续问题。

本节课中,我们一起学习了数据导入的完整流程:从理解数据类型和外部存储,到使用MATLAB导入工具交互式加载数据,再到理解内部数据表示,并最终实现导入过程的自动化。掌握这些技能是进行有效数据探索和分析的坚实基础。

20:数据可视化与过滤介绍 🎼

在本节课中,我们将要学习如何对导入MATLAB的数据进行初步探索。数据探索是数据分析的关键第一步,它帮助你理解数据的结构、内容和潜在模式。

上一节我们介绍了如何将数据导入MATLAB。现在,当你面对大量数据时,如何开始分析可能会让人不知所措。请记住,数据分析没有固定的顺序或起点。

探索性数据分析的起点

你可能发现,创建可视化图表是理解数据内容最有效的方式。或者,你心中可能有一个具体的问题,那么我们可以从筛选出回答该问题所需的数据开始。

迭代式的探索过程


数据探索很可能是一个迭代的过程。在这个过程中,你会创建可视化图表,进行一些简单的计算,从表格中选择数据,然后可视化新的结果,如此循环往复。

幸运的是,MATLAB提供了许多交互式工具,它们能帮助你在探索数据的同时,记录下重现分析所需的步骤。

本模块的核心内容

本模块的重点就是学习如何使用这些交互式工具来可视化、选择和修改数据。

例如,考虑之前你使用过的分析龙卷风事件的实时脚本。你将学习如何创建其中包含的可视化图表,以及如何筛选数据子集(例如,筛选出造成财产损失的龙卷风)以进行进一步分析。

捕获并复用分析代码

你还将学习如何捕获MATLAB生成的代码,并将其添加到实时脚本中。这样,你就可以在以后重复此分析,或者对新的数据集执行相同的分析。

学习目标

在本模块结束时,你将掌握完成许多常见数据探索任务所需的技能。

让我们开始吧。


本节课中我们一起学习了数据探索的重要性以及本模块的学习目标。我们了解到数据探索是一个灵活的、迭代的过程,可以从可视化或数据筛选开始。本模块将重点介绍MATLAB的交互式工具,帮助我们高效地完成数据可视化、筛选和修改,并学会记录和复用分析步骤,为后续的深入分析打下坚实基础。

21:绘制表中的数据 📊

在本节课中,我们将学习如何在MATLAB中创建不同类型的图表,以探索和可视化表格数据。我们将从基础绘图开始,学习如何查阅文档,以及如何为图表添加标签和标题,以便更清晰地传达结果。


上一节我们介绍了如何将数据导入MATLAB。现在,你已经知道如何导入数据,接下来该做什么?

你可能有一个具体问题,准备直接深入分析。但更常见的情况是,你需要先开始探索数据,以了解其中包含的内容。

创建可视化图表是一个很好的开始方式。在本视频中,你将学习如何创建不同类型的图表,使用文档来了解特定图表的更多信息,并添加标签和标题来帮助传达你的结果。


让我们重新审视天气事件数据,但这次从导入文件后开始。假设这是你第一次查看这些数据。你会从哪里开始?

系统会显示近60,000个事件的预览。你可以滚动浏览表格来了解其内容,但这需要滚动很多次。

可视化可以提供更深入的见解。例如,数据中包含多少事件以及哪些类型的事件?事件类型的直方图可能会有所帮助。

以下是创建图表的步骤:

  1. 转到MATLAB工作区,双击表格以在变量编辑器中打开它。
  2. 在打开的编辑窗口中,选择你想要绘制的变量(本例中是eventType)。
  3. 然后点击“绘图”选项卡。
  4. 系统会显示可用于所选数据的不同类型的图表。如果你不熟悉某种图表类型,图标会提供视觉提示。这里,选择“直方图”。

直方图将显示在一个新窗口中。现在,你可以一次性看到所有事件类型及其相对频率。例如,雷暴风事件构成了近60,000个事件中的四分之一。仅通过查看表格,很难发现这一点。

同时请注意,用于创建图形的代码已放置在命令窗口中。这使你可以复制代码,并将其粘贴到实时脚本中供将来使用。


许多类型的图表需要多个变量。例如,你可能想使用纬度和经度来可视化事件的地理位置。

以下是使用多个变量创建地理图表的步骤:

  1. 按住Ctrl键的同时单击以选择多个变量(例如latitudelongitude)。
  2. 请注意,此处显示的图表类型看起来都不像地理图表。
  3. 点击下拉箭头,查看所选变量的所有可用图表类型。
  4. geobubble看起来是个不错的选择。

图表中会显示很多事件。就像在实时编辑器中一样,你可以放大平移,以聚焦于感兴趣的区域。


你可能还记得在龙卷风的例子中,绘图标记的大小基于损失,颜色基于月份。如何重现这一点?

要获取使用geobubble函数的帮助,请高亮显示函数名,右键单击并选择“所选内容的帮助”。这将打开该函数的文档。在这里,我们看到该函数可以通过附加输入来调用,以指定大小和颜色。

让我们尝试一下。回到变量编辑器,按住Ctrl键并按顺序选择propertyCostmonth变量。请注意,选择了四个变量后,可用绘图的数量大大减少。现在,geobubble是仅有的几个选项之一。

新的绘图标记会根据提供的附加输入改变大小和颜色。最后,将命令复制并粘贴到你的实时脚本中并运行它。


现在图表已在实时编辑器中,当你单击图表时,“图形”选项卡变为活动状态。在“图形”选项卡中,你可以找到可以添加到图形中的常见自定义选项。

让我们为直方图添加一个Y轴标签和标题。生成标签和标题所需的代码,以便你可以将其添加到文件中并记录你的步骤。


可视化是开始探索数据的好方法。本节课中我们一起学习了:

  1. 如何绘制表格中包含的变量。
  2. 如何使用文档来了解特定类型的图表。
  3. 如何添加常见的自定义选项(如标签和标题)。

你可能已经注意到,当你有很多观测值时,一些图表会变得拥挤且难以解释。这时就需要对数据进行过滤,这将是另一节课中涵盖的主题。

22:从表中选择数据 🎯

在本节课中,我们将学习如何从MATLAB的表格(Table)中,根据自定义的条件筛选出我们需要的子集数据。这是数据探索和预处理的关键步骤,能帮助我们聚焦于与分析目标最相关的数据,从而提高分析效率。

概述:为什么需要筛选数据?

你可能会认为数据科学家总是希望获得更多数据,但这只对了一部分。更多数据确实有帮助。然而,以2013年的天气数据为例,如果你只对龙卷风感兴趣,那么大约有58000个无关的观测数据。这些额外的数据会让你更难找到问题的答案。

那么,如何过滤数据,只保留与分析相关的部分呢?本节视频将教你如何根据定义的标准从表格中选择数据子集。通过消除不必要的观测数据,这将帮助你更快地分析数据。

交互式筛选数据

让我们打开2013年天气事件文件,设想一个场景:你想分析造成财产损失的龙卷风,类似于之前处理过的实时脚本。导入数据后,所有事件类型都包含在内。

以下是使用MATLAB交互式工具进行筛选的步骤:

  1. 访问筛选选项:在表格中点击变量名称,会显示对该变量进行排序和筛选的选项。
  2. 清除无关类别:一组复选框显示了表格中包含的事件类别。与其逐个取消勾选非龙卷风类别,不如点击“全清”。
  3. 选择目标类别:你可以滚动查找所需类别,或使用搜索栏快速定位。表格预览会随之更新,并生成实现此更改的代码。
  4. 应用筛选:点击“更新代码”将其添加到脚本中。

请注意,生成的代码为筛选后的表格使用了与原始表格相同的名称。这意味着原始数据将被筛选后的表格替换。在探索数据时,保留原始数据可用性很有帮助,这样你可以快速尝试不同类型的分析。因此,这里让我们将筛选后的表格重命名为 tornadoes

重新运行代码后,工作区中现在有两个表格:一个包含原始数据,另一个仅包含龙卷风事件。

注意:创建第二个表格确实会占用更多内存。因此,如果你处理的数据集非常大,可能需要坚持使用单个表格。

基于数值条件进一步筛选

接下来,让我们通过点击 propertyCost 变量来进一步探索龙卷风表格。这是一个数值变量,因此你有几种不同的选项来使用它筛选和排序表格。

在这个例子中,由于数值范围从0到9.1亿,变化很大,所以很难看清。但数据旁边有一个直方图以及滑块,你可以移动滑块来选择要包含在表格中的数值范围。

除了使用滑块,你还可以通过直接在此处键入来指定要包含在表格中的最小值。使用“1”将移除所有财产损失为零的观测数据。取消勾选“包含缺失值”框,以同时移除 propertyCost 值为缺失的行。

更新代码并运行文件,你将得到一个仅包含造成财产损失的龙卷风表格。最终的表格只有584个事件,远少于原始文件中近60,000个的数量。

现在,表格仅包含造成损失的龙卷风,地理图能提供比显示所有事件位置的地图更深入的洞察。

总结与回顾

本节课中,我们一起学习了如何使用交互式工具从表格中选择和提取数据。这使得探索和分析速度更快,因为筛选后的表格只包含与你分析相关的数据。

让我们回顾一下关键操作步骤:

  1. 启动筛选:点击变量名称,调出排序和选择数据的选项。
  2. 生成代码:使用“更新代码”按钮将相应的步骤添加到你的脚本中。
  3. 保留原始数据:重命名筛选后的表格,以便你可以返回原始数据并尝试不同的分析方法。

通过掌握这些技能,你将能够更高效地处理数据,为后续的特征工程和机器学习建模打下坚实的基础。

23:访问和创建表变量

在本节课中,我们将学习如何访问表格中的单个变量,并使用它们为表格添加新的变量。我们还将学习如何保存分析结果,以便将来使用或与他人分享。

上一节我们介绍了如何使用交互式工具探索天气事件数据,并将生成的代码保存到脚本中。本节中,我们将仔细查看这些代码,学习操作表格变量的具体方法。

访问表格变量

以下是访问表格中特定变量数据的方法。在之前生成的绘图代码中,可以看到这样的模式:tableName.variableName。这是访问表格变量内容的语法。

例如,以下代码访问了 events 表格中的 event type 变量来创建直方图:

histogram(events.eventtype)

接下来,让我们访问财产损失成本的值。首先,输入一个变量名来存储这些值,然后使用等号。接着,输入表格名,后跟一个点 . 和表格中变量的名称。

propertyCost = events.propertycost

执行后,工作区会出现一个新变量。双击这个新变量可以查看其内容,并确认它们与原始表格中的值匹配。

核心概念:要访问表格中的数据,需使用点号 . 分隔表格名和变量名,格式为 表名.变量名

创建新的表格变量

那么,如何向表格中添加一个新变量,例如财产损失与作物损失的总和呢?添加变量的方法与访问变量类似。

首先,输入表格名称,后跟一个点 .。然后,输入要添加到表格中的新变量名称(例如 total_cost)。在等号后面,输入生成新数据的运算。

events.total_cost = events.propertycost + events.cropcost

这条命令将 propertycost 中的每个值,与 cropcost 中对应的值相加,并将结果作为 total_cost 放入 events 表格中。

查看表格内容,可以看到 total_cost 已作为新列添加。向下滚动查看一些观测值,可以确认这一新列确实包含两个原始成本列的总和。

调整列顺序并保存表格

进行分析并向表格添加数据后,您可能希望将新表格保存为一种无需MATLAB即可使用的文件格式。但在分享结果之前,将列按逻辑顺序排列会更有帮助。

若要将 total_cost 移到其他成本变量旁边,请将光标移至变量名称左侧,直到出现拖动指示器。然后点击并将变量拖到所需位置。请注意,此移动操作的代码已被捕获。我们可以复制此代码并将其放入脚本中,以便记录步骤供将来参考。

最后一步是使用 writetable 函数将更新后的表格保存到新文件。

writetable(events, ‘updated_events.csv’)

第一个输入是表格名称,第二个是用引号括起的新文件名。现在,当前文件夹中就有了一个可以在未来使用或与他人分享的新文件。

总结

本节课中我们一起学习了操作表格变量的核心技能。

  • 访问数据:通过输入表格名和变量名,中间用点 . 分隔,来访问存储在表格变量中的数据。
  • 添加新列:同样使用点表示法,但赋予一个新的变量名,即可向表格添加新列。新列默认会添加到表格末尾。
  • 调整列顺序:可以在变量编辑器中通过点击和拖拽来重新排列列。
  • 保存结果:获得更新并排列好的表格后,可以使用 writetable 函数将其保存到文件中,以便在MATLAB环境外使用。

模块3:数据可视化与过滤总结

在本节课中,我们将回顾并总结模块三的核心内容:数据可视化与过滤。你已经掌握了导入数据、创建可视化图表、筛选数据以聚焦分析重点、访问变量与表格以及向表格添加新变量等关键技能。这些技能共同构成了探索性数据分析的基础。

回顾之前的模块,我们曾使用一个实时脚本来分析龙卷风事件数据。

你所看到的大部分代码是通过你刚刚学习的交互操作自动生成并添加到脚本中的。请记住,探索数据是一个迭代的过程。在这个脚本中,可视化图表是在从表格中筛选出数据子集后创建的,但这并非你面对新数据集时的典型工作流程。

在寻找数据洞见时,你通常会尝试多种方法。因此,将生成的代码捕获并添加到你的脚本中至关重要。你可能会走入一个无法解答问题的方向,这时就需要回溯。捕获生成的代码使你能够追溯自己的分析步骤。

现在是练习所学知识的好时机。以下是你可以尝试的步骤:

  • 选择一两种你感兴趣的事件类型,或许再选择一个特定的州。
  • 练习从原始天气事件文件中创建新的数据表格。
  • 创建一些可视化图表。

如果你发现了有趣的现象,可以在论坛中分享。当你准备就绪,请完成本周的测验。

本节课中,我们一起学习了探索性数据分析的核心工作流,包括数据筛选、变量操作与可视化。掌握这些技能使你能够有效地初步探索和理解数据集,为后续更深入的分析奠定基础。

模块4:执行计算介绍 🧮

在本节课中,我们将要学习如何对数据进行计算,以获取关键的统计信息,从而支持更深入的数据分析和决策制定。

上一节我们介绍了如何通过筛选数据和创建可视化来聚焦关键变量。本节中我们来看看如何通过执行计算来获取更深层次的洞察。

例如,你已经知道如何可视化各类天气事件的地理分布。然而,假设你需要为应对恶劣天气事件规划资源分配。

诸如各州总成本、每起事件的平均成本以及事件造成的最大损失等统计数据,将帮助你做出明智的决策。

为了回答这些问题,你需要开始对数据执行一些计算。

我们将从基础开始本模块的学习。你将学习如何使用变量设置计算。你将计算一些基本统计量,并学习如何识别变量之间的相关性。你已经知道如何交互式地筛选数据,在本模块中,你将学习更复杂的选择标准,可用于数据筛选。

在本模块结束时,你将能够将数据重新分组到你定义的类别中,并计算这些类别的统计数据。

内容很多,但不必担心,你将有机会在整个模块中应用所学知识。你将直接在浏览器中执行计算,并收到关于任何错误的反馈。

如果遇到困难,可以访问论坛寻求帮助。到本模块结束时,你将能够对数据进行更详细、更高级的分析。

让我们开始吧。

本节课中我们一起学习了执行计算在数据分析中的重要性,并预览了本模块将涵盖的基础计算、统计量计算、相关性分析、高级筛选以及数据分组等核心内容。

26:基本数学运算 🧮

在本节课中,我们将学习如何在MATLAB中进行基本的数学计算,包括使用算术运算符、定义变量以及理解运算顺序。这些是构建更复杂表达式和解决实际问题的基础。

概述

迟早,你可能会遇到需要公式和大量数值计算的问题,其中一些无法手动完成。一旦开始解决更困难的问题,就需要以编程方式执行任务。在本视频结束时,你将能够在MATLAB中执行基本的数学计算,并在编写表达式时使用运算顺序。

算术运算符:计算的基石

考虑一个熟悉的例子:求解一元二次方程。这个表达式包含几种不同的算术运算符,它们是许多MATLAB计算的基础构件。在将它们组合成单个表达式之前,我们先来看看这些基础构件。

以下是MATLAB中常见的算术运算符:

  • +:加法
  • -:减法
  • *:乘法
  • /:除法
  • ^:幂运算

进行计算与变量赋值

你通过使用这些常见运算符输入数学表达式来执行计算。计算结果默认存储在一个名为 ans 的变量中。若要将结果存储在特定变量中,需要使用等号 =,它被称为赋值运算符,因为它将值赋给变量。

变量命名规则

为变量起描述性的名称有助于你记住它们的含义。在选择名称时,请记住需要遵循几条重要规则。

以下是变量命名的关键规则:

  • 变量名必须以字母开头,并且只能包含字母、数字和下划线。
  • 变量名区分大小写(例如,myVarmyvar 是两个不同的变量)。

使用变量进行计算

变量很有用,因为它们存储在内存中,所以你可以在计算中使用它们。例如,要计算一场风暴的持续时间,你只需减去已经存储风暴开始和结束时间的变量。

实践:求解一元二次方程

现在你掌握了基础知识,可以准备计算一元二次方程的根了。

首先,定义变量 ABC。选择这些变量名可以使MATLAB表达式类似于数学公式。

接下来,输入第一个根的公式。你可以使用括号来对复杂表达式中的项进行分组。请务必使用星号 * 表示乘法,否则会收到类似这样的错误。

虽然这个表达式乍一看可能正确,但它不会产生预期的结果。因为MATLAB计算遵循运算顺序,所以这个表达式被求值了。因此,-B 不再是分数的一部分,而 A 也不在分母中。要获得正确的结果,需要添加括号将分子和分母分组在一起。

理解运算顺序

对运算顺序有很好的理解是很有帮助的,这样你就知道何时需要用括号对项进行分组。

以下是MATLAB中的运算顺序(优先级从高到低):

  1. 括号 ()
  2. 幂运算 ^
  3. 乘法和除法 */
  4. 加法和减法 +-

计算第二个根

现在第一个根已经计算完成,将加号改为减号以找到第二个根。很好,现在计算完成了。

总结

本节课中我们一起学习了在MATLAB中进行基本数学运算的核心技能。总结一下,你使用赋值运算符 = 在MATLAB中定义变量,并且可以在使用数学运算符执行的计算中使用变量。请记住,当你的计算变得更加复杂时,要对项进行分组并注意运算顺序。

27:使用向量

在本节课中,我们将要学习如何在MATLAB中创建和使用向量。向量是数据科学中处理一系列数值的基础工具,特别是在数据可视化和批量计算中至关重要。我们将重点学习如何创建均匀间隔的向量,以及如何对向量进行逐元素运算。

在许多应用中,你需要对介于上限和下限之间的一系列数值进行计算。这一系列数值也被称为向量。

通常,这些数值之间具有相同的间隔。

创建均匀间隔向量

为了绘制图形,你需要一系列X值和Y值。你可以通过手动计算并输入每个值来做到这一点。在MATLAB中,你可以通过将数值序列放在方括号内并用逗号分隔来创建向量。然而,这种方法非常耗时。

取而代之,你可以使用冒号运算符快速创建均匀间隔的向量。

以下是使用冒号运算符创建向量的方法:

  • 基本语法x = 起始值:结束值。这会创建一个从起始值开始、以默认步长1递增、直到结束值的行向量。
  • 指定步长x = 起始值:步长:结束值。这会创建一个从起始值开始、以指定步长递增、直到不超过结束值的行向量。

例如,要创建一个从-2到2的X值向量,如果使用默认步长1,结果将只包含5个点,绘制的图形会不够平滑。因此,我们需要更多的点,这意味着需要使用不同的步长。

例如,这里你创建了一个步长为0.3的向量。当步长不能将区间均匀划分时,结果向量会从下限开始,在达到上限之前结束,上限值不被包含。如果将步长改为0.1,结果将是一个包含41个元素的向量,从-2开始,到上限2结束,因为这次步长将区间均匀划分了。

对向量进行逐元素运算

很好,你使用冒号运算符创建了X值向量。但是,你是否仍然需要单独计算每个Y值呢?尝试像之前使用单个数字一样,在计算中使用向量X,看看会发生什么。

这里你需要对x的每个元素进行平方运算。没问题,只需做一个小小的改动,你就可以执行逐元素运算。

以下是对向量进行逐元素运算的规则:

  • 乘法:使用 .* 运算符。例如,v1 .* v2 会将 v1v2 的对应元素相乘。
  • 除法:使用 ./ 运算符。
  • 幂运算:使用 .^ 运算符。
  • 加减法:对于逐元素的加法和减法,没有特殊的运算符,因为对于标量(数字)与向量、矩阵的运算规则是相同的,直接使用 +- 即可。

有几个常见的错误需要注意。在执行逐元素运算时,很容易忘记加点号。或者不小心使用了不同大小的向量。当发生这种情况时,你会得到一个关于矩阵维度的错误信息。如果你没有使用矩阵,但在尝试对两个向量的对应元素执行操作时收到矩阵维度错误,请检查你是否使用了逐元素运算符、你的向量是否具有相同数量的元素,以及向量是否都是行向量或都是列向量。

应用:绘制二次函数图像

现在回到你想要绘制的那个函数。

由于x是一个向量,你需要使用逐元素的幂运算符 .^ 来对x的每个元素进行平方。让我们看看这个表达式是如何计算的。首先,x的每个元素被平方。然后,向量的每个元素分别乘以标量3和2。最后,当标量与向量进行加法或减法时,标量会自动扩展以匹配向量的大小,然后再执行加法或减法。

这样,通过使用逐元素运算,你创建了一个y值向量,该向量为x中的每个点进行了计算。现在,这个图形准确地表示了该函数。

总结

本节课中我们一起学习了向量的核心操作。你可以使用冒号运算符创建均匀间隔的X值向量,并使用逐元素运算符在单个表达式中计算所有Y值。这在后续需要选择数据子集并对其执行计算时将特别有帮助。

28:使用函数 🎼

在本节课中,我们将要学习如何使用MATLAB的函数。函数是MATLAB的核心组成部分,能够帮助我们高效地完成计算、数据可视化和分析等任务。掌握函数的使用方法是进行数据科学实践的基础。

MATLAB包含了数千个现成的函数,可以执行各种常见任务。为了充分利用这些功能,首先需要了解如何使用MATLAB函数。接下来,让我们详细看看函数及其使用方法。

在本视频结束时,你将能够调用MATLAB函数,这对于计算分组统计数据和查找数据之间的相关性等任务至关重要。

函数的基本概念

之前你已经使用过MATLAB中可用的函数,例如 sqrt 用于求一个数的平方根。此外,还有用于可视化数据、导入图像或快速查找向量中最小或最大元素的函数。

尽管有数千个MATLAB函数,但只需学习几种基本的使用模式。

函数调用模式

使用MATLAB函数的方式与使用数学函数类似。你需要函数名,以及括在括号内的输入。你可以将结果赋值给一个输出变量。根据函数的不同,甚至可以有多输入和多输出。

让我们从基础开始。许多熟悉的数学函数,如正弦、对数或指数函数,都遵循相同的模式,并且MATLAB函数的命名也与之相似。

数学函数如正弦函数可以接受向量或矩阵作为输入。输出将与输入大小相同,并且函数会应用于每个元素。

但MATLAB函数更为通用。以这个函数调用为例,你认为它返回什么?如果你回答是 -1,那么你是正确的。当你将一个向量传递给 min 函数时,它会返回该向量的最小值。

你可能不知道的是,min 函数还可以告诉你最小值的位置。在这里,它告诉你位置是 4,因为最小值是向量的第四个元素。许多MATLAB函数如果你在一对方括号内单独请求,可以返回多个输出。同样,许多函数也接受多个输入。

多输入函数示例

例如,考虑为你的地理气泡图设置地理限制。

geolimits 函数接受一个两元素向量作为纬度,一个两元素向量作为经度,并更新现有的绘图。

查阅函数文档

如果你对其他MATLAB函数感到好奇,可以在文档中查找它们。

每个函数的文档都提供了在常见场景中如何使用它的示例。

现在你已经了解了调用MATLAB函数的基础知识。稍后,你将学习如何使用函数来快速汇总你的数据。

总结

本节课中,我们一起学习了MATLAB函数的基本使用方法。我们了解了函数的调用模式,包括单输入单输出、多输入以及多输出的情况。我们还通过 mingeolimits 等函数的具体例子,加深了对函数灵活性的理解。最后,我们知道了如何通过官方文档来探索和学习更多函数。掌握这些是后续进行数据探索和特征工程的重要一步。

29:计算汇总统计 📊

在本节课中,我们将要学习数据探索的第一步:如何计算和解读汇总统计量。汇总统计是描述数据集中变量特征的有效工具,尤其当数据集规模较大时,它比直接观察数据更为高效。

上一节我们介绍了数据探索的重要性,本节中我们来看看如何利用统计量来理解数据。

探索数据的第一步

探索数据时,第一步是了解各个变量及其包含的值。

对于像下图所示的小型数据集,可以直接检查每个观测值。

然而,对于更大的数据集,这种方法很快会变得不切实际。仅通过观察也很难了解数值的分布情况。

描述性统计提供了一种便捷的方法来总结可能包含数百、数千甚至数百万个值的数据集。

使用汇总统计描述数据

让我们通过一个示例数据集来了解如何使用统计量总结数据。

该表格包含了一项在多个地点进行的血压研究的测量数据。

为了更多地了解这项研究、参与者及其结果,你首先需要理解每个变量可能取哪些值,以及这些值是如何分布的。

你可以使用 summary 函数来快速获取每个变量的概览。summary 函数接受一个表格作为输入,并返回每个变量的名称、大小、数据类型以及关于其值的附加信息。

以下是 summary 函数的基本用法:

summary(yourTable)

为每个变量显示的信息取决于其数据类型。例如,对于 double 类型的变量,会显示最小值、中位数和最大值。而对于分类变量和逻辑变量,则会显示频率计数。请注意,对于 string 类型的变量,不会提供额外的汇总信息,因为这种类型的汇总信息对于文本数据帮助不大。

使用MATLAB描述性统计函数

除了 summary 函数,还可以使用 MATLAB 中可用的描述性统计函数来获取单个变量的统计量。

例如,你可能想知道最常见的测试地点,这可以使用 mode 函数计算。

为了更好地理解血压读数,可以使用 mean 函数来查找平均值。然后使用 std 函数查看大多数值是接近平均值(对应较小的标准差),还是分散在更大的范围内(由较大的标准差表示)。

以下是计算平均值和标准差的公式与代码:

  • 平均值公式mean = sum(values) / number_of_values
  • MATLAB代码avgBP = mean(data.Systolic)
  • 标准差公式std = sqrt( sum( (values - mean)^2 ) / (number_of_values - 1) )
  • MATLAB代码stdBP = std(data.Systolic)

现在你已经掌握了描述此数据集中变量的必要工具。

处理缺失值

然而,你自己的数据有时可能包含缺失元素或 NaN(非数字)值。在计算某些统计量时,这些值会导致非数字结果。

在这种情况下,调用这些函数时,可以包含 ‘omitnan’ 选项,以便在计算中仅包含数字元素。

以下是处理缺失值的代码示例:

avgBP = mean(data.Systolic, ‘omitnan’)
stdBP = std(data.Systolic, ‘omitnan’)

总结

本节课中我们一起学习了数据探索的核心步骤——计算汇总统计。我们首先了解了直接观察数据的局限性,然后介绍了使用 summary 函数获取数据概览,以及使用 meanstdmode 等函数计算具体统计量的方法。最后,我们还学习了如何处理数据中的缺失值,确保统计计算的准确性。现在,你已经知道如何使用 MATLAB 的描述性统计函数,是时候去深入了解你自己的数据了。

30:变量间相关性 🔍

在本节课中,我们将要学习如何量化评估数据集中的变量之间的关系,特别是通过计算相关系数来描述变量间的线性关联。


在对数据集中的单个变量有了充分理解之后,便可以开始寻找变量之间的关系。可视化图表有助于发现潜在的关系,但为了描述和比较这些关系,需要一种更定量的评估方法。其中一种方法是使用MATLAB计算两个变量之间的相关系数。

在本次视频中,我们将通过探索一项血压研究中的变量关系,来深入了解相关性。


理解相关系数

考虑两个预期相关的变量:体重和身高。

为了计算两个变量之间的相关性,可以使用 corr 函数。其输出结果是相关系数,这是一个介于 -1 和 +1 之间的数字。

相关系数的符号由变量是正相关还是负相关决定。正相关意味着一个变量的值增加时,另一个变量的对应值也倾向于增加。负相关则相反。当绘制体重与身高的关系图时,它们之间的正相关性是显而易见的。

了解了相关系数的符号后,其大小又说明了什么呢?


相关系数的大小与强度

为了回答这个问题,让我们绘制两个在成年人中可能无关的变量:年龄和身高。

然后计算它们的相关系数。虽然符号表明变量是正相关的,但从图中并不能清晰地看出这种关系。

这是因为系数的大小由相关性的强度决定。接近 -1 或 +1 的值表明变量之间存在强的线性关系。接近零的值则意味着关系较弱或根本没有关系。

比较两个图表,体重与身高之间更强的线性关系是明显的,而年龄与身高之间的类似关系则难以辨别。

需要注意的是,相关系数的大小与线性关系的斜率无关,只与数据点落在一条直线上的接近程度有关。例如,以下每个数据集的系数都是 +1 或 -1,尽管连接它们的直线斜率各不相同。

此外,小的相关系数仅表明线性关系较弱。强烈的非线性关系仍可能导致系数接近 0。


在MATLAB中应用相关性分析

现在我们已经学会了如何解释和计算相关系数,让我们用它来研究血压与年龄等其他变量之间的关系。

通过使用方括号将两个血压变量分组,可以同时计算与多个变量的相关性。这些变量之间似乎没有太多关系,这在图中得到了反映。

那么吸烟者与非吸烟者的血压情况如何呢?请注意,即使“吸烟者”是一个逻辑变量,corr 函数仍然可以计算其相关系数。输出结果指示了一个值得进一步探索的潜在关系。

血压与性别之间的相关性又如何呢?在将分类变量使用双等号运算符转换为逻辑值向量后,即可计算其相关系数。结果是血压与属于女性类别之间的相关性。其他类别的系数可以用同样的方式计算。


总结

本节课中,我们一起学习了如何利用相关系数来量化变量间的线性关系。我们探讨了相关系数的符号(正/负相关)和大小(关系强度)的含义,并演示了如何在MATLAB中使用 corr 函数进行计算。我们还了解到,相关系数仅衡量线性关系,对于非线性关系可能不敏感,并且可以应用于数值和分类变量。

31:访问数据子集 🎯

在本节课中,我们将学习如何访问和操作向量、矩阵及表格中的数据子集。我们将从基础的索引访问开始,逐步深入到如何根据条件筛选数据,以及如何替换数据集中的特定值。


上一节我们介绍了如何在实时编辑器中通过交互方式选择数据。例如,通过点击事件类型变量,可以创建一个仅包含龙卷风数据的新表格。

交互式工具通常是最好的起点,它们能预览选择结果并生成所需代码。然而,有些类型的选择无法通过交互方式完成。例如,如果你想替换缺失数据这类值,该怎么办?

在本视频中,你将学习如何访问向量、矩阵和表格的元素。

我们将使用关系和逻辑运算符,根据定义的条件来选择数据,并替换数据集中的值。


访问向量元素

让我们从向量开始。向量的元素按顺序编号,这个编号称为索引。例如,索引3可能包含值6。

要访问该元素,需键入变量名,并将索引括在括号内。例如:

v = [1, 3, 6, 8, -2, -5];
element = v(3); % 返回 6

这里,新变量 element 的值为6。

要访问多个元素,可以使用索引向量。以下命令返回向量的前四个元素:

firstFour = v(1:4); % 返回 [1, 3, 6, 8]

而以下命令访问索引为2、5和6处的元素:

selected = v([2, 5, 6]); % 返回 [3, -2, -5]

要更改现有变量的元素,需将变量放在等号左侧,并将要更改的元素放在括号内。例如,此命令将索引4的值更改为0:

v(4) = 0; % v 变为 [1, 3, 6, 0, -2, -5]

访问矩阵与表格元素

现在我们已经了解了向量,但矩阵和表格有行和列。访问或更改值时,需要同时指定行索引和列索引。

通过在行和列之间用逗号分隔来实现。例如,以下命令将第2行第3列的值赋给一个新变量:

A = [1 2 3; 4 5 6; 7 8 9];
value = A(2, 3); % 返回 6

以下命令返回第4行和第5行的所有列:

rows4and5 = A(4:5, :);

在处理矩阵和表格时,经常需要整行或整列数据。与其创建索引向量,可以使用一个快捷方式:使用冒号 : 来表示整行或整列。

现在,花点时间尝试一下你学到的内容。


根据条件选择数据

以上介绍了如何通过索引访问向量、矩阵和表格的元素。那么,要创建一个仅包含造成财产损失事件的表格,难道需要手动浏览6万个观测值,并记下每个非零值的行索引吗?

开个玩笑,请永远不要尝试那样做。相反,让我们看看如何根据条件而非索引来提取元素。

在解决大型表格的问题之前,让我们回到向量示例。假设你需要提取所有大于0的元素。

命令仍然使用变量名后跟括号。在括号内,指定一个条件来确定要选择哪些元素。你可以将此命令理解为:访问向量 vv > 0 的元素。

v = [1, 3, 6, 0, -2, -5];
positiveV = v(v > 0); % 返回 [1, 3, 6]

可以使用 &(与)和 |(或)运算符组合条件。例如,要获取 v 中大于-6且小于等于5的值,使用 & 运算符组合两个条件:

conditionedV = v(v > -6 & v <= 5); % 返回 [1, 3, 0, -2, -5]

好的,现在你已经准备好回到天气数据并应用这些概念了。


在表格数据中应用条件选择

数据集中区分了财产损失和作物损失。如果你想捕获所有造成任何损失的事件,该怎么办?

对两个变量使用交互式工具会生成如下代码。这段代码产生了一个表格,其中包含造成财产损失作物损失的事件(注意是“与”的关系)。符合这些条件的事件只有649个。

要创建一个包含任何造成损失事件的新表格,你需要选择所有财产成本大于0作物成本大于0的行。因为表格是二维的,你还需要指定要返回的列。这里,使用冒号 : 来返回所有列。

% 假设 weatherData 是包含 ‘PropertyCost’ 和 ‘CropCost’ 列的表格
damageEvents = weatherData(weatherData.PropertyCost > 0 | weatherData.CropCost > 0, :);

完美,新表格捕获了所有造成损失的事件。请注意,当使用“或”条件时,包含的事件数量要多得多。

你可以看到,有些事件的财产或作物成本数据仍然缺失。处理缺失数据是本专业后续课程的一个重要概念。然而,由于造成损失的天气事件通常会被充分报告,缺失数据很可能意味着成本为零或接近零。


替换数据值

如何用定义的值替换缺失数据?

要为元素分配新值(而不是访问它),需要将你想要更改的变量放在等号左侧。在括号内,包含用于替换的元素或选择条件。在本例中,ismissing 函数将选择作物成本变量中所有缺失数据的元素。最后,在等号右侧添加替换值。

你可以将此命令理解为:对于变量 CropCost 中的所有元素,如果 CropCost 的值缺失,则将该元素替换为0。

weatherData.CropCost(ismissing(weatherData.CropCost)) = 0;


总结

本节课涵盖了大量内容。你现在知道了如何访问向量、矩阵和表格的元素。你也可以定义条件,用于从变量中选择元素或替换变量中的元素。

在继续之前,请花点时间回顾一下探索2013年龙卷风的实时脚本。寻找其中访问或修改数据的代码行,看看你是否能解读这些代码。

32:分类数据介绍 🎼

在本节课中,我们将要学习如何在MATLAB中处理分类数据。分类数据在日常生活和数据分析中无处不在,例如月份、事件类型等。掌握如何操作这类数据,对于数据探索和特征工程至关重要。

什么是分类数据?

上一节我们介绍了MATLAB中的基本数据类型。本节中我们来看看什么是分类数据。

分类在日常生活中随处可见。当你醒来时,你的状态会从“睡眠”类别转变为“清醒”类别。你可以将整个人口划分为这两个组别。使用已知的标签(如“睡眠”、“清醒”)来表示这些状态,通常比使用数字更为方便。一个分类变量总是包含一个有限的、离散的类别集合。在这个例子中,只有两个类别:asleepawake

数据集中的分类变量

考虑之前导入的数据集。表格中的几个变量被作为分类变量导入。

以下是数据集中包含分类变量的例子:

  • state(州)
  • month(月份)
  • event type(事件类型)

例如,month 中的每个值都将是十二个月份中的一个。让我们更仔细地查看数据,探索天气事件的季节性。

探索事件的季节性

我们的目标是找出哪个月份发生的事件最多,以及发生了哪些类型的事件。

加载数据后,使用表格中的 month 变量创建一个直方图。

histogram(data.month)

现在你可以看到按月份分组的事件数量。注意,月份默认按字母顺序排序。但类别可以有一个自然的顺序。为了看清季节性模式,你需要重新排序月份类别。

重新排序分类变量

为此,首先创建一个字符串向量,其中包含按所需顺序排列的类别名称,然后调用 reordercats 函数。

newOrder = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
data.month = reordercats(data.month, newOrder);

reordercats 的第一个输入是要重新排序的分类表格变量,第二个输入是定义顺序的向量。重新排序的结果被赋值回 data.month

重新排序后的直方图现在反映了更改后的顺序,你可以清楚地看到季节性。最多的事件发生在夏季月份。那么在这些月份里发生了什么呢?

深入分析特定月份的数据

提取六月份的数据,并查看由分类数据类型表示的下一组数据——事件类型,以找出发生了哪些类型的事件。

通过点击表格并筛选 month 变量为“June”来选择六月的数据。复制生成的代码并粘贴到实时脚本中。然后重命名变量,以免覆盖原始数据集。

data_June = data(data.month == ‘June‘, :);

现在,让我们找出六月份发生了哪种天气事件。

分析特定月份的事件类型

再次在事件类型上使用直方图,它可以准确显示发生了多少次洪水或其他类型的事件。

histogram(data_June.eventType)

仔细观察,你会发现每个类别都被显示出来,包括那些事件数量为零的类别。例如,在北半球,你不会期望在六月发生冬季天气事件。因为类别太多,很难看清趋势。让我们移除未使用的类别,以便更好地查看有意义的数据。

选择包含六月数据的表格,并编辑 eventType 的类别。在这里,你可以看到它们的顺序、类别名称以及计数(代表每个事件发生了多少次)。通过点击 Counts 旁边的箭头按计数排序,所有计数为0的事件类型将首先列出。现在选择这些事件类型并点击“移除选定项”。然后点击“确定”,并将生成的代码复制到你的实时脚本中。

让我们看看这如何改变了直方图。现在你只看到了六月份实际发生的事件类型。

合并相关类别

在分析的这一点上,仔细查看你的类别是一个好主意。显示的类别是否准确地代表了你要回答的问题?记住,你正在识别发生的事件类型。有些事件类型密切相关,应该合并为一个类别,例如海洋事件。

为此,首先回到你的表格。在那里,再次选择 eventType 来编辑类别。在这里,你添加一个新类别并将其命名为 Marine Events。接下来,将所有相关的海洋类型类别合并到新创建的 Marine Events 类别中。这个交互操作也会生成代码,你可以从中学习或直接复制到你的实时脚本中。

以下是合并额外类别后的直方图示例。对于这个数据集,Thunderstorm Wind(雷暴大风)是六月最常见的事件。你可以深入挖掘,回答关于雷暴地理分布的问题。

进一步分析与可视化

现在,你已经知道如何交互式地筛选 eventTypeThunderstorm Wind。使用生成的代码时,别忘了重命名变量,以免覆盖原始数据。

data_June_Thunderstorm = data_June(data_June.eventType == ‘Thunderstorm Wind‘, :);

为了完成分析,使用包含六月雷暴的数据子集来可视化它们发生的位置。将子集的纬度和经度传递给 geodensity 函数,以查看风暴的分布。

geodensityplot(data_June_Thunderstorm.latitude, data_June_Thunderstorm.longitude)

总结与展望

本节课中我们一起学习了如何使用分类数据。正如你所见,你可以使用类别来选择数据组,例如特定的月份或你感兴趣的事件类型。你也看到了从你的操作中自动生成的相应代码,这将帮助你学习相关函数并在以后将其重用于其他目的。利用这个机会,通过选择一个函数并按 F1 快速访问帮助,来了解更多关于你所用函数及其语法的信息。

在接下来的视频中,你将迈出下一步,使用类别来执行分组统计。

32:执行分组计算 📊

在本节课中,我们将学习如何对数据进行分组计算。我们将把之前学到的分类变量筛选和统计计算结合起来,分析数据内部的各个分组。

上一节我们介绍了如何使用分类变量筛选表格并创建可视化图表。现在,我们将这些概念结合起来,开始分析数据中的分组。

假设我们想知道一年中每个月的恶劣天气事件数量及其造成的财产损失总额。这可以通过执行分组计算来实现。

分组计算首先涉及根据某个特征(例如月份)对数据进行分组,然后为每个组计算一个统计量。在本例中,统计量是恶劣天气事件的数量和财产损失的总和。最后,将所有结果合并到一个表格中以便分析。

现在,让我们对2013年的严重风暴事件数据执行相同的计算,并创建一个类似的表格。

有多种方法可以执行此计算。你可以为每个月筛选表格,并对财产损失变量求和。但当分组很多时,这会是一项繁琐的任务。

如何能不重复相同步骤而完成此任务呢?

接下来,我们通过一个实时脚本来演示。该脚本已将2013年严重风暴事件数据导入到一个名为 data 的表格中,并且月份类别已按时间顺序重新排序。

以下是可用的实时任务。实时任务为常见分析(如清理异常值和平滑数据)提供了交互式工具。我们的目标是计算分组统计量,因此请在脚本中插入“按组计算”实时任务。

此任务主要有三个可用选项:

  • 按组计算统计量:执行统计计算。
  • 按组转换:用于数据转换,如数据标准化。
  • 按组筛选:根据指定条件移除行。

对于我们的任务,我们将使用第一个选项。

在实时任务中,选择严重风暴事件数据集,然后将输出重命名为 monthly_damage。接着,通过从下拉菜单中选择 month 来按月份对数据进行分组。

下一步是选择要执行的统计分析类型。

“每组计算”下拉菜单列出了可供选择的不同计算类型。默认选择的方法是“计数”。这些选项已经生成了一个12行2列的输出表格,其中包含了结果。

此表格中的第一个变量是所有月份的列表。第二个变量 GroupCount 是每个组中的观测值数量。换句话说,这是该月发生的所有严重风暴事件的总数。

数据分组完成后,就可以执行额外的统计计算了。

由于我们想知道每个月的财产损失总额,请选择“指定变量”,然后选择 property_cost。接着,在“每组计算”下,除了“计数”外,再选择“总和”。

现在,我们得到了一个表格,其中显示了每个月严重风暴事件的数量以及这些事件造成的财产损失总成本。

最后,让我们看一下刚才执行的分组任务所生成的代码。这段代码可用于创建结果表格,而无需打开实时任务。

你也可以通过点击“将任务转换为可编辑代码”来用代码替换实时任务。

你在实时任务中执行的计算是使用 groupsummary 函数完成的。请注意,该函数接收了四个输入:你的数据集、分组变量、你选择的统计计算类型,以及你要在其上执行计算的变量。

但是,如果你需要基于多个变量(如月份和州)创建分组,并且需要对分组执行多个计算,该怎么办呢?

当然可以。让我们尝试使用两个分类变量(月份和州)来对结果进行分组,并同时计算财产损失的平均成本。

回到实时任务,点击加号按钮添加一个新的“分组依据”字段。从下拉菜单中,选择 St。在“每组计算”下,除了“计数”和“总和”外,再选择“平均值”。

输出是一个表格,其中显示了每对月份和州的天气事件总数,以及财产损失的总成本和平均成本。

要查看这些选项如何影响生成的代码,请将任务转换为可编辑代码。注意 statemean 是如何被添加到 groupsummary 函数中的。因为不止一个,所以它们必须用方括号括起来。

现在你已经能够执行分组计算了。请花些时间自行练习。例如,尝试按事件类型分组,看看哪种类型造成了最高的总损失,以及哪种类型造成了最高的平均损失。

在本节课中,我们一起学习了如何利用MATLAB的实时任务和 groupsummary 函数对数据进行分组计算。我们掌握了如何按一个或多个变量分组,并计算如计数、总和、平均值等统计量,从而能够高效地分析数据中的不同分组模式。

33:可视化结果 🎨

在本节课中,我们将学习如何利用MATLAB强大的可视化功能来理解分析结果,并向他人清晰地传达分析细节。我们将重点介绍如何自定义图表外观、添加注释,以及在同一图表中展示多个数据集。

概述

可视化是理解数据结果和向他人传达分析细节的有力工具。MATLAB提供了多种绘图函数,帮助您从数据中获得更多洞察。本节将指导您定制图表外观、添加标注,并学习在同一图表中展示多个数据集的方法。

探索特定事件:科罗拉多州洪水

我们一直在使用特定年份的气象数据。现在,让我们选取一个州,详细查看那里发生的主要天气事件。科罗拉多州在2013年9月发生了历史性的洪水,可视化将帮助我们深入了解这一事件。

在导入数据并计算总损失后,您可以按月对事件进行分组,并计算每个月的总损失成本。如果绘制总和与月份的关系图,默认的线型是蓝色实线,这暗示数据是连续的,尽管它实际上是离散的。对于此类数据,显示单独的数据点更为合适。

自定义图表外观

要更改图表样式,您需要向 plot 函数提供额外的参数。重新输入 plot 命令,您会看到关于绘制额外数据和提供绘图选项的建议。

以下是自定义图表的关键步骤:

  • 更改颜色: 提供属性名称(如 ‘Color’)后跟自定义值(如 ‘red’)。
  • 移除线条: 设置 ‘LineStyle’ 属性为 ‘none’
  • 更改标记: 设置 ‘Marker’ 属性(例如 ‘o’ 代表圆圈)。
  • 调整标记大小: 设置 ‘MarkerSize’ 属性。

运行命令后,您将看到更新后的图表。然而,当前图表暗示一年中只有两个月有非零损失成本,且Y轴数值范围很大。为了更好地观察数值变化,我们需要以不同的方式绘制这些值。

选择合适的图表类型

对于少数值远大于其他值的情况,您可以探索其他类型的图表。例如,可以对Y轴使用半对数坐标图。这样,您就能看到大多数值确实不为零。

semi logy 函数的可定制属性与 plot 函数相同,但您可以查看文档以获取完整的属性名称和值列表。

添加标签和标题

除了自定义外观,添加标签和标题可以使图表更易于解读。点击图表,在“图形”选项卡中会出现最常用的选项列表。展开视图后,您可以添加标题、坐标轴标签,并添加X轴网格线以便更容易识别每个点对应的月份。

请注意,每次自定义操作后,相应的代码都会出现在图表下方。记得点击“更新代码”,以便自动将新命令包含到您现有的代码中。下次运行脚本时,图表将自动应用这些自定义设置。

这个图表更清楚地表明,科罗拉多州有两个月在天气事件造成的损失成本方面非常严重:第一个是六月,第二个是发生洪水的九月。

在同一图表中比较多个数据集

为了更详细地检查受洪水影响的区域,我们可以查看洪水事件报告的地点。为了在上下文中理解这些事件,让我们比较九月和八月报告的洪水事件位置。

要实现这一点,首先将所有与洪水相关的事件合并到一个类别中,并确保使用相关月份的数据。运行代码生成地理位置可视化后,数据会绘制在两个独立的图形上。八月的洪水事件分散在全州,而九月的大部分洪水事件则集中在特定区域。

两个图表的坐标轴范围都根据数据自动缩放。如果您想通过在同一坐标轴上绘制它们来比较这两个数据集,可以使用 hold 命令。

在第一个 plot 命令后输入 hold on,表示后续的绘图应在同一坐标轴上进行。在最后一个 plot 命令后添加 hold off。再次点击运行,这次两个图表将出现在同一个图形中,并且X和Y轴的范围已调整为适应两个数据集。

多个数据集会自动以不同颜色绘制,但和之前一样,您可以自定义属性。图表准备好后,您还可以使用图例来区分数据集。点击图形,然后在“图形”选项卡中点击“图例”按钮。点击标签可以为其指定更具描述性的名称。图例中的键按绘图顺序从第一个到最后一个排列。完成后,使用“更新代码”生成包含这些更改的代码。

添加地理背景

您还可以更进一步,添加底图以包含地形信息。可以观察到,九月报告的大多数洪水事件都集中在这个山区系统附近。因此,该地区2013年科罗拉多州洪水事件也被称为“2013年科罗拉多州前岭洪水”。我们仅仅通过可视化数据就发现了这一联系。

总结

本节课中,我们一起学习了如何通过自定义可视化来洞察数据。您可以定制图表的众多属性,添加标题、标签等。当需要进行比较时,您还可以在同一图表中包含多个数据集。可视化结果在探索阶段尤其有用,并且在您开始向他人传达结果时也至关重要。

模块4:执行计算总结

在本节课中,我们将回顾模块四“执行计算”的核心内容。您已经学习了如何使用MATLAB对数据进行基础运算、统计分析、关系探索以及可视化呈现。

🎼 模块四总结

您已经完成了模块四的学习。接下来是模块测验。

让我们回顾一下您在本模块中学到的知识。

基础运算与函数

您首先学习了在MATLAB中对标量和向量执行基础运算。

接下来,您学习了如何使用MATLAB函数,这些函数能帮助您完成多种任务。

数据描述与关系探索

然后,您学习了如何使用MATLAB中的描述性统计函数来深入了解数据中包含的值。

在充分理解数据后,您开始通过使用相关系数来寻找变量之间的关系。

数据索引与条件操作

您学习了如何访问向量、矩阵和表格中的元素。

同时也看到了如何在选择或替换变量中的元素时应用条件。

分类数据与分组统计

您了解了分类数据,以及如何执行分组统计计算,以描述组间差异并进一步检测变量之间的关系。

数据可视化

最后,由于可视化有助于向他人传达分析的细节,您学习了如何自定义图形以及如何在同一个图形中呈现多个数据集。

总结与展望

现在您已经知道如何使用MATLAB对数据执行基础计算和分析。事实上,您可以复现前面提供的实时脚本中展示的许多计算和可视化。

您已准备好开始向他人展示您关于数据的所有发现,这将在下一个模块中涉及。

模块测验

现在是时候通过参加模块四测验来测试您的技能了。

请遵循测验页面上的设置说明,以便在MATLAB中访问所需的文件。

使用并完成提供的实时脚本来回答问题,如果需要帮助,请记得查看论坛。

本节课中,我们一起回顾了使用MATLAB进行数据计算与分析的全过程,从基础操作到高级可视化,为后续的数据呈现与沟通打下了坚实基础。

第35章:记录你的工作 📝

在本节课中,我们将学习如何使用实时脚本(Live Scripts)来记录和分享你的数据科学项目。

记录工作是任何数据科学项目的重要组成部分。首先,它允许你复用自己过去的工作。你经常遇到的新数据集,其格式可能与你之前处理过的数据相似。或者,你可能会在新的数据上复用旧的模型。因此,重新发明轮子通常没有必要。通过记录你做了什么、为什么这么做、哪些方法有效以及哪些无效,更新旧代码的过程会变得容易得多,并且可以避免重复犯错。

其次,你的文档将使他人能够复现你的结果并复用你的代码,甚至可以将你的解决方案部署为自动化系统。正如你可能已经知道的,理解他人的代码可能非常具有挑战性。为同事提供关于你的代码和方法论的描述,将使他们的工作轻松许多。

最后,通过记录你的分析,你不仅可以向同事提供指标、模型和可视化结果,还能让他们对你的结果和结论的可靠性充满信心。特别是,制作有意义的可视化图表和清晰的摘要,以帮助非技术背景的同事理解你的结果,是每位数据科学家必备的核心技能。

在实时脚本中包含交互式元素,可以让你的同事即使不懂编程,也能探索和扩展你的工作。正如你所见,实时脚本能帮助你记录自己的工作,并创建丰富的交互式演示文稿与他人分享。现在,让我们开始学习如何有效地传达你的结果。

本节课中,我们一起学习了记录数据科学工作的重要性,以及使用MATLAB实时脚本进行记录和分享的核心优势。

36:创建直播脚本 📝

在本节课中,我们将学习如何在MATLAB中创建“直播脚本”。直播脚本允许你将代码、分析结果和文字说明整合到一个交互式文档中,非常适合用于记录分析过程、创建报告或与他人分享你的工作。

概述

直播脚本由文本块和代码块组合而成。文本块用于添加格式化的文字、图片、公式和超链接,而代码块则包含可执行的MATLAB代码和注释。通过结合这两者,你可以创建一个既能运行分析又能清晰解释分析步骤的动态文档。

创建新直播脚本

首先,你需要创建一个新的直播脚本。在MATLAB的“主页”选项卡中,点击“新建直播脚本”。这将打开一个空白的直播脚本编辑器。

你会注意到界面发生了变化,出现了新的“直播编辑器”选项卡。工具条上的许多图标都提供了创建脚本所需的功能,你可以将鼠标悬停在图标上查看其功能说明。

设置工作环境

在开始创建脚本之前,请确保设置正确的当前文件夹。我们将使用2013年的风暴事件数据以及之前创建的数据导入函数,因此请将包含这些文件的文件夹设置为当前文件夹。

加载与探索数据

现在,可以开始加载数据了。将加载数据的代码添加到直播脚本的代码块中,然后点击“运行”。

由于我们在代码行末尾没有添加分号,变量的预览将显示在右侧的输出窗格中。

我们还没有一个具体的问题要回答,所以让我们先探索数据集,寻找值得深入研究的点。

热力图是可视化两个变量之间潜在关系的绝佳方式。让我们看看按月份划分的事件类型分布。点击“运行”以执行代码并查看输出。

默认情况下,结果会显示在右侧的单独窗格中,但你也可以选择将其改为内联显示。要更改此设置,请点击“视图”选项卡,然后选择“内联输出”。输出位置可以随时更改,并且会应用于文档中的所有输出。你可以尝试一下,看看更喜欢哪种视图。

添加分析与注释

在分析数据时,你可以开始添加你的想法和发现,这样任何查看直播脚本的人都能理解你所做的工作。

文本块可以通过将光标置于所需位置并点击“文本”来添加。你可以更改文本的格式来创建标题、副标题和列表。让我们也将标题居中。

使用分节功能

你还可以将代码分成多个节,然后单独运行某一节的代码。这在开发和测试代码时特别有用。

在这里,前几行代码加载并准备用于分析的数据。加载数据需要时间,但只需要执行一次。通过在“将月份按顺序排列”这行代码之后插入一个分节符,你可以更高效地迭代分析代码。

要插入分节符,请将光标定位,然后在工具条中点击“分节符”。

通过清除所有输出,然后逐节运行代码来测试这个功能。点击“视图”选项卡,选择“清除所有输出”。然后将光标放在第一节,点击“运行节”。注意,代码运行后,左侧的蓝色条会变成实心。

现在将光标放在第二节。注意左侧的条是条纹状的,表示此节中的代码尚未运行。点击“运行节”再次显示热力图。

优化可视化

这张热力图包含大量数据,可能难以查看和解读。你可以通过调整输出显示面板的宽度来将其放大。

如果仍然难以看清,你可以将热力图在新图形窗口中打开:将鼠标悬停在热力图上,当坐标轴工具栏出现时,点击“在图形窗口中打开”。

深入分析数据

这很有趣。夏季月份发生了大量的冰雹事件。同期也有许多雷暴大风事件。也许这两类事件是相关的。

这两类事件都有纬度和经度值,因此你可以创建地理密度图来查看事件是否集中在相同的地点。

添加显示冰雹事件的代码并点击“运行节”。这些事件似乎主要集中在美国中部。

现在加入雷暴大风的代码并重新运行该节。在地图上没有明显的关联,因为这些事件似乎主要集中在美国东部。

记录发现

这是一个更新直播脚本、总结你发现的好时机。你可以添加一个注释,说明你为何查看这些事件以及观察到了什么。

下一步可能是查看特定州的数据。让我们为此创建一个新节。你可以重用之前的代码,并在逻辑索引中添加第二个条件,以选择发生在单个州(例如德克萨斯州)的事件。更改完成后,点击“运行节”。

聚焦特定区域

这张图显示了一些值得进一步研究的区域。例如,阿马里洛周围的这个集群。

但是如何只选择这些事件呢?

一种方法是查看距离阿马里洛特定距离内的风暴。你可以使用哈弗辛公式,利用数据中包含的纬度和经度值来计算这个距离。

许多人可能不熟悉这个公式。你可以将公式添加到直播脚本中,并包含一个指向参考页面的超链接。

公式通过“插入”选项卡添加到文本块中。首先,放置光标。然后展开公式图标下方的菜单并选择“公式”。将打开一个新选项卡,其中包含可帮助你使用预定义符号和结构交互式构建公式的选项。

例如,这个结构允许你添加正弦平方项。你还可以通过将一个结构嵌套在另一个内部来组合结构,比如在分数周围加上括号。这个符号将添加点以表示乘法。完成后,点击公式编辑器外部即可退出。

要添加超链接,请高亮显示文本,点击“插入”选项卡上的“超链接”,然后粘贴URL。

应用公式筛选数据

你可以将计算出的距离作为新变量添加到表中,并使用条件表达式来选择所需的事件。在这里,你正在检查距离德克萨斯州阿马里洛8公里(约5英里)以内的事件。

选择数据后,你可以按任意方式将其可视化。由于你对事件彼此间的时间关系感兴趣,可以考虑显示一个表格,或者也许另一张热力图。

在这里你可以看到,在5月28日,发生了多次冰雹和雷暴大风事件。

大风事件首先被记录,时间跨度为一小时。大约五小时后开始,在40分钟的时间跨度内记录了多次冰雹事件。

你可以检查其他城市和州,但在这一点上,你可以总结你的发现。

最终整理与分享

在最终确定文本并按需组织直播脚本后,你就可以准备与他人分享了。请务必保存最终版本。

请注意,如果展开“保存”菜单,你可以选择将直播脚本导出为各种常见文件格式。

例如,选择PDF将创建一个包含文本、代码和输出的新文档,任何人都可以查看。

总结

本节课中我们一起学习了如何创建和使用MATLAB直播脚本。总结如下:

  • 直播脚本让你能将可运行的代码与格式化的文本结合起来。
  • 你可以添加格式以创建报告并与他人分享。
  • 导出为多种格式的能力使你能够将分析分发给无法访问MATLAB的人。

现在,你已经准备好学习如何通过控件使你的脚本具有交互性。

37:为直播脚本添加交互式控件 🎛️

在本节课中,我们将学习如何为MATLAB Live Script添加交互式控件,使数据分析过程更加灵活和高效。通过将硬编码的变量替换为控件,用户无需修改代码即可快速探索不同的数据子集和分析参数。

概述:为何需要交互式控件?

让我们回顾一下之前用于分析2013年冰雹和雷暴风数据的直播脚本。该数据集包含近6万个条目,但脚本仅分析了德克萨斯州阿马里洛附近的少数事件。

如果用户想探索其他城市或州的事件,或者想调查其他事件类型,该怎么办?通过添加交互式控件,我们可以让他人无需重写代码就能快速探索数据差异,从而使分析更具交互性。

为数据文件选择添加下拉菜单

上一节我们介绍了交互式控件的概念,本节中我们来看看如何具体实现。一个典型的应用场景是在代码的第一行加载数据集。原脚本加载的是2013年的数据。分析者可能希望在其他年份的数据上运行相同的分析。

通过将硬编码的文件名替换为交互式控件,只需点击几下即可探索其他年份的数据。

以下是可添加到直播脚本中的几种控件类型。您可以通过点击“Live Editor”选项卡并展开“Control”菜单来查看可用选项。

  • 下拉菜单:最适合用于选择要加载的数据文件。

现在,让我们将当前文件名复制到剪贴板,以便将其添加到控件选项中。然后删除原名称,并在其位置添加一个下拉菜单。此时会弹出控件配置菜单。

以下是配置下拉菜单的步骤:

  1. 在“Item Labels”下,列出用户将看到的选项标签。
  2. 在“Item Values”下,列出每个标签对应的实际值。
  3. 标签和对应的值可以不同,因此使用年份作为标签、使用完整的文件名作为值是可行的。
  4. 为2013年和2014年添加条目。

默认情况下,与控件交互会自动运行其所在的代码段。您可以在配置菜单底部将默认行为更改为其他可用选项。

由此可见,分节符对于控制执行哪些代码非常重要。在考虑代码中何处插入分节符时,请思考在选择后希望发生什么。在本例中,我们选择“Run all sections”。配置完成后,点击菜单外部即可返回直播脚本。

通过选择“2014”来测试控件。结果应该与2013年类似。下拉菜单使得切换数据文件变得非常容易。

使用编辑字段控件输入位置信息

第二个下拉菜单也可用于从预定义列表中选择事件类型或州。然而,有些变量的选择范围更开放。例如,在探索过程中,您可能希望查看德克萨斯州阿马里洛以外地区的事件。

您可以使用编辑字段控件来捕获任何位置的纬度和经度。虽然用户可以直接修改代码,但在此处添加控件可以使用户更清楚地知道应在脚本的何处进行修改。

让我们修改代码,使其更易于用户理解他们应该做什么。

首先,创建两个新变量:latlon

lat = [在此处添加编辑字段控件];
lon = [在此处添加编辑字段控件];

在等号右侧,放置一个编辑字段控件。变量将被赋值为输入到编辑字段中的任何值。

由于纬度和经度变量是数值型的,请将“Data Type”设置为“double”。对于“Execution”选项,请考虑用户在此处的操作。每当城市更改时,这两个值都必须更新,因此在一个编辑字段被修改后运行脚本的任何部分都是没有意义的。由于用户可以按任何顺序更新字段,因此在此场景下,“Do nothing”可能是最佳选择。

完成每个控件的配置后,点击外部返回直播脚本。您可以通过输入阿马里洛的纬度和经度值来预填充编辑字段。

请记住,这些坐标用于计算每个天气事件与城市之间的距离。

使用数值滑块调整分析距离

目前,直播脚本硬编码为选择距离城市8公里(或5英里)以内的事件。这个距离是任意选择的。用户可能希望修改此值,而数值滑块提供了一种简单的方法。

删除当前分配给变量 D 的值,并从控件菜单中将其替换为数值滑块。

控件配置菜单允许您设置滑块的最小值、最大值和增量。您应该使用能引导用户获得有意义结果的数值。

例如,您可能想将最小值设置为零,但指定零距离将导致没有事件被选中。因此,让我们使用最小值为5公里,最大值为100公里,步长为5公里。

对于“Execution”,选择“Current section to End”。这样,当用户调整滑块时,他们将看到更新的结果,这很可能是他们想要的。对于滑块,您还可以决定何时触发代码执行:是在滑块活动时,还是在用户停止使用它之后。本部分中的一些绘图需要几秒钟才能生成,因此最好在选定最终值后运行代码,所以请选择“Value changed”。

现在让我们测试一下。返回直播脚本并调整滑块。也许100公里作为最大值太高了,热图会因此变得难以阅读。不过这很容易修复,您可以通过右键单击滑块并选择“Configure Control”来修改控件。让我们将最大值改为50。

现在将滑块设置为10公里,使热图结果与2013年的结果具有可比性。

总结与展望

在本节课中,我们一起学习了如何为MATLAB Live Script添加交互式控件。添加控件使天气数据分析更快、更容易。以前,您必须找到所需的代码行并手动更新值。现在,这些位置非常突出,并且控件会帮助您选择合适的值。此外,您可以在进行更改时自动重新运行代码段,从而进一步简化数据探索。

现在您已掌握了创建自己的直播脚本所需的技能。在本模块结束时,您将创建自己的脚本。请思考如何利用交互式控件快速探索数据并找到问题的答案。

39:探索性数据分析总结 🎯

在本节课中,我们将总结第一门课程的核心内容,回顾如何使用MATLAB进行探索性数据分析,并展望下一阶段的学习目标。


恭喜你完成了MATLAB实用数据科学的第一门课程。快速探索大量数据的能力是一项重要技能。创建可视化图表、筛选数据以及计算分组统计量,将帮助你回答许多关键问题。

在展望第二门课程之前,让我们先回顾一下到目前为止所学的内容。

你现在已经能够处理一个新的数据集,并回答“发生了什么?”这个问题。

为了做到这一点,你遵循了几个步骤。以下是完成探索性数据分析的关键流程:

  1. 导入数据:首先,你使用MATLAB的导入工具将数据导入工作区。该工具允许你交互式地选择数据导入方式,并能在未来自动化此过程。这听起来可能很简单,但没有数据,任何分析都无法开始。
  2. 探索与可视化:接下来,你学习了如何使用交互式工具创建可视化图表和筛选数据。这是开始探索新数据集并寻找潜在关系的方法。与导入过程一样,重复这些步骤所需的代码会被自动捕获,从而加速未来的分析。
  3. 计算与分析:在了解数据内容后,你接着学习了如何计算统计量并寻找变量之间的相关性。此时,你不仅能回答“发生了什么”,还能开始探究“为什么会发生”。
  4. 整合与呈现:最后,你将所有概念整合在一起,对特定事件创建了一个完整的分析。你的最终分析不仅仅是文本、代码和图表的堆砌,它讲述了一个关于“发生了什么”的故事,有助于为未来的决策提供信息。

那么,第二门课程将包含哪些内容呢?让我们听听将带领你学习第二门课程的Adam的介绍。

感谢Aaron。你已经取得了很大成就,但在许多数据科学应用中还需要额外的技能。

例如,如果你需要合并多个数据文件该怎么办?如何处理有噪声的数据和异常值?如何利用你的数据进行预测?

请加入我们的专项课程第二门课,我们将涵盖这些主题以及更多内容。


总结

本节课中,我们一起学习了探索性数据分析的完整流程。你掌握了从数据导入、交互式探索、统计分析到最终报告呈现的核心技能。这些技能是回答“发生了什么”和“为什么会发生”的基础。在下一门课程中,我们将在此基础上,学习处理更复杂的数据挑战,例如数据整合、清洗和预测建模。

1:课程概述 🎯

在本节课中,我们将要学习MathWorks《实用数据科学与MATLAB》专项课程的总体介绍。我们将了解数据科学的重要性、MATLAB工具的优势以及整个专项课程的学习路径。


你可能听说过数据科学正在彻底改变医疗保健、汽车、消费电子等众多领域。实际上,几乎每个行业都受到了影响。如果你正在考虑学习这个专项课程,你很可能已经看到了数据科学在你自身领域的潜力。

无论你身处哪个领域,掌握扎实的数据科学技能都能让你脱颖而出,并帮助你将原始数据转化为有意义的结果。这就是MathWorks创建《实用数据科学与MATLAB》专项课程的原因。完成这个专项课程将赋予你快速取得实际成果所需的技能和信心。

在整个专项课程中,你将使用MATLAB。

MATLAB是数百万工程与科学专业人士的首选工具,它提供了完成数据科学任务所需的能力。MATLAB使用熟悉的数学符号,并附带图形化应用程序,帮助你快速迭代常见的分析任务。这些应用程序减少了进行有意义的数据科学工作所需的时间,并帮助你立即开始处理数据。



你了解你的领域,也了解你的数据。借助正确的工具和一些实践,你可以构建能够基于数据中的模式进行准确预测的模型。这类技术对于任何希望保持竞争力的公司都至关重要。

完成这个专项课程后,你将能够使用你的数据构建预测模型。这是当今雇主最需要的高需求职业技能之一。


课程一:数据探索 📊

在四门课程专项的第一门课程中,你将学习如何使用MATLAB中可用的图形化工具来探索数据。你将生成可视化图表并执行常见的统计分析。

这门课程旨在成为所有技能水平学习者的入门点。图形化工具使你能够快速尝试不同的技术和可视化方法。

你所执行操作对应的代码会显示在屏幕上,帮助你学习MATLAB语言并开始自己编写完整的脚本。


课程二:数据预处理与特征工程 🔧

上一节我们介绍了数据探索,本节中我们来看看如何为建模做准备。在第二门课程中,你将在基础上更进一步,增加为后续探索和建模而对数据进行预处理的关键技能。

完成这门课程将使你能够整合来自不同来源的数据,去除不需要的干扰(如异常值和缺失数据点),并开始构建用于分类和回归的基本模型。

这门课程还探讨了你可能会遇到的特定数据类型。

以下是几种常见的数据类型:

  • 音频信号
  • 图像
  • 文本

即使你并非每天处理这类数据,当需要时,你仍然有机会应用相关的概念和应用程序。


课程三:机器学习建模 🤖

当你进入第三门课程时,你将准备好开始使用MATLAB应用程序构建机器学习模型。你将尝试多种不同的建模技术和参数。

当你找到喜欢的组合时,你将构建一个模型并用它进行预测。与任何新技能一样,数据科学成功的关键在于实践。


课程四:毕业项目 🏆

专项课程的最终毕业项目涵盖了完整的数据科学工作流程。


你将应用专项课程中所有课程学到的技能来构建一个预测模型。

你将与同伴合作评估模型,更重要的是,从他们独特的视角中学习。


准备好开始构建实用的数据科学技能,以便在你的组织和行业中发挥作用了吗?很好,让我们开始吧。


本节课中我们一起学习了《实用数据科学与MATLAB》专项课程的概览。我们了解了数据科学的广泛应用价值、MATLAB作为工具的直观与高效特性,以及从数据探索、预处理、机器学习建模到最终毕业项目的完整学习路径。这个专项课程旨在通过实践,帮助你快速掌握将数据转化为洞察和预测模型的关键技能。

1:数据处理和特征工程概述 🎼

在本节课中,我们将要学习数据科学工作流程中的两个核心环节:数据处理与特征工程。我们将了解如何将原始数据转化为可用于构建预测模型的有组织形式,并探讨如何利用领域知识从数据中提取更有价值的特征。

大家好,我是Adam Philian,欢迎来到本课程。在接下来的五个模块中,你将学习如何将原始数据转化为强大的预测模型。

首先,你需要将原始数据转化为有组织且可用的形式,这个过程被称为数据预处理。这包括一系列任务。

以下是数据预处理可能涉及的任务:

  • 整合多个数据源。
  • 修正无效条目。
  • 在不同数据类型之间进行转换。

例如,假设你正在全球范围内追踪一种疾病。你很可能会从每个受影响的国家收集多个数据集。每个数据集都有自己的报告方法、诊断程序、测量标准,甚至可能使用不同的语言。在开始寻找全球趋势之前,你需要进行大量的数据预处理工作。

上一节我们介绍了数据预处理,本节中我们来看看数据准备好之后的下一步。

数据准备就绪后,就可以开始特征工程的过程。这涉及利用你的领域知识,在数据中寻找有用的特性或特征。这些特征随后可以表示为新的变量,用于预测模型。

如果你不熟悉预测建模,可以考虑以下例子。你是否曾制作过预算电子表格,以帮助你了解何时能攒够钱支付一笔大额开销,比如一次豪华度假?那么你已经有过一些构建预测模型的体验了。

在数据科学中,模型是对数据的数学描述,它使你能够预测系统将如何行为,从而根据数据做出明智的决策。

让我们从头到尾走一遍这个流程的示例。想象你是一位气象学家,负责在你所在的地区发布极端低温预警。

你首先需要组织和清理数据,其中包括过去几十年的天气读数。

在此基础上,你可以构建一个温度波动的回归模型,用于预测未来的温度。如果你的模型预测将出现极端寒冷天气,那么你就发布预警。但是,你能做得更好吗?

事实证明,实际温度并不是决定室外体感寒冷的唯一因素。一个更好的衡量标准,也是特征工程的一个例子,是风寒指数。气象学家使用一个结合了实测温度、风速和湿度的公式来计算风寒指数。

公式示例:风寒指数 = f(温度, 风速, 湿度)

现在,你可以将风寒指数作为一个新特征添加到你的模型中,从而更好地决定是否发布寒冷天气预警。

尽管特征工程听起来可能很复杂,但正如你所见,你可能已经熟悉了这个概念。在本课程的最后一个模块中,你将把特征工程技能应用到一些常见的数据类型上。

以下是常见的数据类型示例:

  • 图像
  • 文本
  • 音频或其他信号

在整个课程中,你将把预处理、特征工程及相关概念应用到一个新的数据集上,该数据集将在第一个模块中引入。

如果你有任何问题或有用的技巧要与同伴分享,请别忘了使用讨论区。

让我们开始吧。

本节课中我们一起学习了数据预处理和特征工程的基本概念。数据预处理是将杂乱原始数据整理规范化的必要步骤,而特征工程则是利用专业知识创造更有预测力的新变量,两者共同为构建有效的预测模型打下坚实基础。

2:教师介绍 👨‍🏫

在本节课中,我们将认识本系列课程的教师团队。了解他们的背景、专业领域以及与MATLAB和数据科学相关的经历,有助于我们更好地理解课程内容的设计思路。

大家好。我是Adam Philllian。我是Heather Gore。我是Brendan Armstrong。我是Er Burnne。

我是MathWorks的在线课程开发人员。我是MathWorks的产品经理。我是MATLAB和数据科学领域的技术产品营销经理。我是MathWorks的在线内容开发人员。

我从小就是一个科学爱好者。我在四年级时最大的梦想是成为一名迪士尼幻想工程师。我于2004年在弗吉尼亚理工大学攻读航空航天工程学士学位时开始使用MATLAB。我在研究和教学中使用MATLAB已超过10年。我第一次接触MATLAB是在攻读物理学博士学位期间购买了学生版。我主要使用MATLAB来可视化数据并拟合简单模型。我第一次使用它是在哈维穆德学院攻读工程学期间。我博士期间的主要项目是关于生物流体模式识别的机器学习。那非常有趣。我的研究生研究集中在一种称为“晕轨道”的领域。我在该领域的研究涉及寻找从低地球轨道到这些晕轨道的最优转移轨迹。自然地,我用代码实现了它。

在MATLAB中,最近一个很酷的项目是部署用于实时预测的机器学习模型。我在MATLAB中创建了信号处理和机器学习算法。然后我在云上的流式架构中使用了这些预测。我的职业生涯始于航空航天工程师。我为卫星和星际任务(包括火星探测漫游者)进行系统级设计和分析。在MathWorks,我的职责是帮助其他人学习如何将机器学习、深度学习和数据科学应用到他们的工作中。我与我们的开发组织合作,确定接下来要构建哪些新的数据科学工具。基本上,我的全部工作就是帮助像您这样的人开始并熟练地将MATLAB用于您的应用。我曾经是一名专业的摇摆舞者。我是一名音乐家。

我弹吉他、打鼓,也喜欢唱歌和创作音乐。我认为我对音乐的热情确实对我的职业生涯有所帮助,因为我很有创造力,并且能从不同角度思考问题,这在数据科学中很重要。我开始涉足一些天文摄影。我最喜欢的一张是从邻居家车道上拍摄的猎户座星云照片,因为我的院子视野不够好。实际上,我在业余时间也会使用MATLAB,我只是喜欢摆弄数据。我每天早上第一件事就是打开MATLAB,在查看邮件或做任何事之前,在开始一天的工作之前,我都会有一段“MATLAB时间”。我非常高兴能在这个系列课程中与您分享我的一些经验和来之不易的教训。我希望您能看到MATLAB如何帮助像您这样的领域专家在数据科学领域表现出色。


本节课中,我们一起认识了本课程的教师团队。他们来自MathWorks的不同岗位,拥有工程、物理、数据科学等多元背景,并且都长期使用MATLAB解决实际问题。他们的个人兴趣,如音乐和天文摄影,也体现了创造力与多角度思维在数据科学中的价值。了解他们的经历,有助于我们建立对课程内容的信任,并期待他们分享的实践经验。

模块1:数据探索与分析介绍 🎼

在本模块中,我们将学习数据科学流程中的第一步:数据探索与分析。我们将回顾探索性数据分析的核心概念,并使用一个关于2015年美国国内航班的新数据集进行实践。这个数据集包含了航班调度、飞机、机场以及飞行结果等详细信息。

首先,我们将从回顾探索性数据分析开始。你将探索并可视化这个新的数据集。

上一节我们介绍了数据探索的初步工作,本节中我们将深入分析数据的统计特性与分布。你将学习如何计算和解读数据的统计属性。

了解了数据的基本统计特性后,接下来我们看看如何将数据的分布与常见的统计分布进行比较。这有助于我们理解数据是否符合某些理论模型。

除了与理论分布比较,我们还需要一种方法来同时比较多组数据的统计特性和分布。以下是实现这一目标的有效工具:

  • 你将学习使用箱线图来图形化地一次性比较多组数据的统计特性和分布。

最后,我们将分析多维数据中的联合分布与相互关系。以下是本部分将涉及的内容:

  • 你将使用多种额外的可视化技术来分析多维数据中的联合分布与相互关系。

让我们开始吧。

本节课中我们一起学习了探索性数据分析的完整流程,包括数据集的初步探索、统计特性分析、分布比较以及多维数据关系的可视化。这些技能是进行有效特征工程和机器学习建模的重要基础。

4:航班数据集简介 🛫

在本节课中,我们将要学习本课程将使用的主要数据集——美国交通部的航班准点性能数据集。我们将了解其结构、内容以及如何导入和初步处理数据。

现在你已经下载了课程文件并设置好了环境,让我们来看看本课程将使用的主要数据集。


你获得的是美国交通部航班准点性能数据集中2015年的数据。

从现在开始,我们将其简称为航班数据集。

这个数据集记录了2015年全年美国所有国内商业航班的信息。

这包含了超过580万次航班。这类数据在现实世界中有许多应用。例如,航空公司可以利用这些数据来减少延误和取消,在繁忙时段和节假日分配资源,或者识别增加新航班的机会。

让我们开始查看原始数据,以了解其中包含的内容。首先,导航到包含数据的文件夹。这里有12个以“Flights”为前缀的文件,包含了2015年全年的所有数据。

这些文件按月分割,因此 FlightsJan.csv 记录了1月份的航班。

还有一个名为 Airports.csv 的文件,其中包含美国机场的信息,如名称、城市、州,以及经纬度坐标。稍后,你将看到如何将这些信息与航班数据结合,以描述航班的去向。

使用导入工具打开文件 FlightsJan.csv

这些数据是一个表格,顶部有多个列,列名是变量名。表格中的每一行代表一次单独航班的记录,而每一列则是关于该航班的不同信息片段。

以下是数据集中包含的主要信息类别:

  • 日期信息:航班日期由前三列指定:YearMonthDayofMonth
  • 航班标识信息:例如 Airline(航空公司)、TailNum(尾号)和 FlightNum(航班号)。尾号是分配给每架飞机的唯一ID,类似于车牌号。
  • 机场信息Origin(起飞机场)和 Dest(目的地机场)列。这里的值是三个字母的代码,可用于在机场文件中查找信息。
  • 时间信息:一系列关于航班起飞和到达时间的列。在两种情况下,都有计划时间和实际时间的记录。

计划时间变量带有前缀 CRS,代表计算机预订系统。这个缩写含义不直观,但请记住你可以在导入工具中更改变量名。例如,你可以将变量名 CRSDepTime 更改为更具描述性的 ScheduledDepartureTime。同样,DepTime 列可以更改为 ActualDepartureTime。使用描述性变量名是良好的实践。

计划时间和实际时间之间的差异体现在 DepDelay(起飞延误)列中。这里的值是两者之间的分钟差。公式DepDelay = ActualDepartureTime - ScheduledDepartureTime。正数意味着航班晚点(在计划时间之后起飞),而负数意味着航班提前(在计划时间之前起飞)。

还有其他列的单位也是分钟,例如 TaxiOut(滑出时间)、AirTime(空中飞行时间)和 TaxiIn(滑入时间)。它们分别代表飞机离开登机口后起飞所需的时间、在空中飞行的时间以及降落后到达到达登机口所需的时间。当你将这三个值相加时,就得到了 ActualElapsedTime(实际经过时间)列中的值。

表格还包括其他几列有趣的信息,例如 Cancelled(取消航班)。请查看本视频后的阅读材料,了解每列的描述。

让我们关注时间变量列,这些列起初可能难以解读。你可以看到起飞时间是有四位数字的数字,有些以0开头。这是航班起飞的一天中的时间,使用24小时制。例如,数字 0804 指的是上午8:04。像 2245 这样的大数字,指的是晚上10:45。这可能看起来令人困惑,但别担心,在未来的课程中,你将看到如何将此类值转换为 datetime 值,这将使分析变得容易得多。

当你准备好导入数据时,回想一下,你可以使用导入工具自动生成一个函数,使你能够轻松重复导入过程。尝试选择几列并生成一个函数。这将在编辑器中打开一个函数文件,你可以保存该函数并重用它来导入任何航班文件。

向此导入函数添加代码会非常有帮助,这样你就不必一遍又一遍地重复某些任务。例如,如果你确定某些缺失行应该用特定值替换,你可以将该代码添加到此函数中。然后,每次你将数据加载到MATLAB时,这段添加的代码都会运行。

事实上,已经为你提供了这样一个函数。打开课程文件中名为 importFlightsData 的函数。你可能认出来,这个函数的顶部是由导入工具生成的代码。下面是为了各种清理任务(例如创建 datetime 变量)而添加的额外代码行。如果你现在不理解代码,请不要担心,到本课程结束时,你应该能够回到这个函数并理解各个步骤是如何工作的。

通过打开一个实时脚本并使用 importFlightsData 来导入 FlightsJan.csv 文件,亲自尝试这个函数。你现在应该在工作区中有一个新表格。让我们通过在变量编辑器中打开表格来查看其值。

这个表格与你刚才看到的原始数据相似,但有一些重要区别。你可能会注意到 YearMonthDayofMonth 列已被移除。这是因为这些信息现在已被合并到 datetime 变量中。此外,正如你之前看到的,几个变量已被重命名以更具描述性。四个 datetime 变量现在被命名为 ScheduledDepartureTimeActualDepartureTimeScheduledArrivalTimeActualArrivalTime。有几列也重新排序了。例如,AirTime 被移到了 TaxiOutTaxiIn 之间。

但不要让别人做出的选择说服你他们已经找到了准备数据集的最佳方法,其中很多可能取决于个人偏好。随着你了解更多关于组织和清理数据的知识,你应该尝试定制自己的导入函数。这是处理复杂数据集的绝佳实践。

显然,航班数据是复杂的。它是混乱的,就像大多数现实世界的数据一样。当发现数据的另一个特性时,importFlightsData 中的额外清理代码不得不多次修订。但正是因为这种混乱,这个数据集提供了许多绝佳的机会来演示组织和清理任务。

在本节课中,我们一起学习了本课程的核心数据集——2015年美国航班数据集。我们了解了其庞大的规模、现实应用、数据结构(包含日期、航班标识、机场、时间、延误等列),并初步探索了如何使用导入工具和预定义的 importFlightsData 函数来加载和初步清理数据。到本课程结束时,你将能够为你自己的混乱数据文件做好准备,用于建模和可视化。

5:探索航班数据集

在本节课中,我们将学习如何运用探索性数据分析(EDA)的方法来研究一个航班数据集。我们将从数据导入和可视化开始,逐步分析航班时长、延误原因以及航班取消情况,并在这个过程中练习使用MATLAB的相关函数。

数据导入与机场位置可视化

上一节我们介绍了探索性数据分析的基本概念,本节中我们来看看如何将其应用于一个具体的航班数据集。

首先,我们需要将包含机场信息的CSV文件导入工作区。使用导入工具可以完成此操作。

由于数据中包含了纬度和经度信息,我们可以使用 geoscatter 函数将它们绘制在地图上。

从图中可以看到,美国及其领土范围内分布着322个商业机场。你可以使用坐标轴工具栏来放大查看特定区域,例如美国本土。

对应的代码会自动生成,点击“更新代码”即可将其添加到脚本中。

分析航班时长分布

在任何一天,这些机场之间都有成千上万的航班。有些是短途航班,如波士顿和纽约市之间;有些则横跨整个美国。那么,短途航班和长途航班哪个更常见呢?

为了找出答案,首先需要使用之前介绍的自定义导入函数导入其中一个航班CSV文件。我们加载二月份的数据。在数据表中可以看到所有变量。

ScheduledElapsedTime 变量表示航班预计的飞行时长(分钟)。我们可以从绘制这些时间的直方图开始分析。

从X轴可以看出,虽然有些航班计划飞行时间长达800分钟,但大多数航班的计划时间都少于200分钟。

因此,短途航班显然更为常见。

比较计划与实际飞行时间

那么,与计划时间相比,航班实际飞行了多久呢?这个信息包含在 ActualElapsedTime 变量中。

为了计算两者的差异,我们可以用实际时间减去计划时间,并将结果作为新列添加到表中。计算公式如下:

DurationDifference = ActualElapsedTime - ScheduledElapsedTime

结果为负值表示航班实际用时少于计划时间。

接下来,创建一个直方图来可视化这个差异。看起来大多数航班都按计划时间准确执行,但有些航班比预期多花了200多分钟。这是为什么呢?

探究延误原因

也许那些航班在空中花费了更多时间。为了调查是否存在相关性,可以绘制空中飞行时间与时长差异的散点图。

😊,这两个变量之间似乎没有任何关系。那还可能是什么原因呢?

实际上,总飞行时间是滑出时间、空中时间和滑入时间的总和。那么,总滑行时间与时长差异的关系图是怎样的呢?

可以看到这些变量之间存在关系。你可以通过计算相关系数来量化这种关系的强度。在MATLAB中,可以使用 corr 函数:

correlation = corr(TotalTaxiTime, DurationDifference, ‘Rows’, ‘complete’)

最初的计算结果 NaN 意味着这些变量包含缺失值。可以通过指定选项仅考虑完整的行来忽略缺失值。

看起来存在相当强的相关性,这表明计划与实际飞行时间之间的差异很大程度上受到滑行时间的影响。

分析航班取消情况

好了,我们回答了一个问题,但在这个过程中又发现了一些新问题。例如,NaN 条目何时出现?查看航班表可以发现,每个航班都有计划起飞时间,但有些没有实际起飞时间。那些计划起飞但实际未起飞的航班被归类为“取消”。当这种情况发生时,航班表中的 Cancelled 变量被赋值为1。

为了更方便地探索这组数据,将所有被取消的航班提取到一个新表中。数据显示,2015年2月共有20,517个航班被取消,这几乎是该月国内航班的5%,是全年其他月份取消率的四倍多。

没有人喜欢听到航班被取消的消息,因此让我们来确定取消发生的时间和地点,以便更好地理解这个问题。

航班取消是普遍现象,还是在特定机场更为普遍?你可以使用 groupsummary 函数按机场计算取消的航班数量。

为了找出取消次数最多的机场,可以按降序对结果进行排序。通过查看结果表可以发现,只有少数机场的取消次数超过1000次,大多数机场的取消次数少于100次。这可能是因为大型机场的取消数量本身就更高。

如果是这样,对于一个给定的机场,每天的取消数量应该是相当稳定的。MathWorks总部位于波士顿附近,其机场代码是BOS,让我们检查一下那里的情况。

接下来,再次使用 groupsummary 函数,按起飞日期对数据进行分组。然后使用条形图绘制每天的取消数量。

看起来取消数量并不是恒定的。相反,大多数取消只发生在三天内。事实证明,2015年2月是波士顿有史以来破纪录的一个月,降雪量接近两米。你可以在上一门课程使用的风暴事件数据中找到这些风暴的详细信息。

如果你想接受额外的挑战,可以尝试使用风暴事件数据来解释其他机场的航班取消情况。

总结与后续探索

本次对航班数据集的探索揭示了许多信息,也引发了更多问题。在本课程的大部分互动中,你都将使用这些数据。

为了让你熟悉数据,我们提供了刚刚创建的实时脚本,以便你可以继续自行探索。例如,你可能想看看非冬季月份的取消百分比如何变化。如果你发现了任何有趣的现象,欢迎在课程论坛中分享。

在本节课中,我们一起学习了如何导入和可视化航班数据,分析了航班时长的分布,探究了实际与计划时间差异的原因,并深入研究了航班取消的模式。通过实践,你掌握了使用MATLAB进行探索性数据分析的基本工作流程。

6:描述分布 📊

在本节课中,我们将要学习如何描述数据的分布。除了计算均值、标准差等汇总统计量,理解数据的分布形状对于得出正确结论至关重要。我们将探讨对称分布与偏态分布的区别,并学习四分位距和箱线图等实用工具。

汇总统计量是快速了解数据的有效方法。

但像均值和标准差这样的统计量只能反映数据的一部分信息。

例如,一个新的观测值取值为1或6的可能性有多大?

你可能会猜测,由于6接近均值,它出现的概率很高。

而由于1距离均值超过一个标准差,其出现的概率则低得多。

为了真正做出判断,你需要了解数据是如何分布的。

完成此任务的常用可视化工具是直方图。

现在你可以看到,数据呈均匀分布,即所有可能值出现的概率相等。

因此,一个新的观测值取值为1、6或该范围内的任何值的概率是相等的。

但如果数据呈正态分布呢?现在,一个新的测量值为1的概率远低于为6的概率。

概率在均值附近较高,并随着远离均值而对称地下降。

请注意,数据的均值和标准差没有改变,改变的只是数据的分布。

均匀分布和正态分布都关于其均值对称。因此,均值和中位数大致相等。同时,标准差是描述数据围绕中心离散程度的有用度量。

但正如你在航班数据中已经看到的,许多分布并不对称,而是向左或向右偏斜。以下两个数据集具有与之前相同的均值和标准差。

左偏分布具有小于或位于中位数左侧的均值。

右偏分布具有大于或位于中位数右侧的均值。换句话说,偏斜的方向是数据稀少的方向。数据向左或向右偏移的程度由偏度来捕捉。

对于左偏数据,偏度小于零;对于右偏数据,偏度大于零。

对于偏态分布,使用标准差来描述观测值的离散程度就不那么有用了。

例如,在这个右偏数据中,观测值小于均值的概率为51%,大于均值的概率为35%,等于均值的概率为14%。

描述对称和非对称分布的一个有用度量是四分位距,简称IQR。

四分位距是中间50%的观测值范围。要找到IQR,首先对观测值进行排序,然后找到中位数。

由于中位数是观测值的中间点,它将数据分成两半。

然后找到下半部分的中间值,这个值就是第一四分位数,或Q1。

上半部分的中间值是第三四分位数,或Q3。

IQR是Q3与Q1之间的差值。观察右偏直方图,你能识别出第一和第三四分位数的位置吗?

直方图非常适合观察分布的形状,但可能难以找到中间50%的观测值,特别是对于高度偏斜的数据。

箱线图是另一种有用的可视化工具,用于查看数据是如何分布的。

这个箱线图是垂直方向的,意味着数据集中的值现在位于Y轴上。

箱线图中的箱子包含了IQR,如图所示。

箱子内部的线代表数据的中位数。

图的须线延伸到数据中不被视为异常值的最小值和最大值。

异常值则单独绘制,从而展示数据的完整范围。如你所见,异常值是远离分布中心的观测值,将在后续模块中详细介绍。

因为箱线图的主要特征是四分位距,所以更容易识别分布的中间50%。

你还可以通过观察中位数是否更接近某个四分位数,以及箱子两侧须线的长度来识别偏度。

此外,由于箱线图是一种紧凑的可视化方式,它对于比较分布非常有用。

让我们看看本视频中检查的所有四个数据集的箱线图。

请记住,每个数据集都具有相同的均值和标准差。

你可以清楚地看到均匀分布和正态分布是对称的。

你还可以看到偏态数据集的中位数如何更接近某个四分位数值。

本节课中我们一起学习了描述数据分布的核心知识。除了计算汇总统计量,在从数据中得出结论之前,检查分布的形状至关重要。

数据常常是偏斜的,这使得识别分布中心变得困难。

四分位距是一个有用的度量,因为它定义了中间50%观测值的范围。

箱线图通过突出显示数据的IQR和中位数,帮助你可视化分布的中心。

现在你已经熟悉了描述分布的基础知识,接下来的视频将向你展示如何在MATLAB中应用这些概念。

7:分布示例

在本节课中,我们将通过几个具体的例子,学习如何可视化数据分布并计算描述性统计量。你将有机会学习如何解读这些函数提供的输出结果。

上一节我们介绍了数据中常见的分布类型以及一些用于描述它们的简单指标。本节中我们来看看几个具体的分布示例。

均匀分布示例

让我们从观察均匀分布开始。当所有可能的结果出现的可能性都相等时,就会发生均匀分布。

例如,考虑一个公平的六面骰子,其六个面分别标有数字1到6。如果你模拟了12,000次投掷,并创建结果的直方图,你会看到所有六个数字出现的次数都大约为2000次。

你可以用从观测值计算出的两个统计量来描述这个分布:均值用于指示中心位置,标准差用于描述离散程度。

均匀分布的一个独特特征是它呈矩形,这个特征无法通过上述统计量捕捉到。

正态分布与偏态分布

在大多数数据集中,结果出现的概率随着其与均值距离的增加而减小,导致分布呈现出明显的峰值。当数据关于均值对称分布且呈钟形时,通常被称为正态分布。

均值和标准差提供了对分布形状的洞察。大约三分之二的数据落在均值的一个标准差范围内,而几乎100%的数据落在三个标准差范围内。

让我们考虑之前创建的“时长差”变量。作为提醒,这个变量是通过从实际飞行时间中减去计划飞行时间得到的。

通过创建直方图,你可以看到分布似乎关于峰值(-5分钟)对称。这意味着航班最有可能比计划时间少用5分钟。然而,知道峰值差异并不能告诉你其他值出现的可能性有多大。为此,你需要分布的均值和标准差。通过计算均值的一个标准差范围内的值,你可以确定大约68%的航班的时长范围。

你是否注意到均值不是-5分钟?为什么?你是否注意到X轴延伸到了200?这是因为右侧有一些数据点,除非你放大,否则看不到。这些是比预期时间长很多的航班。

使用峰度函数来获取你的分布与正态分布(峰度值为3)的比较度量。这里的峰度值约为14,这意味着尾部数据比数据呈正态分布时预期的要多。

然而,峰度并不能告诉你数据在两个尾部之间是如何分布的。为此,使用偏度函数。通常,大于+1或小于-1的值被归类为显著偏斜。这里的正值表明该分布是右偏的。因此,尽管乍一看时长差似乎是正态分布,但实际上它是偏斜的。

在直方图中很难看到这一点,因为那些较长航班的计数非常低。因此,每当你遇到长尾分布时,请使用偏度函数来检查你的分布是否偏斜。

箱线图的应用

有时,你感兴趣的是数据及其尾部。一种常用于检查此类数据的可视化方法是箱线图。

在箱线图中,水平红线是时长差的中位数(-5)。箱子显示了四分位距的范围。须的长度可以自定义,但默认情况下,它们延伸到小于箱子高度1.5倍的最后一个数据点。所有须外的数据点都被视为异常值,并被单独绘制出来。正是这些异常值之前很难看到。

当你比较多个数据集时,箱线图的真正威力就显现出来了。例如,如果你想看看在10个最繁忙机场的时长差是什么样子呢?你可以通过将分组变量指定为箱线图函数的第二个输入,在单个图形中创建多个箱线图。

现在,一目了然,你可以看到所有10个机场的中位数和四分位距是相似的。此外,尾部数据的分布使你能够更容易地比较每个机场的异常值数量。

总结

本节课中我们一起学习了如何通过描述性统计量来描述分布。MATLAB提供了内置函数来可视化和总结你的数据。了解如何使用这些函数以及如何解读它们返回的值,有助于你快速分析大量数据。

8:可视化多维数据 📊

在本节课中,我们将学习如何可视化多维数据。我们将探索多种图表类型,包括二维直方图、分箱散点图、散点直方图和热力图,并了解如何通过分组变量或颜色变量为图表增添信息。最后,我们将介绍两种处理高维数据的方法:绘图矩阵和平行坐标图。


上一节我们介绍了常见的分布类型及其属性,也看到了直方图、箱线图和统计量如何帮助我们理解单个变量的值分布。

本节中,我们将学习二维变量分布的更多知识,以及可视化多维数据的其他技术。

这些可视化方法可以帮助我们识别变量之间的关系,这些关系可以被预测模型捕捉;或者识别观测值之间的关系,这些关系在二维或更多维度上表现为数据值的聚类。

为了跟随学习,请使用课程代码文件中名为 multidimensional_visualization 的脚本。该脚本首先生成两个均匀分布的变量,并创建一个二维直方图。

histogram2 函数用于将变量范围划分为矩形分箱,计算落入每个分箱的值的数量,并使用高度对应分箱计数的条形图来绘制结果。

你可以使用控件来改变每个变量的边界或数据集的大小,并观察这些变化如何反映在直方图中。请注意,当观测数量减少时,由于随机噪声,可能难以识别变量的分布。在这种情况下,调整直方图的属性(如分箱宽度或数量)会有所帮助。

现在,让我们看看另一种常见的多维分布类型:多元正态分布。

此部分的代码生成两个正态分布的变量,并使用分箱散点图进行可视化。binscatter 函数以与 histogram2 相同的方式对变量值进行分箱,但它不是用条形高度来表示分箱计数,而是用颜色深浅来表示,颜色越深表示计数越高。

使用控件改变每个变量的均值和标准差,可以清楚地看到分布的中心可以移动,其椭圆形可以被拉伸。然而,分布仍然在 X 和 Y 方向上保持对称,类似于之前展示的均匀分布变量。在这两种情况下,变量被称为独立的。也就是说,一个变量的值与另一个变量的对应值无关。然而,通过选择非零的相关系数,你可以在变量之间引入线性关系。

请注意,与二维直方图相比,分箱散点图的俯视图更容易辨别此类关系。

虽然两个变量可能由相同的分布描述,但它们也可能属于不同的分布。

下一部分的代码生成一个来自正态分布的变量和另一个来自瑞利分布的变量。这次使用散点直方图来可视化变量,它结合了散点图和每个变量的独立直方图。

有了独立的直方图,比分箱散点图更容易确定每个变量的单独分布。

你可以使用控件修改正态变量的均值和标准差,以及控制瑞利变量偏度的参数 B。通常,更改其他显示选项(如标记大小或标记填充属性)可以帮助清理较大数据集的散点图。你也可以更改直方图属性,如分箱宽度和数量或直方图显示样式。例如,smooth 样式选项对于小型或嘈杂的数据集可能效果更好。

到目前为止,我们看到了从连续分布生成的示例数据。在本节中,你将看到如何使用患者数据集作为示例,来可视化同时包含离散变量和连续变量的数据集。

这两个变量之间的正相关关系有一个明显的物理原因,但这两个聚类的原因是什么?通过添加一个离散变量作为分组变量,可以帮助确定数据中的聚类是否是由于组间差异造成的。

例如,现在很明显,身高和体重值的聚类很可能与患者的性别有关。

接下来,让我们看看如何使用热力图来可视化两个离散变量,如吸烟状况和健康自评。热力图是分箱散点图的离散类比,其中每个值的组合由网格上的一个彩色矩形表示,颜色由属于该子组的观测数量决定。

热力图也可以通过指定一个颜色变量和一个用作颜色方法的统计量,来汇总连续变量的值。然后,每个矩形的颜色强度由应用于每个子组的统计量值决定。

例如,自评健康为“优秀”的吸烟者的收缩压中位数为 129.5,而自评健康为“优秀”的非吸烟者的中位数则低 10 点。

之前的可视化方法使我们能够同时可视化两个变量,并可能添加第三个变量作为分组或颜色变量。但是,如何一次查看整个数据集呢?让我们看看一些可视化高维数据集的方法。

gplotmatrix 函数允许你一次性为数据集中的所有连续变量创建散点图和直方图。每个变量组合的散点图排列在一个网格中,每个变量的直方图显示在对角线上。

散点图矩阵使你能够快速查看同一图形中的所有变量对(称为切片),这可以快速概述每个变量的分布情况以及两个变量之间的关系。可以添加离散变量作为分组变量,以便搜索观察到的任何聚类的潜在原因,或识别因组而异的变量分布和关系。

虽然绘图矩阵通过多个图表提供高维数据集的信息,但平行坐标图通过包含多个坐标轴(每个变量一个)使你能够在同一图表中查看所有变量。数据集中的每个观测值由每个变量轴上的一个点表示,其位置由该变量的值决定。然后用线段连接这些点,为每个观测值形成一条单独的路径。

每个变量的值分布可以通过路径的相对密度以及它们穿过每个轴的值来推断。变量之间的关系和观测值的聚类由路径的聚类表示。

正如你所看到的,平行坐标图一次传达大量信息,因此可能难以解释。然而,通过使用可用的选项,可以提高图表的清晰度。例如,通过将离散变量作为分组变量包含进来,我们可以看到血压变量按吸烟者聚类,而体重、年龄和身高则没有。还提供了归一化选项,以确保变量轴具有相似的尺度。其他绘图选项,如线宽和透明度,可以进行调整,以减少较大或高度聚类的数据集的杂乱。


总结

在本节课中,我们学习了如何使用常见的可视化函数来可视化多维数据,包括:

  • 二维直方图
  • 分箱散点图
  • 散点直方图
  • 热力图

我们还学习了如何通过切片或使用平行坐标图等替代技术来可视化高维数据。

此外,我们看到了如何使用分组或颜色变量来添加信息或上下文,以及如何使用直方图、绘图和归一化选项来生成更清晰的可视化。

现在,是时候让你自己去探索这些可视化了。当你运行脚本时,请思考你想从每个可视化中学到什么,你想向他人传达什么,以及哪些选项能帮助你实现这些目标。

模块1:数据探索总结 🎯

在本节课中,我们将回顾并总结模块1“数据探索”阶段所学习的关键概念与技能。您已经完成了对2015年美国国内商业航班数据集的初步探索,并掌握了多种数据描述与可视化技术。


恭喜您完成模块1的学习。在进入测验之前,让我们花几分钟时间回顾一下到目前为止所学的内容。

您在本模块开始时,首先接触了一个新的数据集,其中包含了2015年美国所有国内商业航班的信息。这个数据集将在整个课程中持续使用。

导入数据后,您应用了在专项课程早期学到的技术来探索和可视化数据内容。您练习了操作数据以调查趋势并回答关于商业航空旅行的问题,例如哪些机场受航班取消的影响最大。

了解观测值的分布情况,而不仅仅是它们的平均值或其他描述性统计量,有助于您更好地理解数据。

您现在可以描述和总结三种常见的分布类型:均匀分布正态分布偏态分布

通常很难判断偏态分布的中心在哪里,但比较数据组时需要这个信息。

四分位距是衡量分布中心的一个稳健指标,因为它识别了中间50%的观测值。您使用箱线图来可视化四分位距,并在单个图中比较不同数据组的分布。

当然,并非所有数据都能在二维空间中查看。您在本模块的最后探索了多维数据的可视化技术。

您使用了二维直方图分箱散点图散点直方图热力图来同时可视化两个变量。

您还学习了如何使用散点图矩阵平行坐标图来可视化高维数据。

通过将离散变量指定为分组变量,您能够使用颜色来识别数据中各组之间的趋势和差异。

在进行诸如识别异常值等数据清洗任务时,以及在评估特征以去除冗余或无关信息时,您将应用这些技能。

现在是时候通过完成模块1的测验来检验您的知识了。如果遇到困难,请回顾相关课程或在论坛中提问。

祝您好运。


本节课中,我们一起学习了数据探索的核心步骤:从导入和初步了解数据集,到运用统计方法(如分布分析和四分位距)描述数据,再到利用多种可视化工具(如箱线图、热力图、散点图矩阵等)从不同维度揭示数据中的模式、趋势和组间差异。这些技能是进行有效数据清洗和特征工程的重要基础。

模块2:整理数据介绍

在本模块中,我们将学习如何处理不同类型的数据变量,包括日期时间与字符串,并掌握合并多源数据以及重组数据表的核心技能,为后续分析和可视化做好准备。

上一节我们完成了初步的数据探索,本节中我们来看看如何开始处理不同类型的变量。

整理数据与合并来自多个来源的数据,是数据准备阶段的关键步骤。在本模块中,你将深入学习两种重要的变量类型:日期时间与字符串。

你已经了解如何使用日期时间变量来表示日历与一天中具体时间的组合信息。

在本模块中,你将进一步学习如何处理日期时间值,并掌握如何从分散在数据表多个列中的信息来构建它们。

你也已经知道字符串变量可以将数据表示为文本。

在这里,你将学习如何操作字符串变量,并在文本中搜索字母。

关键词或短语。接下来,你将学习如何合并来自多个文件的数据。

并重组数据表以满足你的分析需求。你将练习使用这些技术来准备数据,以便进行更深入的分析和创建富有洞察力的可视化图表。

通过本模块的学习,你将能够有效地处理日期时间与字符串变量。

合并来自多个来源的数据。根据需要重组和整理数据。

并创建更具意义的可视化图表。

本节课中我们一起学习了数据整理模块的核心目标,即掌握处理日期时间、字符串变量,以及合并与重组数据的技能,为后续的数据分析和可视化奠定坚实基础。

11:处理字符串 🎼

在本节课中,我们将学习如何在MATLAB中操作字符串,以及在字符串内部搜索特定文本。我们将通过一个实际案例,将包含字母缩写的财产损失数据转换为纯数值,并探索如何利用文本描述(如风暴叙事)来筛选和分析数据。

之前,我们已经创建了字符串并导入了文本数据,但尚未对其进行深入操作。本节视频将介绍如何操作字符串,以及如何在字符串内部搜索文本。

如果你学习过探索性数据分析课程,可能还记得数据文件中包含用于报告损失的两个相似变量:damage property(财产损失)和property cost(财产成本)。这两个变量记录成本的方式不同:damage property使用字母表示数量级,而property cost则是完整的数字。实际上,原始文件只包含带字母的变量。

数值变量是通过操作文本创建的。现在,你将看到将字符串转换为数值所采取的步骤。

导入与初步检查

首先,使用导入工具打开2016年的风暴事件文件。

请注意,property damage(财产损失)被设置为以数字形式导入。当你将鼠标悬停在单元格上时,会发现只有数据的数字部分会被导入。也就是说,字母将被丢弃。例如,“2000K”将变成“2”。这显然不是我们想要的结果。

我们需要将其更改为文本格式,并计划在导入后进行修复。此外,episode narrative(事件叙事)被检测为分类变量。这是因为每个事件由众多子事件组成,所以事件叙事的内容会重复。然而,这是一个描述风暴的自由文本。分类变量代表一组离散的唯一值。为了分析叙事的内容,我们需要字符串,而不是离散的类别。因此,这个变量也需要更改为文本。为了简化操作,我将删除此任务不需要的变量,并创建一个实时脚本来导入数据。运行脚本并预览表格。

转换财产损失数据

我们的目标是将damaged property(财产损失)转换为与property cost(财产成本)匹配的数值变量。滚动浏览表格,你会发现字母“K”用于表示1000。所有值都是以千美元为单位报告的吗?我不想滚动浏览50000个事件来找出答案。

相反,请注意非缺失条目由数字和小数点后跟一个字母组成。因此,移除每个条目的数字部分将只留下字母。这可以通过erase函数实现。erase函数的第一个输入是你想要从中擦除文本的变量。

第二个输入是要擦除的文本。所以我们需要为第二个输入创建一个字符串数组。首先,创建一个存储为文本的每个数字的字符串数组,然后将点字符的字符串表示形式添加到该数组中。

目前,我们只是试图找出唯一的字母,而不是实际修改变量。因此,让我们将表格中的内容复制到一个新变量中。现在,我们可以使用erase函数从damaged property字符串值中删除所有出现的数字和小数点。

很好,此时你只剩下字母。使用unique函数来识别数据中存在的不同值。

unique_letters = unique(letters_only);

你可以看到,除了“K”,还使用“M”表示百万,“B”表示十亿,而你无需手动查找它们。但是,如何将条目转换为正确的数值呢?

让我们进行一个小测试。创建一个值为2.5e6的文本变量(这是MATLAB中的科学计数法),看看将其转换为double类型时会发生什么。它成功了。

像“5.00K”这样的字符串可以表示为“5.00e3”而不改变其含义,而字符串“5.00e3”可以直接转换为数值。

让我们使用replace函数将字母“K”、“M”和“B”替换为它们在科学计数法中的等效值。replace函数的第一个输入是你想要替换文本的字符串变量。第二个输入是要被替换的文本,第三个输入是相应的替换文本。

% 示例:替换字母为科学计数法
str = "5.00K";
str_replaced = replace(str, "K", "e3");
numeric_value = str2double(str_replaced);

因此,这个命令将表格中的原始文本值替换为相应的数值。

滚动浏览表格,比较新的damaged property值与property cost值,以确认替换成功。请记住,原始数据不包含数值。像这样的预处理步骤在分析之前通常是必要的。将预处理步骤添加到你的导入文件中是一个好主意,就像我们对航班数据所做的那样。



探索文本叙事数据

财产损失文本以特定方式结构化,因此你对所有条目都有预期。

另一方面,episode narrative(事件叙事)是对风暴的描述。虽然有撰写叙事的指南,但确切的文本很大程度上取决于记录者个人。那么,这段文本有用吗?

回想一下,大型风暴被记录为许多事件。也许事件叙事可以用来查找与单个大型风暴相关的事件。

为了测试这一点,让我们通过对表格排序来找到造成最多财产损失的事件,然后查看其叙事。


嗯。😊,飓风马修造成了重大损失。飓风不是孤立的事件,因此可以安全地假设表格中有许多与飓风马修相关的条目。

你可以使用contains函数在字符串变量中搜索特定文本。此命令返回一个逻辑向量,如果事件叙事包含字符串“Matthew”,则对应位置为true

contains_matthew = contains(T.episode_narrative, "Matthew");

然后,使用contains函数的输出来创建一个新表格,其中仅包含出现“Matthew”的事件。

matthew_events = T(contains_matthew, :);

你可以看到有599个这样的事件。它们都与飓风有关吗?你只知道文本中有“Matthew”这个词,但不知道上下文。因此,继续探索数据并在可能时使用其他来源来确认你的工作非常重要。例如,查看日期范围,你可能会发现一些需要进一步调查的异常值。

总结与扩展

本视频涵盖了很多内容,但仍然只使用了MATLAB中可用于处理文本的众多函数中的一小部分。

访问文档以了解更多关于用于各种任务(如修改或查找字符串)的函数。

总之,文本变量可以容纳多种类型的数据,并且有许多不同的处理方式。如果你的数据无法整齐地导入MATLAB,将其作为文本导入以进行进一步处理是一个好方法。许多函数可用于处理字符串变量。

在本节课中,我们一起学习了如何操作字符串以及在字符串内部搜索文本。在本课程的后面部分,你将扩展这些概念,将特征工程应用于文本数据。为了练习,请尝试为我们刚刚对damaged crops变量所做的过程重复一遍,或者如果你住在美国,请在叙事中搜索你居住地附近的事件。

12:处理日期和时间 📅

在本节课中,我们将学习如何处理数据集中常见的日期和时间信息。许多数据集记录了随时间推移的观测值,这些数据不仅包含观测结果,还记录了观测发生的具体日期或时间。我们将学习如何从分散的变量中创建统一的日期时间变量,并利用它们进行计算。

从多个变量创建日期时间变量

上一节我们介绍了数据集中日期时间信息的重要性。本节中我们来看看如何将分散存储的日期和时间部分组合成一个统一的变量。

有时,日期和时间信息并非记录在单个变量中,而是分散在多个变量里。以下是一个包含传感器数据以及年、月、日、时、分、秒多个列的数据集示例。

假设我们需要计算两次读数之间的时间间隔,这需要一个包含完整日期时间信息的单一变量。

首先,查看每一列的数据类型。在本例中,所有列都是数值型。

使用 datetime 函数,将代表年、月、日、时、分、秒的六个变量转换为一个 datetime 变量。通过将结果赋值给表格中的一个新变量,可以将组合后的日期时间信息与数据一同保存。

% 假设 year, month, day, hour, minute, second 是表格中的变量名
T.DateTime = datetime(T.year, T.month, T.day, T.hour, T.minute, T.second);

处理混合数据类型的日期时间信息

如果部分变量不是数值型,该如何处理?例如,一个数据集包含年、月、日的数值列,但时间信息存储在一个字符串列中。

创建 datetime 变量要求所有输入具有相同的数据类型(数值型或字符串型)。由于时间变量值包含冒号,无法直接转换为数值。

在这种情况下,可以先将前三个数值列转换为字符串,然后构造自己的日期字符串。

以下是处理步骤:

  1. 将年、月、日数值列转换为字符串。
  2. 使用字符串拼接,构造一个用短横线分隔的年-月-日字符串。
  3. 将时间字符串拼接上去。
  4. 使用 datetime 函数,并指定输入格式选项,将完整的日期时间字符串转换为 datetime 变量。
% 假设 Year, Month, Day 是数值列, TimeString 是时间字符串列
dateString = string(T.Year) + "-" + string(T.Month) + "-" + string(T.Day) + " " + T.TimeString;
T.DateTime = datetime(dateString, 'InputFormat', 'yyyy-MM-dd HH:mm:ss');

转换完成后,日期时间的显示格式可能与输入时不同。datetime 变量有一个 Format 属性,用于控制其显示方式,同时保留所有原始信息。可以通过设置此属性来改变显示格式。

T.DateTime.Format = 'dd-MMM-yyyy HH:mm:ss';

使用日期时间变量进行计算

现在我们已经知道如何创建日期时间变量,接下来看看如何用它们进行计算。

假设有两个变量描述两个时间点,例如同一天晚上8点的航班起飞时间和晚上11点的到达时间。

要计算飞行时长,只需用到达时间减去起飞时间。

departure = datetime('2023-10-27 20:00:00');
arrival = datetime('2023-10-27 23:00:00');
flightDuration = arrival - departure;

当你像上面那样对 datetime 变量进行减法运算时,结果的数据类型将是 duration

在这个例子中,duration 表示以小时、分钟和秒为单位的时间长度。

处理时长数据

假设你有多个转机航班,想要计算总飞行时间。如果每个航班的时长都以小时和分钟分别记录,你需要额外的步骤来处理这两个独立的时间单位。

通过将小时、分钟和秒存储在 duration 数据类型的变量中,你可以直接对两个值进行加法运算,单位会自动处理。

flight1 = duration(3, 30, 0); % 3小时30分钟
flight2 = duration(2, 45, 0); % 2小时45分钟
totalFlightTime = flight1 + flight2; % 结果为 6小时15分钟

如果飞行时长是以分钟为单位的数值变量(例如第一个航班200分钟,第二个航班50分钟),可以使用 minutes 函数将其转换为 duration,然后像之前一样进行计算。

flight1_min = 200;
flight2_min = 50;
totalMinutes = minutes(flight1_min) + minutes(flight2_min); % 结果为 250分钟

通常,你可能希望结果以不同的格式显示,例如小时和分钟。你无需手动转换,只需改变其显示方式即可。

totalMinutes.Format = 'h:mm'; % 将显示格式设置为“小时:分钟”
disp(totalMinutes) % 显示为 4:10 (即4小时10分钟)

更多日期时间函数

MATLAB 为 datetimeduration 变量提供了更多函数。使用这些函数,你可以在进行计算时无需考虑日期和时间的各个组成部分及其相关单位。

在官方文档中,你可以找到一系列函数,用于:

  • 创建日期和时间数组
  • 拆分日期和时间
  • 确定其类型和时区偏移
  • 计算日期之间的差异或进行日期偏移
  • 将它们转换为数字和字符串

本节课中我们一起学习了如何在 MATLAB 中处理日期和时间数据。我们掌握了从分散变量创建 datetime 变量的方法,学习了如何对 datetimeduration 变量进行计算,并了解了如何控制它们的显示格式。这些技能对于分析时间序列数据和计算时间相关的指标至关重要。

13:导入多个数据文件 📂

在本节课中,我们将要学习如何高效地导入和处理多个数据文件。当数据被分割存储在许多独立的文件中时,手动逐个导入会非常繁琐。我们将介绍如何使用MATLAB的数据存储功能来批量导入这些文件,并应用自定义的导入设置。

数据存储简介

上一节我们介绍了探索单个数据文件的方法。本节中我们来看看当数据分散在多个文件中时,如何一次性导入它们。

你已经花了一些时间探索航班数据集。现在你看到数据被分割成每个月一个独立的CSV文件。

但是,如果你有一个关于整个2015年的问题呢?

例如,假设你感兴趣的是每架飞机在整个一年中在空中飞行了多长时间。

要访问全年的数据,你可以导入一个月份的数据,然后将这段代码复制12次,将每个月保存到一个新表中。然而,这种方法很快就会变得乏味,特别是如果你要包含2015年之后的更多年份。那么,如何避免所有这些重复输入呢?

使用数据存储

一个更高效的方法是使用数据存储。数据存储是MATLAB为了方便导入而组织起来的文件集合。

在你的案例中,你有12个航班CSV文件,这非常适合使用数据存储。

要在MATLAB中创建数据存储,将一个CSV文件输入到datastore函数中,并将其输出保存到一个新变量。

但是,如何一次性包含所有文件,而不是逐个处理呢?同样,你可以输入一个文件名列表,但这正是你想要避免的麻烦。相反,因为每个文件仅在其三个字母的月份缩写上有所不同,你可以使用星号来代表所有文件。

这个符号作为一个通配符,可以匹配任何字符组合。在这种情况下,你想要所有以单词“fs”开头的文件。然后使用星号符号。最后,包含“.csv”来指定文件类型。现在,你的数据存储将收集所有符合此命名模式的文件。

接下来,使用readall函数将数据存储及其12个文件作为表格导入。

在MATLAB工作区中,你可以看到包含全年580万次航班的新表格。

应用自定义导入函数

这工作得很好。但请注意,你没有使用格式化表格的自定义导入函数。

例如,出发时间由CSV文件中报告的四位数时钟读数表示,而不是由导入函数转换成的datetime变量。

别担心,仍然可以指定导入函数,而不是使用默认的。要做到这一点,你需要使用一种特定类型的数据存储,称为文件数据存储,它设计用于使用自定义导入函数。将你的数据存储更新为此新类型后,你就可以使用read函数选项来指定你的自定义函数。

这是通过在函数名称前加上@符号来完成的。

统一读取数据

你几乎完成了,因为现在你已经导入了所有12个文件,但每个文件都包含在自己的表格中。例如,第一个表格是四月份的数据。

发生这种情况是因为文件数据存储不假设每个文件的结构都相同,而在这个案例中它们是相同的。例如,第五列始终是目的地机场变量。

要更改默认行为,将UniformRead选项设置为true

现在,全年的数据都在一个表格中了。你可以回到最初的问题:确定飞机在2015年有多少时间在飞行。

看起来大多数飞机一年中有30%的时间在空中飞行。

但有几架飞机飞行时间超过半年。如果你想练习,看看是否能找出这些飞机在哪些机场之间飞行。

总结与扩展

正如你所看到的,数据存储是导入大量类似格式文件集合的强大工具。

本视频介绍了专门的文件数据存储。但根据你的需求,还有其他类型,例如图像数据存储电子表格数据存储

所以,下次你需要一起导入成百上千个文件时,只需将它们全部放入一个数据存储中以便轻松访问。

14:组合数据 🧩

在本节课中,我们将要学习如何将多个数据集组合在一起。数据科学中的一个常见任务就是合并数据。然而,由于数据很少能完美匹配,因此没有一种适用于所有情况的单一方法。本视频将介绍五种常见的数据组合方法。

这五种方法是:水平连接、垂直连接、连接、内连接和外连接。

垂直连接 📊

首先介绍的是连接。当两个数据集结构完全相同时,连接非常有用。这是组合数据最基本的方式,其效果相当于简单地将表格粘贴在一起。

因此,垂直连接仅用于组合相同类型的数据。

当您使用数据存储将月度航班数据合并为全年的一张表时,您完成的就是垂直连接。

让我们通过一个将在本课中反复使用的小例子来应用这个概念。

假设您有一个诺贝尔物理学奖得主的表格。该表格包含每个获奖年份的一行数据,以及年份和获奖者姓名两列。

现在,假设您想向此列表中添加诺贝尔化学奖得主。

使用垂直连接,您可以通过将两个列表垂直堆叠在一起来组合数据。

水平连接 ➡️

上一节我们介绍了垂直连接,本节中我们来看看水平连接。现在想象一下,您拥有包含同一行更多信息的数据。例如,您的第二个表格是与诺贝尔奖相对应的发现列表。这里您需要将两个表格水平组合。

这称为水平连接。最终结果是一个包含所有三列的表格。

使用键变量进行连接 🔑

然而,当您的两个表格未排序或长度不同时,情况会变得复杂。例如,如果您的第二个表格是按字母顺序排列的各种科学家及其原籍国的列表呢?

这里用颜色高亮显示了匹配的姓名。现在您无法水平连接表格,因为不仅姓名列未对齐,而且表格长度也不同。

那么该怎么办?

在这种情况下,简单的连接不再有效,您需要使用键变量来指导表格的连接。

键是标识特定行的唯一变量。因为您希望组合具有相同姓名的行,所以选择姓名列作为键变量。请注意,左表中的每个键名在右表中都有一个匹配的键名。

现在您可以连接它们。

结果是一个正确匹配获奖者与其国家的单一表格。

连接的概念在这些维恩图中得到了说明。这里,每个圆圈代表一个数据集。它们重叠的部分代表它们之间共享的行,这是由键变量决定的。

彩色区域代表哪些部分被带入最终组合表中。

例如,为了进行连接,要求右侧数据必须至少有一个键与左侧数据中的每个键匹配。

最终结果包含来自左侧数据的所有行。

但包含来自两者的所有变量。这些图表有助于根据您希望在组合表中保留多少数据来决定使用哪种连接方法。

内连接与外连接 🔄

当您的表格缺少键时,您将不得不做出决定。换句话说,当它们不完全重叠时。如果发生这种情况,您有几种可能的方法可供选择。

最常见的两种是内连接和外连接。

当您只想保存具有匹配键的行时,内连接非常有用。

例如,假设您的第二个表格现在是已出版书籍的物理学家列表。同样,匹配的姓名用颜色编码。但请注意,其中一些只出现在一个表格中。因此,您不能像之前那样将它们连接在一起。

相反,内连接会删除所有不匹配的行。最终的表格是既获得诺贝尔奖又出版过书籍的物理学家列表。

但这是一种选择性很强的连接类型。如果您想在连接表中保留所有数据,即使键不匹配,该怎么办?

这就是外连接的用武之地。当您使用外连接组合两个表格时,不会遗漏任何数据,最终结果是一个全面的表格。

在这种情况下,您最终会得到一个包含所有物理学家的列表,其中一些人获得了诺贝尔奖。

一些人出版了书籍,还有一些人两者都做到了。

请注意,为了包含两个表中的每一行,不匹配的行将保留空值。

总结 📝

您可能不知道合并数据集有这么多选项。本视频甚至没有涵盖所有方法。

您选择哪种方法取决于您希望在最终结果中包含什么。

请记住,除非您执行简单的连接,否则您需要定义键变量来指导连接过程。

本节课中我们一起学习了五种组合数据的方法:垂直连接、水平连接、连接、内连接和外连接。每种方法适用于不同的数据结构和需求。关键在于理解您的数据如何关联,并选择能保留所需信息的方法。

接下来,您将学习如何在 MATLAB 中组合表格,然后可以自己进行练习。

15:连接表格 🧩

在本节课中,我们将学习如何使用MATLAB连接表格。我们将通过一个具体案例——分析从纽约市两个主要机场(肯尼迪国际机场和拉瓜迪亚机场)出发的所有直飞目的地——来演示连接表格的完整流程。我们将使用“实时任务”来辅助操作,并最终生成一张可视化地图。


在美国境内飞行时,存在许多可能的目的地。但能否直飞取决于您的出发地。如果您身处像纽约市这样拥有两个主要机场的地方,那么您需要考虑从这两个机场出发的所有目的地。

本视频将逐步演示所需的连接步骤,以从航班数据集中生成这张地图,它展示了从纽约市出发的所有可达目的地,无论您是从肯尼迪国际机场还是拉瓜迪亚机场起飞。这些步骤融合了您之前学习过的不同连接方法。

您可以跟随本视频,使用名为 JoiningTables.mlx 的实时脚本进行操作。

导入数据

首先,您需要导入航班数据。您可以选择使用文件数据存储导入全年数据,或使用自定义导入函数仅导入单月数据。在本例中,我们仅导入九月份的数据。

% 示例:导入九月份航班数据
flightsData = importFlights('September');

创建并分组表格

接下来,您需要创建两个表格,分别对应从纽约市的肯尼迪机场(JFK)和拉瓜迪亚机场(LGA)出发的航班。最后,您需要按目的地对每个表格中的航班进行分组。

以下是操作步骤:

  1. 从主数据中筛选出 Origin‘JFK’ 的行,创建 flightsJFK 表。
  2. 从主数据中筛选出 Origin‘LGA’ 的行,创建 flightsLGA 表。
  3. 对每个表格使用 groupsummary 函数,按 Dest(目的地)分组,并计算每个目的地的航班总数。

% 创建并分组表格
flightsJFK = flightsData(flightsData.Origin == ‘JFK’, :);
flightsLGA = flightsData(flightsData.Origin == ‘LGA’, :);

summaryJFK = groupsummary(flightsJFK, ‘Dest’, ‘sum’, ‘Flights’);
summaryLGA = groupsummary(flightsLGA, ‘Dest’, ‘sum’, ‘Flights’);

这将为每个机场生成所有可能目的地的列表,以及您导入的时间段内的航班总数。

使用实时任务连接表格

现在可以开始连接表格了。本例使用一个实时任务来辅助此过程。实时任务是您可以插入脚本中的应用程序,用于执行一组特定操作。

您可以在Live Editor选项卡中找到所有可用的实时任务。现在,您将使用连接表格的那个。

在实时任务中,您有几个选项可以修改连接表格时的输入、输出和可用选项。

  • 在顶部,您可以看到输出将保存到变量 summaryNYC
  • 要选择连接哪两个表格,请使用左右表格的下拉菜单。
  • 接下来,选择关键变量(也称为合并变量)来指导连接过程。
  • 最后,指定要使用的连接方法。目前,请坚持使用外连接,以便结果包含两个表中的所有行。稍后,您可以花时间探索其他选项。

请注意,输出中为每个输入表(一个用于JFK,一个用于LGA)都有一个单独的 Destination 列。这是为了跟踪哪些键来自哪个表。现在,请选择合并关键变量的选项。由于实时任务会在您更改选项时立即执行,您可以立即看到新结果,现在它只有一个 Destinations 列。

计算日均航班量

上一节我们介绍了如何连接两个机场的航班汇总表。本节中,我们来看看如何为最终的可视化地图准备数据。在最终的可视化地图中,每个目的地标记的大小由该航线日均航班量的平均值决定。

接下来的这段代码将肯尼迪机场和拉瓜迪亚机场的航班数相加,然后除以天数得到日均航班量。

% 计算日均航班量
totalFlights = summaryNYC.sum_Flights_summaryJFK + summaryNYC.sum_Flights_summaryLGA;
daysInMonth = 30; % 假设九月有30天
flightsPerDay = totalFlights / daysInMonth;
summaryNYC.FlightsPerDay = flightsPerDay;

连接地理位置信息

您几乎已经完成了。缺少的是每个目的地的地理位置信息,这些信息并未存储在航班数据中。但是,它是 airports.csv 文件中的一个变量,因此您需要将该文件作为表格导入。

接下来,您必须将包含每个目的地三字母代码的 airport 列从字符串转换为分类变量。这是因为两个表中的关键变量需要是相同类型。

现在,您可以将航班数据和机场数据连接在一起了。同样,此操作使用了实时任务。不过,您现在看到的只是代码,这是因为您可以从任务菜单中隐藏交互式控件。显示控件后,您可以看到任务是如何配置的。

请注意,结果中包含的信息比您需要的更多,例如 citystate 列。如何删除这些不需要的变量?您始终可以从任务菜单将实时任务转换为可编辑的代码。这使您能够指定一个选项,以决定从每个表中保留哪些变量。虽然删除不相关的数据并非必需,但在本例中,它确实有助于清理您的输出。

% 示例:连接后仅保留所需变量
finalTable = outerjoin(summaryNYC, airportsTable, ‘Keys’, ‘Dest’, ‘KeepOneCopy’, {‘Lat’, ‘Lon’});

绘制地理气泡图

最后,您可以使用 geobubble 函数绘制数据了。

% 绘制地理气泡图
gb = geobubble(finalTable, ‘Lat’, ‘Lon’, ‘SizeVariable’, ‘FlightsPerDay’);
gb.Title = ‘从纽约市出发的直飞目的地(日均航班量)’;

请随意试验此实时脚本,以了解不同连接选项在不同情况下的工作原理。例如,左外连接与您刚刚尝试的外连接有何不同?如果您想要额外的挑战,请看看是否可以使用表格连接方法来绘制从纽约市出发,不仅能直飞,还能经一次中转到达的所有机场。


本节课中,我们一起学习了在MATLAB中连接表格的完整流程。我们从导入和预处理航班数据开始,创建了按机场和目的地分组的汇总表。接着,我们利用实时任务演示了如何执行外连接来合并数据,并计算了关键的日均航班量指标。然后,我们通过连接外部机场数据表补充了地理位置信息,并最终使用 geobubble 函数将结果可视化。通过这个案例,您掌握了使用连接操作整合多源数据、进行数据清洗并生成洞察的基本方法。

16:排序数据

在本节课中,我们将学习如何在MATLAB中对数据进行排序。排序是数据科学中的一项基本操作,它能帮助我们识别数据集中具有最高值和最低值的观测值,从而进行更深入的分析。

🎼 排序的用途

你可能遇到过许多按字母顺序排列的列表,或根据特定变量值排序的整个表格。在数据科学中,排序可以帮助你识别具有最高值和最低值的观测值。

让我们看看如何在MATLAB中进行排序。我们将从打开一个用于排序和提取数据的脚本开始。

📊 脚本目标:分析机场航班数据

该脚本旨在获取航班数量最多和最少的各20个机场的航班数据。这些数据集随后可用于研究繁忙与不繁忙机场之间航班延误的长度、原因和影响的差异。

🛠️ 数据准备与初步排序

脚本首先将单月的航班数据导入到一个表格变量中。下一步是使用 groupsummary 函数获取每个机场的出发航班数量,该函数返回一个包含机场和航班数量的表格。

以下是使用 groupsummary 的示例代码:

flightCounts = groupsummary(flightData, 'Origin', 'numel', 'FlightNum');

回忆一下,你可以使用交互式控件预览和排序表格变量。例如,你可以按航班数量降序排列表格,以查看最繁忙的机场。

请注意,执行排序的相应代码会自动生成,并且我们已经将其添加到脚本中。排序是使用 sortrows 函数完成的,该函数将表格作为第一个输入,后跟排序变量和决定排序顺序的方向。

以下是 sortrows 函数的基本语法:

sortedTable = sortrows(table, sortVariable, direction);

需要注意的是,整个表格会同时被排序,而不仅仅是排序变量本身。

🏆 提取最繁忙的机场数据

表格排序后,前20行被提取到一个新的表格变量中,该变量包含了20个最繁忙的机场及其航班数量。然后,这个表格通过关键变量 Origin 与原始航班数据执行内连接。

以下是执行内连接的示例代码:

busyAirportsData = innerjoin(flightData, top20Airports, 'Keys', 'Origin');

生成的表格仅包含这20个最繁忙机场的航班数据。

🔍 处理并列情况与次级排序

现在,要找到20个最不繁忙的机场,情况稍微复杂一些。如果你返回到航班数量表格并按升序排序,你会看到有多个机场的航班数量相同,正好在我们设定的20个机场的截止线附近。

为了打破这种并列情况,有时需要添加额外的排序变量。由于本分析最终关注的是延误的原因,因此优先考虑延误次数更多的机场。

为了实现这一点,我们在原始数据中添加了一个新变量,用于指示延误超过15分钟的航班(这是美国联邦航空管理局认为航班延误的最低时间标准)。然后,再次按出发机场汇总航班状态,这次是汇总每个机场的延误次数。

以下是添加延误变量并再次汇总的示例代码:

flightData.IsDelayed = flightData.DepDelay > 15;
delayCounts = groupsummary(flightData, 'Origin', 'sum', 'IsDelayed');

生成的表格现在包含了每个机场的航班数量和延误次数。

⚙️ 使用 topkrows 高效提取数据

提取前20行后,你可以看到行是按航班数量升序和延误次数降序排列的。这次,我们使用了 topkrows 函数来仅返回前20个机场。

以下是使用 topkrows 的示例代码:

leastBusyAirports = topkrows(combinedTable, 20, {'FlightCount', 'DelayCount'}, {'ascend', 'descend'});

使用 topkrows 来查找你需要的行,通常比排序整个表格再提取更高效。topkrows 接受一个表格作为输入,后跟要从排序后表格顶部提取的行数。与 sortrows 类似,你也必须提供排序变量和方向。这两个函数在按多个变量排序时,也接受变量列表和方向列表。

✅ 完成数据提取

最后一步是再次使用内连接获取最不繁忙机场的航班数据,至此我们就完成了。

以下是最终的连接代码:

leastBusyAirportsData = innerjoin(flightData, leastBusyAirports, 'Keys', 'Origin');

📝 总结

在本节课中,我们一起学习了MATLAB中的排序操作。我们了解了 sortrowstopkrows 函数的使用方法,以及如何通过多级排序来处理数据并列的情况。借助排序函数,我们成功地提取了用于分析繁忙与不繁忙机场延误情况的目标数据集。掌握这些技巧,能帮助你在数据科学项目中更有效地组织和探索数据。

18:数据整理总结 🧹

在本模块中,我们学习了如何将原始、杂乱的数据整理成适合分析的整洁格式。原始数据通常分散在多个文件中,且变量格式不便使用。通过本模块的学习,你将掌握一系列核心技能,为后续的数据探索和建模打下坚实基础。

正如你在本模块中所见,当你首次导入原始数据时,很少能直接得到一个完美组织且可直接使用的表格。

你的数据很可能杂乱无章,分散在多个文件中,并且包含格式不便的变量。

例如,原始的航班数据集就分散在多个文件中,需要大量的预处理工作才能将日期和时间信息整合成单一格式。

核心技能回顾

上一节我们介绍了数据整理的常见挑战,本节中我们来回顾一下你已掌握的核心技能。

你学习了如何处理日期、时间和文本数据,以及如何合并来自多个来源的数据,并将其重新组织成更方便的形式。

这些技能将帮助你预处理所拥有的任何原始数据。

数据整合与重组

以下是处理分散数据和重组表格的具体方法。

  • 合并多个文件:如果你的数据像航班数据集一样存储在多个文件中,你现在可以使用数据存储(datastore)在导入时将它们垂直连接起来。
    ds = datastore('flightdata_*.csv');
    combinedData = readall(ds);
    

  • 合并多个表格:如果你需要合并多个表格,可以使用连接方法(如 join, innerjoin, outerjoin),通过指定的键变量将它们组合起来。

    mergedTable = join(table1, table2, 'Keys', 'ID');
    
  • 数据排序:你还可以通过使用特定列对数据进行排序,来重新组织表格中的行。例如,航班数据可以按起飞时间、始发机场或两者进行排序。

    sortedTable = sortrows(flightData, {'DepTime', 'Origin'});
    

有多种排序方法可供选择,以帮助你分析数据并展示结果。

数据格式转换

你同样了解到,原始数据通常以不适合分析的格式记录。

你现在可以使用文本和日期时间变量从原始数据中提取相关信息,并在数据类型之间进行转换。

实践练习

在参加测验之前,现在是练习所学知识的好时机。

导入航班数据集,使用数据存储加载全部12个月的数据,并尝试回答一些涉及本模块所涵盖主题的问题。

例如:

  • 一周中哪一天的航班最多?
  • 哪些州最容易因天气原因导致航班取消?

如果你发现了有趣的结果,请在论坛上分享。

总结

本节课中,我们一起学习了数据整理的核心流程。我们掌握了如何整合分散的数据源、重组表格结构以及对日期、时间等特殊格式数据进行处理。这些技能是进行有效数据科学分析的关键第一步,能够确保你的数据清洁、有序,为后续的特征工程和机器学习模型构建做好准备。

模块3:数据清理介绍 🧹

在本模块中,我们将学习数据清理的核心概念与常用技术。原始数据通常包含不完整、异常或不一致的记录,这些“脏数据”会干扰后续的分析与建模。通过本模块的学习,你将掌握使用MATLAB清理数据的基本方法。

在对数据有了初步了解后,你可能会发现其中存在一些不规则之处。这是因为原始数据通常是杂乱的,在进行深入分析之前需要进行预处理。

这项任务通常被称为数据清理。在本模块中,你将学习几种可用于清理数据的技术。

例如,某些数据点可能看起来不合常理,就像图表上的这些点。这些点被称为异常值

根据后续步骤的不同,你可能需要移除这些异常值,或者专门对它们进行分析。

此外,原始数据很少是100%完整的。

例如,回顾风暴事件数据。一个缺失的条目可能意味着未知,比如缺失的GPS位置。

或者,它可能意味着某个值不重要,不值得报告,例如可忽略的财产损失。

有时,数据中的波动性可能使得难以识别任何规律。在这种情况下,你可能需要对数据进行平滑处理,以突出隐藏在嘈杂的短期变化背后的长期趋势。

最后,可能两个变量覆盖的范围差异巨大,以至于无法直接比较。

在这种情况下,你可以对数据进行重新缩放标准化

本模块的一个共同主题是:不完整、极端或杂乱的数椐会干扰你的分析,并使数据难以建模。

在本模块结束时,你将能够使用MATLAB清理自己的数据。

现在,让我们开始学习。

19:识别缺失数据 🔍

在本节课中,我们将要学习如何处理数据科学中一个几乎无处不在的挑战:缺失值。我们将首先了解缺失值的不同类型,然后学习如何使用MATLAB来识别它们。理解缺失值的成因和表现形式,是后续正确处理它们的关键。

概述

上一节我们学习了如何组织数据和合并多个数据文件。本节中,我们来看看数据预处理中的一个核心挑战——缺失值。处理缺失值的最佳准备是充分理解你的数据,包括缺失值的表示方式、数据收集过程、哪些地方不应该出现缺失值,以及哪些地方特意用缺失值来表示数据的缺失。识别缺失数据是决定如何处理它的第一步。

缺失值的成因与影响

多种因素可能导致数据缺失,例如信息加载失败、数据损坏、信息记录不完整等。理解数据为何缺失至关重要,因为缺失值会使从数据中学习的任务变得非常困难,甚至不可能。事实上,不完整的数据会给你的分析带来偏差,进而导致错误的预测。此外,识别和理解缺失值对于正确处理剩余数据也很重要。

缺失值的分类机制

让我们从理解缺失数据的分类开始。通常,数据科学家将缺失值分为三种主要机制:随机缺失完全随机缺失非随机缺失。这些机制将帮助你后续决定处理这些缺失值时应采用哪种方法。

以下是三种缺失机制的详细说明:

  • 随机缺失:指某个变量的缺失原因与其自身的潜在值无关,而是条件依赖于其他变量
    • 公式/示例P(变量X缺失 | 变量Y) ≠ P(变量X缺失)
    • 例如,在一个包含人口血压信息的数据集中,缺失值可能与年龄条件相关。在某些国家,老年人比年轻人更可能在常规体检中检查血压。这与他们血压的具体数值无关,因此缺失模式不依赖于血压读数本身,而依赖于另一个变量——患者的年龄。

  • 完全随机缺失:指缺失数据机制与任何变量的值都无关,无论是缺失的还是已观测到的。
    • 公式/示例P(变量X缺失) = 常数
    • 例如,一个来自客户满意度调查的数据集。这类问题通常是可选的。如果将完整回答和缺失回答的结果分开,你可能会注意到这两组数据与客户的年龄没有相关性。每位客户只是随机选择跳过一个或多个问题。

  • 非随机缺失:指变量缺失的原因与该变量自身的值有关。
    • 公式/示例P(变量X缺失) 与 X 的值相关
    • 例如,如果你的调查现在询问人们的收入,高收入人群可能更不愿意透露自己的收入,这意味着他们可能会跳过这个问题。在这种情况下,数据缺失的原因正是你试图收集的数值本身。这是最棘手的一类,因为对这类缺失数据的错误处理可能导致结果出现严重偏差。

实例分析:航班数据集

那么,航班数据集的情况如何?假设你只列出了计划起飞时间、滑入时间和取消状态这几列。TaxiIn(滑入时间)的缺失值似乎与计划起飞时间没有关系,也没有迹象表明这些值缺失是因为它们自身的数值。然而,查看Canceled(取消)列,你会理解TaxiIn的缺失值是条件依赖于每个航班的取消状态的。因此,这可以假定为随机缺失的一个案例。计划起飞时间并不能预测何时会出现缺失值,但这个缺失值条件依赖于另一个变量。这种理解将帮助你后续确定处理这些缺失值的最佳方法。

在MATLAB中识别缺失值

现在,无论缺失数据的机制如何,你都需要识别缺失值。具体怎么做呢?在MATLAB中,你可以使用函数 ismissing 来识别数据中的缺失值。

ismissing(A) 返回一个逻辑输出,指示输入 A 的哪些元素包含缺失值。结果数组的大小与 A 相同。

但是,请注意,标准缺失值取决于数据类型。对于数值型和持续时间值,NaN(非数字)将被解释为缺失值。

代码示例:当对 TaxiIn 列使用 ismissing 时,注意带有 NaN 的条目如何返回逻辑值 1(真)。

对于 datetimestringcategorical 变量,缺失值的标识方式不同,如下表所示:

数据类型 标准缺失值表示
数值型 (double, single, ...) NaN
持续时间 (duration) NaN
日期时间 (datetime) NaT (Not a Time)
字符串 (string) <missing>
分类 (categorical) <undefined>

代码示例:考虑 ActualDepartureTime(实际起飞时间)变量。注意缺失值如何被标识为 NaT。同样,注意 TailNum(机尾编号)列中的缺失值如何被标识为 <undefined>

处理错误记录的数据

缺失数据也可能对应于错误记录的数据。例如,假设 Airtime(飞行时间)的值被错误地记录为 0,或者 TaxiIn 的值被记录为一个负数。你会希望将这些值也标识为缺失。在这种情况下你该怎么做呢?

standardizeMissing 函数可以将 indicator 中指定的值替换为标准缺失值。

代码示例:对于错误记录为 0Airtime,或记录为负数的 TaxiIn,你可以使用 standardizeMissing 将这些不正确的值替换为缺失值。

总结

本节课中,我们一起学习了缺失数据的原因通常分为三类,这有助于确定如何处理这些数据。你还学习了如何使用 ismissing 函数来识别缺失值,以及使用 standardizeMissing 函数将任何指定值替换为标准缺失值。接下来,你将学习如何利用这些信息来处理缺失值。

20:处理缺失数据 🛠️

在本节课中,我们将要学习识别出数据中的缺失值后,应如何处理它们。我们将探讨忽略、删除和替换这三种主要策略,并学习如何在MATLAB中实现这些操作。


你已经了解了什么是缺失数据以及如何在数据集中识别缺失值。然而,你现在面临另一个问题:一旦识别出缺失值,该如何处理它们?

你可以忽略这些缺失值,删除包含缺失数据的条目,或者用新值替换它们。处理缺失值没有通用的最佳方法。根据之前学到的不同缺失数据机制,存在一些替代方案。此外,领域知识和理解如何解读数据将是成功处理缺失数据的主要助力。

在本视频中,你将更详细地了解处理缺失数据的不同选项,以及如何在MATLAB中完成这些操作。

忽略缺失值

在探索性数据分析课程中,你学习了如何安全地忽略缺失数据。许多MATLAB函数允许你使用 OmitNan 选项来忽略缺失值。

请注意,这仅适用于数值。除了忽略缺失值,还有删除和替换两种选择。

删除缺失值

处理缺失值最简单的方法之一是直接删除包含缺失值的数据点。

  • 非随机缺失的情况下,删除缺失值会给模型带来一定程度的偏差,因为值缺失的可能性与其本身的值有关。
  • 随机缺失的情况下,删除也可能引入偏差,但如果缺失数据的百分比很小,那么删除数据可能不会造成统计效力的显著损失。
  • 如果数据是完全随机缺失,删除则不会增加任何偏差。

然而,你需要小心,如果数据集中有太多缺失值,你可能会显著减少数据集的大小。

让我们再次使用航班数据集。如前所述,该数据集中的缺失值被定性为随机缺失。如果你计算已识别的缺失值数量,会发现它们占八月份数据的1%。因此,删除这些值可能不会对你的统计分析造成重大损失。

在MATLAB中,你可以使用函数 rmmissing 来删除缺失条目。

  • 如果输入是向量,则 rmmissing 会删除任何包含缺失数据的条目。
  • 如果输入是矩阵,则 rmmissing 会删除任何包含缺失数据的行。

ismissing 函数类似,缺失值的定义取决于输入的数据类型。

对于航班数据集,rmmissing 返回一个不包含缺失值行的输出。

请注意,此过程也可用于更复杂的任务。例如,假设你想确定数据是否揭示了到达延误的任何每日趋势。为此,你需要删除缺失值。由于每分钟都有多个航班,你可以使用 groupsummary 将数据按分钟分组。对于这个特定月份的每一天的每一分钟,平均到达延误将是一个单一的数字。然后,你可以删除所有对应的 NaN 缺失值。你可以通过使用输入参数 DataVariables 并选择相应的表变量名来实现。

处理完缺失值后,你就可以使用这个结果来开始寻找数据中的趋势。在后续的视频中,你将更详细地学习如何实现这个目标。

替换缺失值

现在,你的第一个替代方案是删除包含缺失值的行。但如果这样做会显著减少数据集的大小怎么办?或者,如果你有一个显示非随机缺失机制的数据集怎么办?在这种情况下,你可以用估计值或代表性值替换缺失值。

在MATLAB中,你可以使用 fillmissing 来实现这一点,它使用指定的方法填充输入 A 的缺失值。例如,你可以使用一个常数值来替换缺失值。

fillmissing 支持多种生成填充值的方法。常见的方法包括使用均值中位数线性插值等。当你只有数值数据时,使用实时编辑器任务可以简化测试多个选项的过程。

在实时编辑器选项卡上,选择“任务”,然后选择“清理缺失数据”。选择数据集和变量后,使用下拉菜单选择“填充缺失值”。将显示多种方法选项,你可以直观地检查每种不同方法的效果。

请注意,此实时编辑器任务也允许你删除缺失数据值,而不是填充它们。


总结

本节课中我们一起学习了如何处理缺失数据。要记住,你必须适当地处理缺失值,以避免结果产生偏差。你可以使用 rmmissing 删除缺失值,或者使用 fillmissing 替换它们。在决定最佳行动方案时,请确保你理解数据中某些值缺失的原因。现在你将有机会练习这些概念。

21:识别异常值 🎯

在本节课中,我们将要学习什么是数据中的异常值,它们如何影响数据分析与建模,以及识别和处理异常值的常用方法。

概述

上一节我们介绍了基本统计分布和指标如何帮助深入理解数据。本节中,我们来看看那些看起来不太可能或不太寻常的数据点——异常值。

什么是异常值?

异常值是指位于某些预期范围之外,或不遵循预期模式的数据点。

异常值可能由多种原因导致,例如:

  • 记录错误
  • 数据损坏
  • 设备故障
  • 异常现象
  • 群体或系统中自然存在的变异

异常值的影响

异常值虽然与数据主体不同,但这重要吗?我们应该如何处理它们?

有时,你可能对数据有额外的了解,例如所在领域的理论知识或测量设置的技术知识。在这些情况下,你可能能够确定某个异常值是由特定错误源引起的,并决定将其删除甚至替换。

然而,需要记住,异常值不一定是坏数据。在足够大的数据集中,由于自然变异,异常值通常是预期会出现的。在医疗、制造、安全和安防等众多应用中,异常值实际上可能是异常检测的关注点。例如,如果你曾收到可疑信用卡活动通知,这意味着在你的消费习惯中发现了一个异常值。

尽管如此,你应该意识到任何类型的异常值都可能影响你的分析。

对数据可视化的影响

异常值会降低你轻松可视化整体数据的能力,因为缩放比例会倾向于少数异常大的数据点。在这种情况下,识别并忽略异常值可以显著改善图表,使趋势或模式更容易被观察到。

对统计指标的影响

异常值会显著影响分布的平均值和标准差。

考虑以下数值向量及其指标:

数据向量: [1, 2, 2, 3, 3, 4, 5]
平均值: 2.857
标准差: 1.345
中位数: 3
四分位距: 2

现在注意当我们添加一个大的异常值时会发生什么:

数据向量: [1, 2, 2, 3, 3, 4, 5, 100]
平均值: 15.0
标准差: 33.941
中位数: 3
四分位距: 2

平均值增加了一倍多,标准差增大了十倍以上。然而,中位数和四分位距变化不大。异常值对这些指标的影响通常要小得多。这些指标在存在异常值时的相对稳定性,对后续的一些识别算法很有用。

对建模的影响

异常值也会使基于数据创建的模型产生偏差。

考虑以下数据及其线性模型,看起来拟合得很好。现在注意在不同位置引入异常值时会发生什么。模型会偏向异常值,而偏离数据中的线性趋势。通过忽略此类异常值,通常可以提高模型的准确性。

如何识别异常值?

所有这些场景都有一个共同点:需要识别异常值。那么,你该如何进行呢?

没有一个关于数据点必须偏离多远或多不同才能成为异常值的通用定义。定义这些异常值阈值应始终根据你对具体情况和需求的理解,逐案进行。

识别异常值的方法有很多,无法在此一一涵盖。以下是几种流行的异常值界限定义方法:

  • 均值±3倍标准差:适用于正态分布的数据。但由于平均值和标准差对异常值都很敏感,在偏态数据或存在大异常值时,界限可能会发生显著偏移。
  • 四分位距法:界限为第一四分位数减去1.5倍四分位距,以及第三四分位数加上1.5倍四分位距。此方法对一般分布更有用,且不受极端异常值影响。
  • 中位数绝对偏差法:界限为中位数±3倍缩放后的中位数绝对偏差。此方法同样对一般分布有效,且对极端值稳健。

此外,移动均值或移动中位数方法可用于识别信号上的瞬态尖峰或其他未超出范围但表现异常的离群数据点。

如何处理异常值?

总结一下,一旦你在数据中识别出异常值,你可以:

  • 保留它们
  • 将其隔离进行分析
  • 删除它们
  • 甚至替换它们

正如没有放之四海而皆准的异常值定义或识别方法一样,也没有处理它们的预定义方法。最终,需要你运用对数据的最佳判断和知识来决定如何识别异常值,以及如何处理识别出的异常值。

总结

本节课中,我们一起学习了异常值的概念、它们对数据分析和建模的潜在影响,以及几种识别异常值的常用统计方法。理解并妥善处理异常值是数据清洗和预处理的关键步骤,有助于获得更可靠的分析结果和模型性能。

22:调查异常值 🕵️

在本节课中,我们将学习如何使用MATLAB工具来识别和处理数据集中的异常值。我们将以航班数据为例,探索航班延误和速度等指标,并应用不同的异常值检测方法。

上一节我们介绍了一些关于异常值的基本概念。本节中,我们来看看如何将这些概念应用于实际的航班数据,并使用MATLAB工具进行识别和处理。

航班晚点可能令人非常沮丧。但我们需要了解,与计划时间相比,典型的偏差是多少。为了调查这一点,我们计算从登机口到登机口的实际耗时与计划耗时的差值。

绘制结果后,我们发现大多数航班的偏差在正负一小时以内。但图中也显示存在相当多的异常值。由于数据点过于密集,我们很难准确评估其分布情况。

让我们使用直方图来获得更清晰的图像。大多数偏差集中在一小时以内,但在这个范围内的分布并不均匀。我们希望能看到更多细节,但一些较大的异常值影响了可视化的效果。

那么,如何处理这些异常值呢?MATLAB中有两个主要函数可以帮助我们:isoutlierrmoutliers

正如您可能从名称中猜到的,isoutlier 帮助您识别异常值以便进一步分析,而 rmoutliers 则负责检测并移除它们。

回顾一下之前提到的三种常见的异常值分类方法。

以下是这三种方法:

  • 标准差法。
  • 四分位距法。
  • 中位数绝对偏差区间法。

由于我们知道存在非常大的异常值,因此选择中位数绝对偏差法。应用此方法后,数据分布的核心部分变得清晰得多。我们注意到,大多数航班的实际耗时少于计划时间。

为了查看更多数据,您可以使用 rmoutliersthresholdfactor 参数来调整用于分类异常值的区间数量,其默认值为3。

接下来,让我们看看飞机离开登机口之前的情况。我们来观察起飞延误的分布。在这种情况下,异常值非常大,以至于几乎整个分布图看起来都是空的。这次,我们来比较一下三种常见的异常值分类方法。

首先,我们计算标准差法的边界,并将它们作为红色垂直线添加到直方图中。然后,用蓝色线表示四分位距法,用黑色线表示中位数法。看起来它们略有不同。

但由于包含了所有数据范围,我们很难看清细节。

您可以放大以获得更好的视图,或者重新生成图形以仅显示您感兴趣的部分。请注意,标准差法延伸到了大部分为空的区域,这并不理想。另外两种方法看起来可能会导致过多的数据丢失。所有这些方法的对称性意味着缩放它们无法同时解决这两个问题。

在这种情况下,您可能需要使用可以根据需要调整的、非对称的边界。一种方法是使用百分位数阈值。让我们看看1%到99%的百分位数边界是什么样的。百分位数边界可以根据需要调整,以消除或保留尽可能多的数据。

只有1%的起飞延误超过160分钟。但请记住,有些延误接近2000分钟,超过了一整天。起飞延误超过24小时的情况似乎相当可疑,可能值得进一步调查。

那么,您的数据中是否还有其他值得关注的异常值呢?当然有。我们可以使用 groupsummary 函数计算每天的取消航班数量,并将结果与计划起飞时间进行对比绘图。在这种情况下,视觉识别就足够了。您可以看到从26日到28日有些异常情况。

让我们检查一下1月27日取消离港和到港航班最多的前10个机场。看起来主要是美国东北部的机场。快速在线搜索显示,该地区在这一天遭遇了一场特大暴风雪。

思考航空旅行耗时的另一种方式是“登机口到登机口速度”,即总飞行距离除以从出发登机口到到达登机口的耗时。看起来平均速度最常见的是在每小时300到400英里之间。但有些航班的速度似乎出奇地慢,甚至低于典型的高速公路速度。

在移除任何异常值之前,请考虑这种分布可能是飞行距离的函数。将平均速度作为距离的函数进行绘图,证实了平均速度与总距离之间存在关系。因此,仅基于速度本身的分布来定义异常值可能没有意义。

让我们看看最大平均速度作为距离的函数。这里似乎有一些异常值。由于异常值只有在我们将速度与距离进行对比绘图时才显现出来,因此使用移动窗口会很有用。您可以将 isoutlier 与移动均值或移动中位数结合使用。

例如,一个基于300个数据点的移动均值分类可以这样实现:

TF = isoutlier(velocity, 'movmean', 300);

您可以使用 isoutlier 函数的输出来可视化结果。首先,将移动下界绘制为红线。然后,添加上界。最后,可以使用函数返回的索引来高亮显示被分类的异常值。

现在,您已经看到了几个在MATLAB中调查和处理异常值的例子。接下来轮到您了。请花些时间扩展此处展示的脚本,继续本分析未完成的部分,或者在航班数据的其余部分中寻找您自己感兴趣的趋势和要点。

本节课中,我们一起学习了如何利用MATLAB的 isoutlierrmoutliers 函数,结合标准差、四分位距、中位数绝对偏差以及百分位数等多种方法,来识别和处理数据集中的异常值。我们通过分析航班延误和速度数据,实践了从可视化识别到算法检测的完整流程,并探讨了在特定场景下(如速度与距离相关时)如何选择合适的异常值检测策略。

23:标准化数据 📊

在本节课中,我们将要学习数据标准化(或归一化)的概念、原因以及两种主要方法。我们将通过一个披萨店选择的例子,理解为什么不同尺度的数据会影响机器学习算法的决策,并学习如何通过标准化来解决这个问题。


想象你正在两家披萨店之间做选择:阿尔弗雷多披萨咖啡馆和阿尔弗雷多披萨店。

你无法做出决定,所以想让计算机帮你选择。

假设你给计算机两个信息:口味配送时间

阿尔弗雷多披萨店的配送速度更快,但口味不佳。另一方面,阿尔弗雷多披萨咖啡馆的配送速度较慢,但口味更好。

你可能不介意为了美味的披萨多等一会儿,但计算机将如何选择?

计算机只关心数字。对它而言,数据图实际上是这样的:数字是均匀分布的,因此X轴(配送时间)现在看起来比Y轴(口味)长10倍。

这种视图使得配送时间看起来比口味重要得多,仅仅因为配送时间的数值比口味的数值大。

为了确保计算机将每个变量视为同等重要,你需要对数据进行标准化。数据标准化是将不同变量转换到相似尺度的过程,以便它们可以直接比较。这个过程有时也被称为数据规范化

对于某些类型的机器学习算法来说,这可能是数据准备的关键步骤。

为了说明其中一种算法,假设你收集了几家披萨店的数据,并将它们标记为“好”或“坏”。以下是两组数据的散点图。你想训练一个模型,使用口味和配送时间值将一个新的数据点归类为“好”或“坏”。

一些机器学习算法会根据点之间的距离进行预测。这样的算法会将这个数据点分配给距离它最近的组。

但是,请记住,算法使用的是数值,所以它的视图实际上更接近这样:因为口味值的范围较小,配送时间值在确定到特定组的距离时将重要得多。

假设新店需要25分钟配送披萨。无论披萨口味多好,算法都会将其分配给“坏”组,因为这些数据点总是更近。

标准化数据将通过确保每个变量对距离计算的贡献相等来防止这个问题。


一种常见的标准化类型是将数值缩放到0和1之间,使得最小值变为0,最大值变为1。

请注意,现在两个轴具有相同的范围,因此它们被正确地显示为具有相同的长度。

现在,如果新的数据点有足够高的口味值,即使配送时间很短,它也会更接近蓝色的数据点。因此,算法会将其分配给“好”组。

这种将数据缩放到0和1之间的标准化方法,对于具有明确定义的最小值和最大值的均匀分布非常有效。


但对于正态分布呢?在这种情况下,更好的标准化选择是Z分数

Z分数的计算方法是:取任何正态分布(这里用变量x表示),首先减去均值(通常用希腊字母μ表示)。这将分布平移,使均值为0。

然后,数据除以标准差(这里用字母σ表示),这会缩小或扩大分布的范围,使其标准差为1。

如果你为之前直方图中的数据计算Z分数,新的直方图看起来会一样,只是现在的数值范围大约在-3到3之间。

现在,这些数据可以用于需要与其他单位和尺度进行比较的机器学习算法中。


请注意,并非所有机器学习算法都使用距离作为度量标准,有些算法可以轻松处理不同尺度的变量。在这些情况下,你不必标准化数据,因为这不会影响结果。但如果你想尝试多种模型,标准化是一个好主意。

最终,这取决于你的具体情况。尝试多种方法并找出最适合你特定数据集的方法是很好的实践。理解为什么以及如何使用标准化技术的基础知识是重要的第一步。


在本节课中,我们一起学习了数据标准化的核心概念。我们了解到,当数据特征具有不同尺度时,机器学习算法可能会做出有偏的决策。为了解决这个问题,我们介绍了两种主要的标准化方法:最小-最大缩放(将数据缩放到0-1范围)和Z分数标准化(基于均值和标准差)。标准化确保了每个特征在模型训练中具有同等的重要性,这对于基于距离的算法尤为关键。

24:标准化数据示例

在本节课中,我们将学习如何在MATLAB中对数据进行标准化处理。我们将了解标准化的重要性,并实践几种不同的标准化方法,包括Z分数、范围缩放和稳健Z分数,以处理不同分布类型的数据。

上一节我们了解了标准化对于比较不同单位和量纲的变量的重要性。本节中,我们将学习如何在MATLAB中执行不同类型的标准化。

首先,我们从航班数据集中加载九月份的数据,并筛选出从旧金山飞往洛杉矶国际机场的航班子集。

以下是加载和筛选数据的示例代码:

% 加载数据并筛选特定航线
flights = readtable('flights_data.csv');
sf_to_lax = flights(flights.Origin == 'SFO' & flights.Dest == 'LAX' & flights.Month == 9, :);

接下来,我们为airtime(飞行时间)列创建直方图。数据显示出近似正态分布,但存在一些异常值。

以下是创建直方图的代码:

% 绘制飞行时间的直方图
histogram(sf_to_lax.Airtime);
title('Distribution of Airtime (Original)');
xlabel('Airtime (minutes)');
ylabel('Frequency');

我们可以使用rmoutliers函数来移除这些异常值。

以下是移除异常值的代码:

% 移除飞行时间中的异常值
sf_to_lax_clean = rmoutliers(sf_to_lax, 'DataVariables', 'Airtime');

处理后的数据分布更清晰。请注意,这里指定了直方图的箱数,这将便于与标准化后的直方图进行比较。

为了标准化airtime数据,我们使用normalize函数。该函数以表格中的一列作为输入,并返回其标准化版本。

以下是使用默认方法(Z分数)进行标准化的代码:

% 使用默认的‘zscore’方法标准化飞行时间
airtime_normalized = normalize(sf_to_lax_clean.Airtime);
% 或直接添加到表中
sf_to_lax_clean.AirtimeNormalized = normalize(sf_to_lax_clean.Airtime);

让我们再次检查直方图。它看起来形状完全相同,但请注意X轴的单位。数值范围从原来的50到70分钟,变成了大约-3到3。这些值已被转换为Z分数,这是normalize函数的默认方法。

这种标准化很有用,因为你可以将这些值理解为以标准差为单位。例如,一个标准化后的飞行时间值为+1,意味着原始值比平均值高一个标准差;而值为-2,则意味着原始值比平均值低两个标准差。

现在,我们可以利用标准化来比较具有不同范围的变量。对departure delay(起飞延误)变量重复此标准化过程,并创建飞行时间与起飞延误的散点图。

以下是标准化延误并绘制散点图的代码:

% 标准化起飞延误并绘图
depdelay_normalized = normalize(sf_to_lax_clean.DepDelay);
scatter(airtime_normalized, depdelay_normalized);
xlabel('Normalized Airtime (z-score)');
ylabel('Normalized Departure Delay (z-score)');
title('Normalized Airtime vs. Departure Delay');

departure delay的值并非正态分布,因此Y轴上的范围有所不同。尽管如此,两个变量标准化后的值都具有均值为0、标准差为1的特性。这就引出了一个问题:如何对非正态分布的值进行标准化?

normalize函数提供了多种方法来实现这一点,你可以通过添加额外的参数来指定要使用的方法。

让我们从一个具有明确定义范围的均匀分布开始。我们使用hour函数和计划的起飞时间变量来创建departure hour(起飞小时)变量。

以下是创建起飞小时变量的代码:

% 从计划起飞时间中提取小时
sf_to_lax_clean.DepHour = hour(sf_to_lax_clean.CRSDepTime);

这些值的范围是6到22,这意味着从旧金山飞往洛杉矶的航班,计划起飞时间在早上6点到晚上10点之间。

你可以通过指定‘range’方法,将这些值缩放到最小值和最大值之间(默认为0到1)。

以下是使用范围缩放方法的代码:

% 使用‘range’方法标准化起飞小时
sf_to_lax_clean.DepHourNormalized = normalize(sf_to_lax_clean.DepHour, 'range');

让我们再次检查直方图。现在所有值都在0到1之间,而不是原来的6到22。这种标准化对于像起飞小时这样均匀分布的变量来说是一个不错的选择。

现在让我们回到像起飞延误这样既非均匀也非正态分布的变量。除了标准Z分数,一个选择是通过在‘zscore’后添加‘robust’标志来计算其稳健版本。

这个标志将使用中位数绝对偏差而不是标准差来缩放数据的范围。你可能记得,中位数绝对偏差是MATLAB中一种异常值检测方法。这是因为与标准差相比,这个统计量受异常值造成的扭曲影响较小,因此对于此类非正态分布是一个很好的选择。

以下是计算稳健Z分数的代码:

% 使用稳健Z分数方法标准化起飞延误
depdelay_robustz = normalize(sf_to_lax_clean.DepDelay, 'zscore', 'robust', true);

标准化后,你可能会注意到值的范围变小了,但仍然比之前使用标准Z分数时看到的范围大得多。这是因为大的正异常值对缩放的影响较小,所以即使标准化后,值仍然很大。

为了将范围减小到与之前相当的水平,你可以先移除异常值,然后再进行标准化。别忘了,你可以选择一个阈值因子来指定哪些值应被视为异常值。

以下是先移除异常值再标准化的代码:

% 先移除异常值,再进行标准化
sf_to_lax_nooutliers = rmoutliers(sf_to_lax, 'DataVariables', 'DepDelay', 'ThresholdFactor', 3);
depdelay_clean_normalized = normalize(sf_to_lax_nooutliers.DepDelay, 'zscore', 'robust', true);

让我们再次检查直方图。现在看起来好多了,意味着标准化后的值具有合理的范围。现在,这个变量可以更容易地与其他变量进行比较,例如之前的飞行时间值。

你可以查看normalize函数的文档页面,了解其他标准化数据的方法。根据数据分布方式的不同,你可能需要对不同的变量使用不同的方法。

本节课中我们一起学习了:

  1. 使用normalize函数创建表格变量的标准化版本。
  2. 事先移除异常值可以产生更好的结果。
  3. 根据数据的分布选择适当的标准化方法,可能需要对不同的变量使用不同的方法。

现在,轮到你尝试在一个分级问题中标准化数据了。

25:平滑数据 📊

在本节课中,我们将要学习数据平滑技术。数据平滑是数据科学中一项重要的技术,它通过移除数据中不想要的波动或噪声,来揭示数据背后隐藏的趋势。

数据科学的一个重要部分是处理大量信息,并找出隐藏在数据中有意义的故事。平滑技术可以帮助你完成这项任务。

上一节我们介绍了数据平滑的基本概念,本节中我们来看看平滑技术的一些具体细节和应用。

首先,让我们介绍一些术语。平滑技术只应用于索引数据,也就是说,数据点具有特定顺序的数据。索引数据的一个好例子是按时间索引的信号。信号中的每个点都有一个对应的时间,这个时间定义了数据点的顺序。

区分索引数据和非索引数据非常重要,因为平滑方法一次只处理一小块数据。这些数据块有时被称为窗口。窗口会沿着数据滑动,逐点进行平滑处理。在任何给定时间,只考虑窗口内的值。随着窗口向前移动,它会留下平滑后的结果。

如果数据不是索引数据,那么数据点可以是任何顺序。滑动窗口会产生完全不同的平滑结果,具体取决于数据如何被打乱。同时,请注意,窗口的大小控制着结果的平滑程度。较短的窗口产生的平滑效果较弱,而较长的窗口产生的平滑效果更强。

让我们放大信号的一部分,看看一些不同的平滑方法是如何工作的。考虑用红色方块标记的点以及包含其左右各三个点的窗口。

以下是几种常见的平滑方法:

  • 移动平均:这是最常见的平滑类型。窗口内的所有值使用均值中位数进行平均,中心点被更改为该平均值。
  • 局部回归:这类方法为窗口内的点计算一个局部回归线。这条回归线被用来选取新的数据点。
  • 稳健方法:其他可用的选项包括对异常值不那么敏感的稳健方法,以及更高级的回归类型。

回到航班数据,我们处理的是一个包含索引数据的平均到达延误表。具体来说,延误值是按“月份分钟数”列索引的。原始的航班表不适合进行平滑,因为可能有多个航班在同一时间起飞。这些记录在表中的顺序可以是任意的,这意味着数据不是索引数据。这就是为什么需要计算每分钟的平均到达延误。

考虑这里显示的仅第一周的MeA到达延误数据。你或许能看到七组数据,分别对应每一天。你可能也能看到一个每日趋势,但信号极其嘈杂。这种噪声包括潜在的异常值,平均延误超过400分钟。你可以花时间事先移除这些异常值,但让我们看看平滑数据是否能处理这些延误。

为了探索各种平滑方法和选项,可以使用“平滑数据”实时编辑器任务。这个任务与你之前看到的处理缺失数据的任务类似。它非常适合快速探索各种方法和选项。

以下是使用实时编辑器任务进行平滑的步骤:

  1. 从表格中选择“Me到达延误”列作为输入数据。
  2. 然后选择“月份分钟数”列作为X轴。

实时编辑器任务将显示原始数据和平滑数据的可视化图。看起来默认选项的平滑效果不够,所以你可以尝试延长窗口。你可以通过增加平滑因子来实现。这个因子是一个介于0和1之间的数字,用于控制移动窗口的大小。接近1的值使用较长的窗口,而接近0的值使用较短的窗口。将此值更改为0.75。现在,你可以在嘈杂的原始数据中清晰地看到一条平滑曲线。

这也使得每日趋势更加明显。看起来平均到达延误在一天中逐渐增加,然后回落,尽管这种趋势在某些日子里比其他日子更显著。

为了明确回答到达延误是否存在每日趋势的问题,让我们尝试将所有天的数据平均起来。

具体操作如下:

  1. 在Fs表中,不再使用“月份分钟数”,而是创建一个“一天中的分钟数”变量,该变量记录自午夜以来经过的分钟数。
  2. 然后使用groupsummary函数,以“一天中的分钟数”作为分组变量。
  3. 当你绘制结果时,可以看到这个信号在清晨时分特别嘈杂,因为这段时间只有少数航班。大多数航班安排在早上6点之后。
  4. 由于你只关心整体趋势,可以从表中移除额外的行,只考虑一天中的主要部分。
  5. 然后,插入另一个“平滑数据”实时任务,并像之前一样选择变量。
  6. 同样,默认选项似乎平滑效果不足。尝试再次增加平滑因子,或者从下拉菜单中选择不同的方法,例如局部线性回归。尝试不同的方法以找到最适合你数据的方法是很有帮助的。

通过这些选项,潜在的趋势变得清晰。平均延误在一天中持续增加,直到大约1100分钟(接近下午6点)达到峰值。之后,平均延误开始下降。

就是这样。你现在已经证明了存在一个明显的每日趋势。换句话说,你知道一天中的时间可以在某种程度上预测到达延误的程度。为了重现你的分析,请记住你可以生成实时任务中使用的代码。在这种情况下,实际的平滑操作是由smoothdata函数执行的。

本节课中我们一起学习了数据平滑。总结一下,平滑数据是移除数据中不想要的噪声的过程。它可以帮助你找到被噪声掩盖的隐藏趋势。它要求数据以某种方式被索引或排序,因为平滑方法是逐块处理数据的。请记住,有多种方法可供选择,尝试不同的方法并选择最适合你数据的一种。最后,“平滑数据”实时编辑器任务使你能够快速探索各种方法和设置,并生成可用于重现步骤的代码。

现在轮到你练习平滑数据了。

模块3:数据清理总结 🧹

在本节课中,我们将回顾模块3“数据清理”的核心内容,总结处理原始数据中常见问题的方法与思路。

你已经完成了模块3的学习。在继续测验之前,让我们花几分钟时间回顾一下到目前为止学到的知识。

原始数据通常包含不规则之处,需要进行清理,以便为深入分析做好准备。

例如,你的数据中可能存在缺失条目,或者存在一些与整体趋势不符的异常数据点。

你看到了缺失条目和异常值可能影响分析的几种方式,从导致统计计算偏差到使可视化效果不佳。

你也看到了噪声、短期波动或不当的数据缩放如何掩盖数据中更大的趋势。

由于并非所有缺失数据都相同,处理它的最佳方法取决于其根本原因以及你试图回答的问题。

你练习了识别缺失数据,以及根据需要保留、删除或填充缺失数据的技术。

你也学习了识别异常值的潜在原因和方法。由于没有关于什么构成异常值的统一定义,你学会了使用可视化来辅助分析,并确定识别它们的最佳方法。

你了解到,有时需要移除异常值,而有时则需要将它们提取出来作为关注点。

你练习了处理这两种情况所需的技能。

你还学习了如何平滑和归一化数据,这使你能够发现之前被隐藏的趋势和相似性。

在本模块的最后,你通过一个示例综合运用了所学概念,以确定航班量与星期几之间是否存在关系。

请记住,你采取的数据清理方法取决于数据类型、具体情况和分析目标。

现在,是时候通过完成模块3的测验来检验你的知识了。

如果你遇到困难,可以回顾课程内容或在论坛中提问。祝你好运。

在本节课中,我们一起回顾了数据清理的核心概念,包括处理缺失值、识别与处理异常值、以及通过平滑与归一化揭示数据趋势。掌握这些技能是进行有效数据分析的重要基础。

模块4:寻找重要特征介绍 🎯

在本节课中,我们将要学习数据科学流程中的关键一步:特征工程。我们将了解什么是特征,如何从数据中提取和构建特征,以及如何评估和选择对模型预测最有价值的特征。

上一节我们介绍了数据清洗与整理,本节中我们来看看如何为构建预测模型准备数据。

例如,你可能希望使用航班数据来创建一个预测到达延误的模型。

但在构建模型之前,你需要决定模型将使用哪些特征。

特征 是指数据中对你要解决的问题有意义的一条信息。你将使用特征来教导或训练你的模型进行预测。将数据转化为特征的过程称为 特征工程。这是一个高度迭代的过程,也是本模块的重点。

你将从数据中提取特征开始。

这个过程可能简单到只是选择正确的数据片段。

例如,航班的起飞时间可能是预测到达延误的一个好特征。在其他情况下,提取特征可能需要更复杂的计算和数据转换。

以下是另一种生成特征的常见方法:通过无监督学习。你将学习如何使用聚类等无监督学习算法,通过发现数据中隐藏的关系和模式来揭示新的特征。

一旦你识别、构建或提取了一组特征,你需要确定哪些特征将帮助你的模型做出准确预测,哪些不会。在本模块中,你将学习几种基于统计特性来评估特征间关系的技术。

但是,随着可用数据量的不断增长,潜在特征的数量也在同步增加。通过应用 主成分分析(PCA),你将能够从最少数量的特征中提取最具预测性的价值,从而帮助你处理即使是最大的数据集。

在本模块结束时,你将能够将一个数据集转化为一组具有高度预测性的特征。

所以,让我们开始学习特征工程。

本节课中我们一起学习了特征工程的基本概念及其重要性。我们了解到,特征是从原始数据中提取的、对解决特定问题有意义的信息,而特征工程就是创造和选择这些特征的过程。接下来,我们将深入探讨具体的特征提取、构建和选择技术。

28:特征工程介绍 🎼

在本节课中,我们将要学习特征工程。特征工程是为预测模型准备数据的重要步骤。

一个特征是你试图描述对象的属性。多个独立特征的集合构成一个观测样本,而多个观测样本的集合则构成一个数据集。数据科学家的任务就是将这些特征作为预测变量用于模型中。模型的优劣完全取决于你输入的数据质量。因此,通常需要通过特征工程来揭示数据中隐藏的趋势,以供模型识别。

例如,考虑这个包含医院患者信息的数据集,其中每一行代表一个人。

首要问题是,能否仅凭年龄、身高、体重和位置这些原始变量,准确地对每个人的健康状况进行分类?

起初,你可以直接将原始变量输入模型并尝试比较,例如健康状况与体重或身高的关系。然而,简单的可视化显示,这些变量本身并不擅长预测健康状况,因为它们之间没有明显的相关性。

那么,你能做什么呢?你可以开始特征工程的过程。你会发现,通过应用领域知识来生成有用的特征,可以提高模型的预测能力。实际上,你可能已经这样做过。还记得在航班数据集中合并滑入和滑出时间吗?那就是特征工程的一个例子。

在本视频中,你将使用患者数据集来探索如何利用领域知识进行特征工程。😊 你会发现,有许多特征比单独的原始变量能更好地预测健康状况。

在这个过程中,你将应用三种通用的特征生成方法。

以下是三种主要的特征生成方法:

  1. 变量转换:对现有变量应用公式以创建新特征。例如,一个人的身体质量指数(BMI)是其体重除以身高的平方。你可以将这个新特征作为变量添加到表中。可视化BMI显示,它确实比单独的体重或身高与患者健康状况的相关性更好。

    • 公式BMI = weight / height^2
  2. 离散化:使用数值变量将数据分组。这很有帮助,因为有时变量的重要方面不是其精确值,而是其所在的范围。例如,年龄变量自然适合将患者分为三类:儿童、成人和老年人。然后,你可以将这个分类变量作为新特征添加到表中,并使用热图来可视化年龄类别与健康状况的关系。

  3. 分组汇总:总结数据中的组别信息。例如,患者的体重与其同龄组的其他人相比如何?为了找出答案,计算每个类别的平均体重,然后将这个结果作为新变量连接到你的表中。接着,你可以计算每个个体与平均体重的差值。

这些方法中的每一种都可以应用于任何数据集,但具体的实现依赖于你对数据本身的知识。理论上,你可以生成无限多的新特征,但只有有限的几个真正有用。

那么,如何知道一个特征是否值得保留呢?有一些定量的方法可以用来选择特征,这些内容将在后面详细介绍。

但在评估一个特征的有用性之前,请考虑你已经掌握的关于数据及其代表意义的知识。

以下是一些定性测试,有助于判断一个变量是否可以被视为有用的特征:

  • 具有变异性:如果一个变量在整个数据中是恒定的,那么它就没有预测能力。例如,如果有一个关于患者家乡州的列,而所有患者都恰好来自佛罗里达州,那么这个变量就不是一个有用的特征。
  • 非随机性:与你的响应变量相比,有用的特征不应表现出随机行为。例如,患者的健康状况是否与其医院的位置有关?热图表明,至少对于这个小样本量,分布很可能是随机的。


    因此,位置变量不应作为特征包含在你的模型中。
  • 包含独特信息:如果你通过将体重从公斤转换为磅来创建一个新变量,那么它就是冗余的,并且不会为你的模型增加任何新信息。
  • 基于直觉或领域知识:最有用的特征通常源于你的直觉或领域知识。例如,之前你计算了BMI以更好地预测健康状况。然而,你也可以发明任何其他类型的指数,例如将患者的体重除以年龄的平方,或者涉及所有三个数值变量的更复杂公式。但是,这样的指数究竟代表什么呢?这就是你的领域知识无价的地方,它帮助你设计出有意义的特征。

最后,请记住,预测模型的好坏完全取决于你输入的特征。

因此,从原始数据中设计有用的特征是有益的;然而,这个过程可能更像一门艺术而非纯粹的科学,所以在实验过程中要做好大量试错的准备。

本节课中,我们一起学习了特征工程的基本概念、三种核心方法(变量转换、离散化、分组汇总)以及如何定性评估特征的有用性。特征工程是提升模型性能的关键步骤,它依赖于对数据的深入理解和创造性思考。

29:无监督学习介绍 🧠

在本节课中,我们将要学习机器学习的一个重要分支——无监督学习。我们将了解它与监督学习的区别,并探索如何利用无监督学习技术从数据中发现隐藏的模式和分组,从而创建新的特征。

概述

在创建特征时,数据科学家通常从寻找数据中的关系开始。这些关系使他们能够根据一个变量的值来预测另一个变量的值。

有些关系很容易被发现。例如,你在这个散点图中注意到了什么关系?

图中存在一个清晰的线性趋势,你可以用它来根据给定的 x 值估算未来的 y 值。在此,x 被称为预测变量,而 y响应变量。在这个例子中,我们使用了事先已知的输出数据来构建模型。

监督学习

上一节我们看到了一个基于已知输出关系构建模型的例子。这种技术被用于机器学习的一个分支,称为监督学习。换句话说,一个已知的关系被用来监督或指导创建一个模型,该模型可以根据输入数据预测未来的响应。

然而,你并非总是能事先获得输出数据。这是否意味着你就无法使用机器学习了呢?

发现数据中的其他关系

让我们再仔细看看这个数据集。

你还能在数据中看到其他关系吗?请记住,关系并不仅限于趋势。关系也可以是表现为模式或分组的相似性。

看起来这些观测点可以被分成两个。可能存在某种独特的特性或属性导致了这些群组的形成。掌握这种分组信息可能有助于你更好地理解数据。

由于这些信息在原始数据集中并不存在,因此每个观测点的组别编号可以被捕获为一个新特征

无监督学习

用于识别数据中模式或分组的技术,被用于机器学习的第二个分支,即无监督学习

在无监督学习中,没有响应变量来对比结果。相反,输入变量之间的关系被用来定义数据的结构。

当你不确定数据可能包含什么信息时,这种技术在探索数据时非常有用。

理解分组结果的挑战

无监督学习的一个挑战在于理解分组的含义。

当簇的数量较少或数据集规模较小时,你或许可以利用领域知识来识别这些分组的特征是什么。

以下是几个例子:

  • 如果图中包含的是汽车性能数据,这些簇可能由燃料类型(如汽油、柴油)导致。
  • 如果数据来自太阳能电池阵列的输出,则可能是白天和黑夜的区别。

对于像这样的简单二维示例,可以用一个单一特征来创建分组。

然而,通常数据科学家处理的是大型的多维数据集。无监督学习仍然可以识别数据中的群组,但这些共同特征往往是复杂的模式,可能没有明确的现实世界解释。你将在后续课程中学习评估和选择哪些特征应包含在模型中的技术。

总结

本节课中我们一起学习了特征如何帮助你识别数据中的关系,这些关系最终帮助你创建能够基于输入值预测响应值的模型。

你可以通过多种方式创建这些特征:

  • 你可以运用领域知识来组合和转换现有变量,正如之前所学。
  • 你也可以使用无监督学习来识别数据中你可能不知道其存在的模式和分组。

接下来,你将学习一些可用于在数据中寻找簇的不同技术。

30:聚类算法介绍 🧩

在本节课中,我们将学习聚类算法。聚类是数据科学家在数据集中寻找隐藏模式或分组的最常用方法之一。我们将了解几种核心的聚类算法,包括K均值、K中心点、谱聚类和高斯混合模型,并探讨它们各自的适用场景。

聚类算法通常使用迭代过程,将每个数据点分配到与其最相似的组中。

K均值算法详解

为了更好地理解聚类步骤,让我们通过K均值算法来演示一个简单的例子。

首先,选择你想要识别的组数。这个数字通常用 K 表示,这也是K均值算法中“K”的由来。算法通常会随机选择K个数据点作为初始点。

每个点作为一个组的中心,称为质心

剩余的数据点被分配到它们最相似的组。对于K均值算法,这意味着分配到它们距离最近的质心所在的组。

接下来,更新质心的位置。新的位置是每个组中所有数据点的X和Y坐标的均值

一旦质心移动,所有数据点将根据它们与当前哪个质心最近而被重新分配到相应的组。

这些步骤会重复进行,直到组内所有点与其质心之间的距离之和达到最小。

最终的结果是生成一个新的特征,用于标识每个数据点属于哪个组。

这个例子展示了如何使用K均值对数据进行聚类。然而,可供选择的聚类算法有很多,并且根据所使用的算法,结果可能会有所不同。

常见聚类算法介绍

接下来,我们将花几分钟时间介绍其中一些算法。你将了解到K均值、K中心点、谱聚类和高斯混合模型。

K均值算法

K均值是最著名的聚类方法。它是一种简单、高效的方法,最适合创建圆形的簇。它通常是探索数据时使用的第一个算法。

其结果可以作为与其他方法进行比较的基线。正如刚才所见,数据点根据它们与质心的距离进行分组。

由于起始点是随机选择的,可以使用 replicates 选项来执行多次不同起始点的聚类,并返回总距离最小的结果。

默认情况下,距离使用平方欧几里得距离计算。不过,还有其他几种常见的距离度量方法可供选择。

以下是可用的距离度量选项:

  • 欧几里得距离
  • 曼哈顿距离
  • 余弦距离

你使用哪一种取决于你的数据和聚类算法。你可以查阅文档以了解所有可用选项。你可以通过在函数调用中包含 distance 选项来更改使用的距离度量。

K中心点算法

根据数据的分布情况,中位数可能比均值更能代表中心。在这种情况下,应使用K中心点算法。

K中心点的选项与K均值类似。由于使用了中位数,它可以减少异常值对聚类的影响,或者在均值不适合数据的情况下使用。

K中心点的一个特点是,被称为中心点的中心始终是该组中一个现有的数据点

谱聚类算法

前面的算法在组与组之间是线性可分的情况下效果很好。但如果你的数据看起来像下图这样呢?

你可以清楚地看到三个组,但由于这些组相互环绕,K均值和K中心点算法将无法有效工作。

谱聚类算法更适合处理这种分布。它们查看每个点与其邻居之间的距离,并根据相似性分配组。

当你知道要查找的组数时,可以使用 spectralcluster 函数。当你不知道时,可以使用DBSCAN算法。两者默认都使用欧几里得距离,但你可以使用 distance 选项进行更改。你可以在文档中查看所有可用选项。

在这个例子中,DBSCAN能够在不指定簇数量的情况下找到相同的簇。这对于难以直观估计簇数量的高维数据集尤其有用。

DBSCAN的输入参数是:数据、一个称为 epsilon 的半径,以及一个最小点数。

该算法将所有点标记为核心点边界点噪声点

  • 核心点:在其 epsilon 半径内至少有最小点数。
  • 边界点:在其 epsilon 半径内没有最小点数,但位于某个核心点的 epsilon 半径内。
  • 噪声点:所有其他点。

一个簇由所有彼此在 epsilon 距离内的核心点和边界点组成。DBSCAN的一个独特之处在于,噪声点不会被分配到任何簇。因此,这个函数也可以用来识别异常值。

高斯混合模型

最后,对于重叠的分布呢?重叠区域中的点应该被分配到哪个簇?

高斯混合模型使用概率来确定将每个数据点分配到哪个簇。

你首先指定要查找的簇的数量。然后,将相同数量的高斯分布拟合到数据中。

接着,计算每个点来自每个分布的概率。

有几种方法可以进行实际的簇分配,但在最简单的情况下,每个点被分配到概率最高的分布。

在查看数据时,概率曲线可以描绘为簇周围的椭圆

每个特征的方差会影响椭圆的形状。当所有特征的方差相同时,结果是一个圆或球体。当方差不同时,结果是一个能更紧密地包围簇数据的椭圆。

使用高斯混合模型时,首先确定要创建的簇的数量。

接下来,使用 fitgmdist 函数将高斯混合模型拟合到数据。

然后,通过将拟合结果和数据传递给 cluster 函数来进行簇分配。

输出是一个向量,包含每个点的簇分配结果。

总结

本节课中,我们一起学习了聚类算法。聚类算法能够识别数据中的隐藏模式或分组。

最适合使用的算法将取决于你的数据特点。

你需要的许多聚类算法都已内置在MATLAB中。

文档提供了详细的说明和示例,可以帮助你快速入门。

31:评估特征 🎯

在本节课中,我们将学习如何评估和选择对预测模型有价值的特征。特征选择的目标是保留有价值的特征,舍弃无用的特征,从而提升模型性能、简化模型解释并提高计算效率。

特征选择方法概述

预测模型利用一个或多个特征(如发动机重量)与响应特征(如马力)之间的关系进行预测。如果引入与响应无关的特征(如汽车颜色),不仅不会带来额外收益,甚至可能损害模型性能。

特征选择方法主要分为三类:封装法、嵌入法和过滤法。

封装法

上一节我们介绍了特征选择的目标,本节中我们来看看第一种方法——封装法。

封装法通过训练和评估使用不同特征组合的预测模型,然后选择能提供最佳模型性能的特征子集。

嵌入法

了解了封装法后,我们来看第二种方法——嵌入法。

嵌入法是一类机器学习模型,它们在模型训练过程中自动执行特征选择。其结果是得到一个训练好的模型,该模型会强调有用的特征,弱化其他特征。

封装法和嵌入法都依赖于模型性能来指导特征选择。在本专业的后续课程中,你将学习如何使用这些技术。

过滤法

与上述两种方法不同,过滤法在训练模型之前应用。它们基于预测变量的统计特性及其与响应的关系。过滤法独立于模型,常与封装法或嵌入法结合使用。

本视频的剩余部分将探讨三种常见过滤技术背后的主要思想:方差阈值法、协方差与相关性,以及特征独立性的统计检验。

1. 方差阈值法

我们从方差阈值法开始,其指导原则很简单:预测模型利用预测变量值的变化来估计响应变量相应的变化。因此,值变化不大的特征不太可能有帮助。

第一步是通过计算方差来确定每个预测变量的变化程度。在之前的课程中,你学习了描述分布的几种统计量,包括描述平均值或期望值的均值,以及描述值围绕均值分布的标准差

方差等于标准差的平方。一个特征的方差通过计算每个值到均值的距离、将其平方,然后对所有值取平均得到。

公式方差 = (Σ(x_i - μ)^2) / N,其中 x_i 是单个值,μ 是均值,N 是值的数量。

较大的方差通常表示更多值远离均值,而较小的方差表示更多值聚集在均值附近。

虽然直接比较两个特征的方差很诱人,但必须理解尺度如何影响方差。例如,以厘米记录的特征的方差,将是同一特征以米记录时的10000倍,尽管两个特征包含相同的信息。

因此,在计算方差之前对特征进行缩放非常重要。接下来,选择一个阈值,仅选择缩放后方差高于该阈值的特征,舍弃其余特征。

在实践中选择一个好的阈值可能有些棘手。理想情况下,你希望在一组要保留的高方差特征和一组要舍弃的低方差特征之间,看到方差的显著下降。

当方差按降序绘制时,这可能对应于一个尖锐的弯曲或“肘部”,但不一定。由于很难确定一个好的阈值,因此在使用方差阈值法时最好保守一些,转而使用考虑预测变量与响应之间关系的其他指标。

2. 协方差与相关性

其中一个衡量指标是协方差。协方差是两个项的乘积的期望值:预测变量值到预测变量均值的距离,以及响应值到响应均值的距离。

公式Cov(X, Y) = E[(X - μ_X)(Y - μ_Y)]

虽然方差总是大于或等于零,但两个特征的协方差可以是正数或负数。接近0的值表示预测变量与响应之间的关系较弱。较大(正或负)的值表示关系较强。

要理解原因,可以考虑协方差公式中每一项的符号,这些符号由特征值相对于特征均值的位置决定。

对于不相关的特征,每个预测变量项的符号与对应响应项的符号无关。

因此,乘积的符号会随机变化。当对这些乘积取平均时,由于相互抵消,结果将接近零。

对于相关的特征,每一项的符号将是相关的,因此它们的乘积将始终为正或为负。这将导致较少的抵消,并且期望值远离0。

不幸的是,协方差也受尺度影响,因此不能用于比较不同预测变量之间的关系强度。然而,当你用每个变量的标准差缩放协方差值时,结果是一个可用于比较的无量纲指标——皮尔逊相关系数

你在之前的课程中已经了解过皮尔逊相关,以下是其关键属性:

当用作特征选择工具时,相关性让你可以比较预测变量与响应之间线性关系的强度,并舍弃弱相关的特征。

除了皮尔逊相关,还有另外两种度量:斯皮尔曼相关肯德尔相关,它们在非线性数据上表现更好。需要注意的是,所有这三种度量仅能有效识别单调(即严格递增或递减)关系。识别和评估其他类型的非线性关系需要更高级的技术。

3. 特征独立性统计检验

最后一种过滤方法是特征独立性的统计检验。这些检验的主要思想是:两个独立特征的值在共同考虑时,应以特定方式分布。因此,可以通过分析它们的分布来计算两个特征独立的概率或P值。

当使用统计检验进行特征选择时,第一步是选择适当的检验,这取决于每个预测变量和响应的数据类型。接下来,选择一个概率阈值(称为alpha值),低于该阈值将假定预测变量和响应在统计上相关。最后,计算P值。如果P值高于阈值,则假定响应和预测变量是独立的,并消除该预测变量;否则,保留该预测变量。

计算P值的方法超出了本课程的范围,但你可以使用MATLAB来计算。在随后的实时脚本阅读中,你将学习如何使用卡方检验和方差分析检验来选择特征,并了解如何获得基于相关性检验的P值。

总结

本节课中我们一起学习了评估和选择特征的几种定量方法。我们介绍了三种主要方法:封装法、嵌入法和过滤法,并重点探讨了过滤法中的三种技术:方差阈值法、协方差与相关性分析,以及特征独立性的统计检验。理解这些方法有助于你构建更高效、更易于解释的预测模型。

32:降维与PCA介绍

在本节课中,我们将要学习一种名为主成分分析(PCA)的降维技术。我们将了解PCA如何通过寻找数据中方差最大的方向来创建新的特征集,从而在保留大部分信息的同时减少特征数量。

上一节我们介绍了如何使用特征选择方法(如方差阈值法)来保留对预测模型有用的特征。本节中我们来看看当特征间方差分布更均匀时,如何利用PCA进行更有效的降维。

降维概述

降维是数据分析和机器学习工作流中的常见步骤,它能带来与特征选择相似的益处。

以下是降维的主要优势:

  • 它使你能够将分析重点放在一个更小的重要特征子集上。
  • 这些特征子集更易于探索、总结和可视化。
  • 它有助于创建更简单、更高效的机器学习模型。

投影误差与信息损失

虽然降维有很多好处,但移除特征会损失其包含的信息。

衡量信息损失的一个指标是投影误差,即原始数据点与投影后数据点之间的总距离。

对于一个特征集,如果投影到X轴,其误差远小于投影到Y轴。然而,对于另一个方差分布均匀的特征集,投影到X轴或Y轴的误差都会很大,且没有任何一个轴能最小化误差。

主成分分析(PCA)原理

你可以通过定义一个新的轴来最小化投影误差。这个特殊轴的方向被称为特征集的第一主成分

主成分具有几个特性,使其对降维特别有帮助:

  1. 它们确定了能最小化投影误差的轴的方向。
  2. 事实证明,这个方向也是方差最大的方向。

在这个例子中,由于主成分轴捕获了大部分方差,你可以用它来定义一个新特征 P。然后,你可以用 P 替换掉 XY,从而将特征集的维度减少一维。

新特征的值是通过将原始特征值投影到新轴上,并测量从原点到每个投影点的有符号距离来确定的。这些值通常被称为主成分得分

多个主成分

到目前为止,我们只讨论了第一主成分。主成分的总数等于特征集的维度。

第二主成分 是未被第一主成分解释的、方差最大的方向。因此,它的方向与第一主成分垂直(正交)。

在超过两个维度的情况下,主成分按方差递减的顺序确定,过程如下:

  1. 首先获取第一主成分。
  2. 第二主成分位于所有与第一主成分正交的方向中,方差最大的那个方向。
  3. 第三主成分位于所有与前两个主成分正交的方向中,方差最大的那个方向。
  4. 此过程持续进行,直到只剩下一个正交方向,该方向成为最终的主成分。

结果是建立了一个新的坐标系,原始坐标轴被旋转,使得方差沿着新轴最大化。

PCA降维步骤

现在你已经了解了主成分是什么以及如何找到它们,让我们看看如何用它们来降低特征集的维度。

以下是使用PCA进行降维的关键步骤:

  1. 数据预处理:为了便于比较,所有特征应具有相似的尺度。特征集也应中心化(即每个特征的均值为零)。
  2. 计算主成分:获取主成分方向、对应的得分和方差。
  3. 选择主成分:应用方差阈值,仅保留高方差成分。另一种常见方法是设定要保留的总方差百分比,然后保留能满足此条件的最少数量的成分。
  4. 构建新特征集:无论采用哪种方法,结果都是一个新的、更低维度的特征集,其特征值由每个保留成分的得分给出。

在本课程后面,你将学习如何在MATLAB中执行主成分分析,以降低特征集的维度。

本节课中我们一起学习了主成分分析(PCA)的基本原理。我们了解到PCA通过寻找数据中方差最大的方向(主成分)来构建新的特征,从而在减少数据维度的同时,尽可能保留原始数据的信息。这是一种比简单的方差阈值法更强大的降维技术,尤其适用于特征间方差分布较为均匀的情况。

33:寻找重要特征总结

🎉

在本节课中,我们将回顾模块4所学习的核心技能,并了解这些技能如何为数据科学工作流的下一步——机器学习——做好准备。


概述

模块4的核心目标是掌握特征工程与评估技术。我们学习了什么是特征、如何从现有特征生成新特征、如何评估特征的重要性,以及如何处理复杂数据集。这些技能是构建高性能预测模型的基础。


特征工程基础

上一节我们介绍了模块的整体目标,本节中我们来看看特征工程的基础概念。

特征是用来描述数据样本的属性或变量。在预测模型中,特征的质量直接影响模型的性能。通常,一个预测模型的好坏取决于其特征集的质量。

以下是特征工程的两个主要目的:

  • 构建更多样化的模型:通过生成新特征,你可以构建比仅使用原始特征集时更多样化的预测模型。
  • 提升模型性能:通过设计能更好描述响应变量的新特征,你会发现模型的性能也会得到提升。

生成新特征的方法

除了转换或组合现有特征,还有其他方法可以生成新特征。

无监督学习可以帮助你发掘数据集中未知的关系和模式。利用MATLAB的聚类函数,你现在拥有了发现这些关系并将其转化为预测模型有用特征的工具。

例如,使用K均值聚类:

[idx, C] = kmeans(data, k); % 将数据分为k个簇

此代码将数据点分组,簇的标签idx可以作为一个新的分类特征。


特征评估技术

拥有了众多特征后,在构建预测模型时,如何区分有用和无用的特征呢?

你现在可以通过识别并应用适当的特征评估技术来回答这个问题。常见的评估方法包括:

  • 过滤法:基于特征的统计属性(如与目标变量的相关性)进行排序和选择。公式示例:皮尔逊相关系数 ρ = cov(X,Y) / (σ_X * σ_Y)
  • 包装法:使用模型的性能作为评价标准来选择特征子集。
  • 嵌入法:在模型训练过程中自动进行特征选择(如LASSO回归)。

处理复杂数据集

有时,数据集的规模和复杂性使得探索和理解都变得困难,更不用说进行特征工程和评估了。

主成分分析(PCA)是一种强大的降维技术。通过PCA,你可以分析、可视化并从复杂数据集中提取特征,而其他人可能对此无从下手。

PCA的核心是找到数据方差最大的方向(主成分)。其数学基础是特征值分解:

[coeff, score, latent] = pca(X);

其中,latent包含了各主成分的方差(特征值),coeff是主成分系数(特征向量)。


总结与展望

本节课中,我们一起学习了特征工程与评估的核心技能。我们了解了特征的重要性,掌握了生成新特征(包括通过无监督学习)的方法,学会了评估特征对模型的贡献,并掌握了使用PCA处理复杂数据集的技巧。

在下一个模块中,你将进一步磨练特征工程技能,并学习从信号、图像和自由格式文本这些数据类型中提取特征的新方法,这些技能将区分业余数据科学家与专业人士。

但在继续前进之前,是时候通过模块4的测验来测试你的特征工程与评估技能了。

34:特定领域特征工程介绍 🎼

欢迎来到本课程的最后一个模块。到目前为止,你已经学习了一个完整的工作流程,用于为机器学习准备数据集,在本案例中是航空航班数据。你从在MATLAB中探索数据开始,接着进行数据清理和组织,最后进行了特征工程。

但是,如果你的数据看起来不像航班数据表那样呢?根据你的领域,你的数据可能看起来非常不同。

那么你将如何应用特征工程呢?不用担心,无论你的领域是什么,你所学到的技术和概念仍然适用。

例如,你总是需要对数据进行预处理和清理。

但是,当你的数据不仅仅是包含数字行的表格时,你可能需要额外的能力。这就是为什么MATLAB拥有一个庞大的库集合,称为工具箱,它们包含了用于分析不同领域数据的额外功能。

你拥有来自自动驾驶汽车的视频和传感器数据吗?来自基因检测的RNA测序数据?来自零售网站的产品评论?你可以分析所有这些类型的数据,甚至更多。

在本模块中,你将探索三种常见的数据类型:信号图像文本。这些类型中的每一种都代表了一个深入的研究领域,足以填满整个课程。

因此,本模块有两个不同的目标。对于那些对其中一种数据类型不熟悉的人来说,目标是掌握一些基础知识,以便在遇到它时知道从哪里开始。对于那些已经对特定数据类型有经验的人来说,目标是在数据科学的框架内学习如何应用你的领域知识。

例如,你将使用针对每种数据类型独特的特征提取技术。你将在信号中寻找峰值,这可以显示重要事件的时间。你将在图像中定位边缘,这可以标记物体之间的边界。你将统计文本中最常见的单词,这可以揭示重要的主题和内容。这些都是简单的特征,但在回归和分类任务中可能具有很高的预测性。

在每一课中,你将使用相关工具箱中的函数来识别并应用最适合你特定应用的特征提取技术。

在本模块结束时,你将准备好将你的领域特定知识与MATLAB的功能相结合,将特征工程应用到你的数据中。那么,让我们开始吧。

35:特征工程工作流程 🎼

在本节课中,我们将学习特征工程的核心工作流程。无论处理信号、图像还是文本数据,虽然具体方法各异,但都存在一个通用的步骤序列。我们将了解这些步骤如何协同工作,并探讨如何将其应用于解决实际问题。

你可能会认为,对信号、图像和文本进行特征工程需要完全不同的工作流程。确实,即使在同一个领域内,也会使用多种不同的方法。


然而,无论你的数据领域是什么,执行特征工程时都会遵循一系列通用步骤。你已经单独见过每个步骤。在本视频中,你将学习它们如何组合在一起。

上一节我们介绍了特征工程的多样性,本节中我们来看看其通用的核心流程。以下是特征工程工作流程的三个主要阶段:

  1. 数据准备:首先,你学习了如何准备数据。在创建特征之前,通常需要进行预处理。但你采取的方法将取决于你感兴趣的特征。例如,在检测峰值之前,你可能需要对数据进行去趋势和平滑处理。或者在计算汇总统计量之前,需要先移除异常值。
  2. 特征创建:接下来,你使用了多种技术来创建新特征,例如对单个或多个变量进行计算、离散化观测值以及计算汇总统计量。新特征通常需要你之前执行过的一些数据清洗步骤。例如,一个身高2米的人在原始数据集中可能不是异常值。但在将人群按年龄组分开后,一个身高2米的儿童就变成了异常值。
  3. 特征评估:最后,你确定了你的特征是否有用。也就是说,你需要检查它们是否能帮助你更好地解释数据并做出未来的预测。你学习了一些统计技术和可视化方法来评估特征。在本专项课程的后续部分,你还将通过研究特征对机器学习模型的影响来评估特征。

当将特征工程应用于你自己的数据时,请记住这个过程是高度迭代的。在流程的任何阶段,你都可能返回到之前的任何步骤。试错是这个过程的一部分。这就是为什么特征工程有时被称为一门艺术而非纯粹的科学。

创建新特征通常需要你创造性地思考如何利用现有信息来回答你的问题。例如:

  • 手机运动传感器的汇总统计量能否用于区分活动类型?
  • 图像中硬币的面积能否用于准确地对它们进行分组?
  • 描述冰雹的用词与风暴造成的损害之间是否存在相关性?

在本模块中,你将逐步完成这些示例。在此过程中,请注意如何利用现有数据来回答上述问题。思考如何将这一工作流程应用于你自己的数据。

无论数据领域如何,请记住相同的基本工作流程都适用。你需要考虑:需要哪些预处理步骤?你将如何评估特征?

本节课中我们一起学习了特征工程的通用工作流程,它主要包括数据准备、特征创建和特征评估三个迭代阶段。理解并应用这一流程,是创造有效特征以解决实际数据科学问题的关键。

36:将数据与时间表同步 📊

在本节课中,我们将学习如何处理和分析具有不同采样率的信号数据。具体来说,我们将了解如何将信号组织到时间表中,如何改变信号的采样率,以及如何同步多个信号以便进行比较。

信号与采样率

假设你正在处理一组随时间以固定间隔记录的温度数据。这种类型的数据被称为信号。在数据科学领域,信号是一种数据值具有特定顺序的数据类型。在关于数据平滑的课程中,信号被称为一种索引数据,因为存在一个索引变量(如时间)来定义数据点的顺序。

时间是指示信号的常见方式,但还有许多其他方式。

图像可以被视为一个二维信号,其中像素不是由时间索引,而是由它们在X、Y平面中的位置索引。

信号的一个重要方面是采样率,它是一个定义数据如何被索引的数字。例如,你现在听到的音频信号的采样率为44.1 kHz,意味着每秒音频有44100个数据点。同样,你现在观看的视频信号是在一个定义了每单位长度像素数量的屏幕上录制的,其像素密度为221 PPI,即每英寸221个像素。

分析信号时使用正确的采样率非常重要。播放音频时,使用错误的采样率会导致声音失真。

那么,如果你有多个具有不同采样率的信号,该如何分析它们呢?

在本视频中,你将学习如何组织、重采样和同步信号数据,以便能够比较具有不同采样率的信号。

加载示例数据

为了演示,让我们加载两个包含温度数据的信号。这两个信号都包含在MATLAB中,因此你无需下载。

文件 Bo_tempemp.mat 包含一个名为 Temp_C 的变量,其中记录了波士顿的摄氏温度值,每小时采样一次。文件 office_temp.mat 包含一个名为 temp 的变量,其中记录了办公楼内部的华氏温度值,每半小时采样一次。


因此,办公室信号的采样率是波士顿信号的两倍。如果你绘制这些信号,可能会注意到另一个问题:波士顿信号大约有750个数据点,而办公室信号有5000多个。这意味着这些信号不仅采样率不同,而且办公室数据的记录时间更长。你如何对齐这些信号,以便比较一天中相同时刻记录的温度?

创建时间表

首先,你需要将信号组织到时间表中。这种数据结构类似于表格,但第一列始终是时间。如果你知道以赫兹(Hz,每秒样本数)为单位的采样率,可以创建时间表。但另一种选择是指定时间步长

对于波士顿信号,你可以使用一小时的时间步长。对于办公室信号,你可以使用30分钟的时间步长。你可以看到时间都从零开始,这意味着这些信号在同一时间开始。但情况并非总是如此。

例如,你可能已经将录制的确切时间存储为日期时间值。在这种情况下,你可以使用 timetable 函数并指定 RowTimes 选项;或者,如果你的数据已经在一个常规表格中,你可以直接使用 table2timetable 函数进行转换。

但现在,让我们坚持使用原始的时间表。由于我们指定了时间步长,时间列中的值是持续时间值,而不是日期时间值。你可能从之前的课程中记得,持续时间值可以有不同的单位,例如天或秒。你可以通过将格式指定为字母 D(代表天)来将时间列的单位从小时转换为天。你也可以使用 M 代表分钟或 S 代表秒。如果你以天为单位重新绘制波士顿信号,可以看到数据记录了31天。

重采样信号

现在,为了对齐两个信号,一种选择是将其中一个信号转换为不同的采样率。例如,你可以将波士顿信号的采样率从每小时一次转换为每小时两次,以匹配办公室信号。这是采样率的增加,因此你需要通过一个称为插值的过程在现有数据点之间插入点。任何现有点将保持不变。采样率的增加通常称为上采样。你也可以降低采样率,这称为下采样

要更改采样率,请使用 retime 函数。你需要指定插值方法和新的采样率。这里的示例使用线性插值,但你可以在文档中阅读其他选项。

% 示例:使用线性插值将采样率提高一倍
newTimeStep = hours(0.5); % 新的时间步长:30分钟
bostonTT_resampled = retime(bostonTT, 'regular', 'linear', 'TimeStep', newTimeStep);

时间列的单位仍然是天,但现在时间表中的数据点是原来的两倍。

如果你的信号没有规则采样的点或缺少时间点,这种使用 retime 的方法也很有帮助。

温度数据已经有规则采样,但如果没有,你可以使用 retime 来强制规则采样或填充缺失的时间点。


应用汇总统计

你可以用 retime 做的另一件有用的事情是应用汇总统计,而不是插值方法。例如,假设你想要每日的最高和最低温度。你可以使用 retime 函数,通过将 linear 替换为 maxmin,并将时间步长设置为一天,来获取最小和最大温度。

% 获取每日最高和最低温度
dailyMax = retime(bostonTT, 'daily', 'max');
dailyMin = retime(bostonTT, 'daily', 'min');

这段代码创建了两个时间表。如果你绘制信号,可以看到每天只有一个数据点:每日最高点或每日最低点。

同步时间表

现在回到对齐不同信号的想法。如果你有两个具有相同采样率的时间表(就像你现在拥有的那样),你可以执行连接操作将它们合并在一起,就像你之前对常规表格所做的那样。然而,当你有多个时间表时,这可能会变得非常繁琐。

相反,你可以使用恰如其名的 synchronize 函数,将采样率转换和连接过程合并为一个同步步骤。

retime 类似,你可以指定插值方法或汇总统计,以及不同的采样率。现在,让我们使用波士顿数据的原始采样率,即每小时一次,指定为时间步长。

% 同步两个时间表,使用波士顿数据的原始采样率
syncTT = synchronize(bostonTT, officeTT, 'regular', 'linear', 'TimeStep', hours(1));

输出是一个新的时间表,现在有三列。对于每个时间点,你都有来自两个信号的值,这意味着这些信号是同步的。

可视化与处理外推

可视化具有多列的时间表的一个好方法是使用堆叠图。

stackedplot(syncTT);

这创建了一个为每个信号使用单独Y轴但共享X轴的图。但这里有些不对劲。

为什么 Temp_C 曲线有一条长长的斜线?波士顿会变冷,但没那么冷。新的波士顿信号有这条线,是因为办公室信号包含了四个月的数据,而波士顿信号只跨越了一个月。这条线是线性插值方法在最后一个数据点之外进行外推的结果。


试图外推这么多数据没有太大意义。你可以通过向 synchronize 函数添加 'endvalues' 选项并设置为 NaN 来修复这个问题。

% 同步并防止外推,在信号结束后填充NaN
syncTT = synchronize(bostonTT, officeTT, 'regular', 'linear', 'TimeStep', hours(1), 'endvalues', NaN);

这样好多了。信号仍然是同步的,但波士顿信号在一个月后停止。让我们通过将X轴限制设置为31天来放大第一个月的数据。

xlim([0 days(31)]);

现在你可以开始看到两组数据中温度的每日趋势。稍后,你将学习如何从这些信号中提取特征。由于信号现在已经同步,你可以对两个信号使用相同的方法。

总结

在本节课中,我们一起学习了如何处理具有不同采样率的信号数据。

  • 时间表是组织和处理信号的有用方式。你可以通过多种方式创建时间表。在我们的示例中使用了时间步长,但你也可以使用采样率或显式的行时间。
  • retime 函数用于转换信号的采样率,或者对非规则采样的信号在规则时间点进行重采样。
  • synchronize 函数用于同步具有不同采样率的时间表。

要了解更多细节,请查看 retimesynchronize 的文档,并花点时间回顾用于信号插值或使用汇总统计进行聚合的不同选项。

37:汇总统计作为特征

在本节课中,我们将学习如何将汇总统计量用作特征来描述信号。我们将探讨如何通过计算均值、标准差等统计量,以及进行频谱分析,来区分不同的活动类型,例如区分静坐、站立、行走和上楼梯。

上一节我们介绍了如何通过重采样和同步信号来在时间表中组织数据。这是数据预处理的重要步骤。本节中,我们将进入特征工程领域,学习如何使用汇总统计量作为特征来描述信号。

为何使用汇总统计量?

假设你正在帮助开发一款使用内置传感器追踪身体活动的手机或智能手表应用。作为团队的数据科学家,你的任务是找到一种方法,利用传感器信号来计算诸如步数或卡路里消耗等数值。

为了提供准确数值,你可能需要区分不同类型的活动。例如,根据用户是静坐、站立、行走还是上楼梯,你可能需要报告不同的数值。

在本视频中,你将看到如何使用汇总统计量,通过信号数据来描述这些活动。

数据来源:加速度计

你将看到的数据由加速度计记录。加速度计是现代手机中的常见传感器,它测量手机沿X、Y、Z三个轴的加速度。当你将手机静止握持时,由于重力作用,它会报告一个恒定但非零的值。当手机旋转时,数值会发生变化。只有在自由落体时,它才会精确记录为零值,但我们不建议尝试。

以下是来自加速度计Y轴通道的示例数据。在此案例中,佩戴智能手表的人先原地站立约10秒,然后开始行走。两种活动之间存在明显差异。但请注意,每种活动期间信号都相当一致。

特征工程方法:窗口化与统计量

区分这些活动的一种方法是将信号分成两部分,并为每个部分的整体计算一些汇总统计量。然后,你可以将这些数字用作特征来对活动类型进行分类。

当然,你事先并不知道将信号分成两部分的准确位置。因此,更常见的做法是取一个长信号,并将其分割成规则大小的片段。这个过程称为窗口化

一旦信号被分割成独立的窗口,你就可以为每个片段计算汇总统计量,并进行预测。

有用的汇总统计量类型

均值可能足以区分静态活动,例如静坐与站立。因为传感器在不同活动之间可能处于不同的方向。当你静坐时,加速度计为每个轴报告一个恒定值。当你站立时,每个轴的加速度计输出会移动到另一个恒定值。你可以通过计算不同窗口的均值来检测这种变化。

那么,你认为哪种汇总统计量对于区分站立和行走有用?有很多候选者,但一个好的选择是标准差。行走时,传感器不断移动,因此数值会以反映运动强度的方式波动。与站立相比,行走时信号的变化更大,因此标准差会更高。

区分相似活动:频谱分析

但是,如何区分相似的活动,例如正常行走与上楼梯?在这些情况下,信号可能看起来非常相似。高阶统计量,如偏度和峰度,可能有助于揭示这些差异。

另一种比较此类复杂信号的常用方法是分析信号的频率成分。频率分析很有帮助,因为信号可以被视为一个或多个频率的组合。

最简单的例子是只包含单一频率的纯音。稍微复杂一点的信号是音符,例如来自吉他的音符。这个信号有一个决定音高的基频,但也有谐波,即声音的更高频率成分。当然,加速度计的信号不是音符,但原理相同。你可以将它们视为不同频率的组合。

傅里叶变换与频谱

信号的频率成分可以通过傅里叶变换进行分析。傅里叶变换是一种数学变换,它将信号转换到不同的域。这意味着数据以不同的方式索引。原始数据按时间索引,而变换后的数据按频率索引。

如果你仔细观察变换后的数据,可以看到一系列规则间隔的峰值。第一个峰值是基频,大约1赫兹,对应于时域信号中大约相隔一秒的波动。频率中的其他峰值是谐波,就像音符一样。

在MATLAB中,你可以轻松计算傅里叶变换并创建此类图表,它们通常被称为频谱。你可以在“频谱估计”绘图选项卡下看到一些可能性。

此图是使用 periodogram 函数创建的。另一个常见选择是 pwelch 函数,它绘制平滑版本的周期图。当你调用这些函数而不指定输出参数时,它们会创建图表。但你可以查阅文档,了解如何从图表中返回频谱值。

以下是一个使用示例:

[Pxx, F] = periodogram(x, [], [], Fs);

在此用法中,信号在变量 x 中,采样率在变量 Fs 中。两个输出是频谱 Pxx 和频率索引数组 F。空输入用于指定这些选项的默认值。

频谱统计量

那么,频谱分析如何帮助你区分两种不同类型的活动?一旦你有了频谱,就可以计算另一类汇总统计量。

你可以计算频谱均值,也称为频谱质心,而不是时域均值。你可以计算频谱标准差,也称为频谱扩展,而不是时域标准差。

频谱统计量的计算方式与你已经见过的汇总统计量大致相同,但它们代表非常不同的值。信号随时间变化的均值代表平均振幅,而频谱质心是一个频率值,代表频谱中所有频率的加权平均值。同样,频谱扩展是衡量频谱在频率上分布广泛程度的指标。

应用示例:行走与上楼梯

让我们将这些技术应用于正常行走和上楼梯的加速度计信号。查看为两种活动从Y轴信号计算出的频谱。

请注意,蓝色代表的正常行走频谱具有规则间隔的峰值,这意味着该信号的谐波非常突出。另一方面,上楼梯频谱只在基频处有一个突出的峰值。

由于谐波不那么突出,该信号的大部分能量集中在较低频率。这种集中影响了频谱质心,上楼梯信号的频谱质心约为1赫兹。正常行走信号的频谱在较高频率处有更多能量。因此,频谱质心更大,约为3赫兹。

这种差异可能看起来不大,但请考虑其含义。你现在已经设法用单一的汇总统计量区分了两个非常相似的信号。

组合特征与特征选择

如果一个统计量不够,你可以将多个汇总统计量组合在一起,创建更大的特征集。然后,你可以应用之前学到的过滤方法,仅选择有助于实现预期目标的特征。

总结

本节课中我们一起学习了如何将汇总统计量用作信号特征。你可以通过将长信号分割成小片段或窗口,然后为每个窗口计算统计量来应用它们。当单个统计量不够时,使用汇总统计量的组合。最后,使用频谱汇总统计量来分析信号的频谱。请务必查阅文档以了解可用的选项。

38:寻找峰值 🎯

在本节课中,我们将学习如何通过寻找信号频谱中的峰值来提取特征,特别是用于估计语音信号的基础频率。我们将使用MATLAB的“查找局部极值”任务,并探讨如何通过调整参数来优化峰值检测,最终评估该特征在区分不同说话者时的有效性。

概述:从音频信号中提取音高特征

假设你正在分析包含语音录音的数据集。你已经了解了如何使用汇总统计来描述信号。但如果你需要测量信号的具体属性,例如说话者的音高,该怎么办?音高在许多情况下都是一个有用的特征。它在普通话等声调语言中进行语音识别时至关重要,因为音高的差异会导致完全不同的词语。音高也可用于帮助识别说话者的性别。男性的典型语音音高在80到180赫兹之间,而女性的音高通常在150到250赫兹之间。在本视频中,你将看到如何通过寻找男性和女性语音录音频谱中的峰值来估计基础频率。

加载与准备音频数据

首先,我们加载两个包含男性和女性说话者语音录音的音频文件。这两个文件都包含在MATLAB中。

以下是加载数据的步骤:

  1. 使用 audioread 函数加载两个变量:信号和采样率。
  2. 使用这些变量为每个文件创建一个时间表。

此时是应用任何预处理操作(如同步或归一化)的好时机。如果音频文件是用不同设置或设备录制的,这可能很有必要。然而,这些特定文件是同时录制的,因此不需要额外的预处理。

分析女性语音样本

接下来,使用此处显示的时间从女性语音时间表中提取一个样本。这个波形是单词“rainbow”中“bow”音的录音。你可以使用 sound 函数播放录音。如果放大,你会注意到大约每5毫秒有一个重复模式。这些重复是基础频率的周期。

在频谱中可以更清楚地看到这一点,频谱可以使用 periodogram 函数计算。注意频谱有一系列突出的峰值。第一个接近200赫兹的峰值代表基础频率,而其他峰值是谐波。谐波频率是基础频率的倍数,因此它们的值是基础频率的两倍、三倍,依此类推。

使用“查找局部极值”任务自动化峰值检测

让我们尝试通过寻找频谱中峰值的位置来识别这些频率。你可以使用名为“查找局部极值”的实时编辑器任务来自动化峰值查找过程。这将生成可重用的代码,以便你可以在其他数据上复现结果。

现在插入一个这样的任务,并选择频谱作为输入数据。哇,有很多峰值。如果放大,你可以看到信号中的每个峰值都被标记了。这些峰值对基础频率估计没有帮助,因此你需要在实时任务中更改一些参数。

你可以调整两个参数来减少检测到的峰值数量:

  • 最小突出度:衡量一个峰值相对于周围点的突出程度。
  • 最小间隔:指定峰值之间允许的最小距离。

由于基础频率峰值几乎跨越了整个范围,其突出度值可能接近数据的最大值(大约 2e-4)。你可以增加最小突出度,以便只检测到基础频率峰值。但基础频率峰值并不总是最大的。相反,尝试识别所有谐波峰值可能更好。然后,可以通过计算峰值之间的平均距离来计算基础频率。

尝试将最小突出度增加到 1e-5。你可以看到这移除了大部分较小的峰值,但仍有部分额外峰值不在谐波频率附近。由于谐波具有固定的间隔,你可以指定最小间隔来限制检测峰值的频率。让我们尝试将峰值之间的最小间隔设为100赫兹。这很好。只有基础频率峰值和一些谐波峰值被标记。

现在,为了估计基础频率,你可以使用实时任务的输出和 diff 函数来获取每个峰值之间的频率差,然后取平均值。这样,样本的基础频率大约为152赫兹。

将方法应用于男性语音样本

但是,请稍等。你找到的参数是否也适用于男性语音录音?让我们用新样本重复这个过程。确保使用相同的参数以保持一致性。哦,显然遗漏了一些峰值。这是因为最小间隔设置为100赫兹,但有时男性声音会低于这个值。

在尝试寻找特征时,这类问题很常见。适用于一段数据的方法可能不适用于另一段。幸运的是,这是一个领域知识可以派上用场的情况。语音音高很少低于60赫兹,所以让我们尝试将最小间隔设为60。这似乎效果很好,但它带来了另一个问题:如果遗漏了一些谐波,可能会出现一些非常大的峰值差异。因此,你可以使用对异常值不那么敏感的统计量,例如中位数,而不是平均值。

不错。看起来这个片段的音高大约为94赫兹。这个值低于从女性语音样本中测得的值,但男性声音总是更低吗?要得到答案,你需要从录音的不同部分获取更多样本。

使用窗口化处理整个录音

手动操作会非常繁琐。但你已经看到了使用 retime 函数的更简单方法。之前,你使用 retime 将信号分割成单独的窗口,然后为每个窗口应用汇总统计量。你可以应用一个计算音高的自定义函数,而不是汇总统计量。

以下是一个使用实时任务自动生成代码的函数示例,其中包括适用于此数据的突出度和间隔值。要查看该函数的详细信息,请查看随本视频附带的实时脚本。

让我们使用 retime 将此函数应用于整个男性录音,窗口长度为100毫秒。输出是另一个时间表,但现在它包含了每个窗口的音高估计值。直方图显示大多数值低于200赫兹,但肯定存在更高频率的异常值。这些可能来自峰值检测遗漏了某些谐波的窗口。可能值得回头调整峰值查找参数,但你也可以使用已经学过的技术来移除异常值。

比较结果与评估特征

最后,你可以对女性语音录音重复此分析并比较结果。直方图显示女性的基础频率值往往高于男性,但分布存在一些重叠。还值得注意的是,每个录音只有一个人说话,因此这些分布可能会随着更多数据而改变。

尽管如此,分布之间确实存在差异,这可以通过单因素方差分析来量化。要计算P值,你需要将两组基础频率值合并到一个数组中,并创建一个标签变量来指定数据是来自男性还是女性说话者。方差分析表中报告的P值非常小,意味着它具有高度显著性。因此,这种音高测量是区分这些说话者的有用特征。它可能对识别任何说话者的性别有用,但你需要用更多数据来验证这一点。

总结

本节课中我们一起学习了如何通过寻找频谱中的峰值从信号中提取频率。“查找局部极值”任务是通过选择最小突出度和间隔等参数来寻找峰值的有用方法。在将方法应用于整个数据集之前,不要忘记在多个数据样本上测试你的方法。最后,在 retime 函数中使用实时任务的自动生成代码,将窗口化过程应用于整个信号。

39:使用MATLAB Mobile记录传感器数据 📱

在本节课中,我们将学习如何使用MATLAB Mobile应用程序来记录移动设备中的传感器数据,并将这些数据导入到MATLAB中进行初步分析。我们将以记录加速度计数据并计算步数为例,演示完整的工作流程。

许多健身追踪应用程序利用移动设备中的传感器来监测您的运动。通过MATLAB Mobile,您可以访问设备中的加速度计、陀螺仪、磁力计和GPS数据。在本视频中,您将学习使用MATLAB Mobile记录加速度计数据,并在实时脚本中与数据进行交互。

第一步:设置与记录数据

上一节我们介绍了课程目标,本节中我们来看看如何开始记录数据。

首先,您需要从设备的应用商店下载MATLAB Mobile应用程序,并使用您的MathWorks账户登录。

打开MATLAB Mobile后,您首先看到的是MATLAB命令行界面。您可以在此输入与桌面版MATLAB相同的命令。

要为数据记录设置您的设备,请首先导航至传感器菜单。确保开启传感器访问权限,并设置存储数据的文件夹名称。然后选择加速度传感器,并将“流”选项设置为“记录”。准备就绪后,按下“开始”按钮。当您四处移动时,MATLAB Mobile将记录加速度数据。完成记录后,按下“停止”按钮,命名您的数据文件并点击“保存”。

现在,您已使用MATLAB Mobile记录了传感器数据并将其存储在设备上。但如何开始在计算机上处理这些数据呢?

第二步:访问与加载数据

上一节我们完成了数据记录,本节中我们来看看如何获取并加载这些数据。

MATLAB Mobile会自动将所有文件与MATLAB Drive同步。MATLAB Drive是一项基于云的服务,用于在不同设备间共享文件。

在您的计算机上导航至MATLAB Drive以访问此文件。传感器日志将位于您之前命名的文件夹中。

然后,使用 load 命令将数据加载到MATLAB工作区。

% 示例:加载名为 ‘sensorLog.mat’ 的数据文件
load(‘sensorLog.mat’)

来自MATLAB Mobile的传感器数据存储在时间表中。时间表是一种表格类型,其每一行都关联有一个时间戳。

第三步:可视化与分析数据

上一节我们成功加载了数据,本节中我们来看看如何可视化数据并进行分析。

使用 stackedplot 函数来可视化时间表中的三个信号,它们分别对应设备三个轴向上的加速度。

% 示例:绘制时间表 ‘accelData’ 的堆叠图
stackedplot(accelData)

仔细观察此数据集,您会注意到Z轴信号上有等间距的峰值。这些峰值对应行走时的每一步。让我们利用这个信号来计算步数。

第四步:使用实时任务计算步数

上一节我们识别了数据特征,本节中我们使用一个便捷的工具来精确计算步数。

将“查找局部极值”实时任务插入到您的实时脚本中。选择Z轴信号,并设置仅识别信号中显著峰值的参数。

生成的图表显示了信号及检测到的峰值。峰值总数是步数的一个良好估计。

总结

本节课中我们一起学习了如何在MATLAB中记录、访问和分析手机传感器数据。您使用加速度计计算了行走时的步数。但这仅仅是您所能实现功能的开始。您能否利用GPS数据计算移动速度,或者估算消耗的卡路里?请尝试一下,祝您好运。

40:图像特征工程与聚类

在本节课中,我们将学习如何对图像进行特征工程,以识别和分类不同的硬币。我们将遵循一个完整的工作流程:图像预处理、特征生成、特征清洗,最后应用聚类算法来验证特征的有效性。


你的视觉系统在无意识中持续进行着特征工程。边缘、形状、颜色、图案和光照,都是大脑用来识别物体、帮助你导航环境的众多特征中的一部分。

以这张图片为例,你可能立刻就知道这是不同硬币的图像,即使你不熟悉这些硬币的类型。这是因为你的大脑擅长识别物体。

你看到了多少种不同类型的硬币?你可能首先使用大小来开始对它们进行分组,同时结合独特的图案和边缘。但是,你如何教会计算机识别这些硬币呢?

在接下来的内容中,你将看到一个执行特征工程以识别图像中不同硬币的示例。


图像预处理与分割

上一节我们介绍了特征工程的概念,本节中我们来看看如何为硬币图像准备数据。我们的第一步是将图像分割,将灰度图像转换为二值图像,其中硬币像素为1,背景像素为0。

首先,在MATLAB中导航到模块5的文件夹,那里存放着硬币的灰度图像。我们将使用“图像分割器”应用程序。

打开应用程序后,加载一张具有代表性的图像。应用程序会提示调整图像对比度,这通常是个好主意,因为它能确保像素值使用全部可用范围,有助于后续基于阈值的分割。

图像显示后,我们可以在“创建蒙版”部分开始操作。蒙版指定了二值图像中哪些像素将变为1。我们首先尝试“阈值”选项。

预览显示,全局阈值分割效果不佳,图像左上角有许多不应被视为前景的像素被识别出来,这是由于光照不均匀造成的。

使用“自适应阈值”可以帮助补偿不均匀的光照。现在,蒙版看起来更均匀了。我们还可以调整阈值的灵敏度。目标是使硬币区域为纯白色,背景为纯黑色,但这通常无法一步完成。

点击“创建蒙版”应用更改。此时,“创建蒙版”选项变为非活动状态,但“优化蒙版”选项被激活。硬币的边界被很好地捕捉,但内部区域是空的。

在“优化蒙版”下,选择“填充孔洞”以捕捉每个硬币的整个区域。很好,硬币区域被完整捕捉,但背景中仍有许多噪声点。

返回“优化蒙版”,选择“清除边界”。虽然这张图片没有硬币接触边界,但其他图片可能有,接触边界的硬币面积会偏小,因此清除它们。

接下来,使用形态学操作清理背景。形态学是一组利用形状来减少、扩展、填充和开启蒙版的图像处理操作。在左上角的下拉菜单中选择“开启蒙版”操作,该操作会移除小于结构元素的前景物体,这正是我们需要的。

可以更改结构元素的形状和大小。增加大小可以移除更大的前景物体。调整到合适大小后应用操作。这个分割效果相当好。

如果想尝试不同方法而不丢失当前工作,只需点击“新建分割”即可。这将在原始图像上开始第二次分割,第一次分割及其历史记录仍然保留。你可以尝试多种方法并选择最佳的一个。

当然,这只是处理了一张图像。我们需要将相同的步骤应用到所有图像上。我们将分两步进行:生成一个函数来重复分割过程,然后使用“图像批处理器”应用程序来分割所有图像并检查结果。

在“导出”下,选择“生成函数”。生成的代码包含了应用程序中执行的每个步骤的注释和相应代码。保存此函数。

然后,从应用程序选项卡打开“图像批处理器”应用程序。加载所有图像,并指定我们刚刚保存的函数来处理所有图像。处理完成后,应用程序会同时显示原始图像和处理后的图像,方便我们检查分割结果是否理想。

这个过程可能需要多次迭代。当发现某张图像分割效果不佳时,只需返回“图像分割器”应用程序尝试不同的方法,然后使用新生成的函数通过“图像批处理器”重新处理所有图像。

回顾我们的整体工作流程,预处理步骤现已完成。通常,处理新数据时,预处理是最耗时的步骤之一。


生成图像特征

上一节我们完成了图像分割,本节中我们将从分割后的图像中生成特征。为了获取分割图像中各个区域的属性(如面积),我们将使用“图像区域分析器”应用程序。

首先,将二值图像导出到工作空间,然后打开“图像区域分析器”应用程序。

应用程序会计算图像中每个连通区域的各种属性。我们将选择要保留的特征。硬币是圆形的,因此我们保留以下特征:

  • 面积
  • 偏心率
  • 等效直径
  • 周长

其中一些特征可能是冗余的,但这可以在后续进行分析。

至此,特征生成步骤完成。接下来是清洗特征。


清洗特征

图像中仍然包含非硬币区域,需要将其移除。“图像区域分析器”应用程序允许我们根据区域的属性来过滤图像。

观察发现,实际硬币的最小面积约为130,000像素,而我们想要移除的区域面积约为5,000像素。因此,我们设置一个最小面积过滤器,例如40,000像素。

这样,小区域就被移除了,我们得到了该图像中硬币区域的特征表。

请注意,应用程序将最大面积设置为图像中的最大面积。这里我们不想要上限,否则任何更大的硬币都会被过滤掉。因此,我们需要查看生成的代码并移除这个上限。

在“导出”下,选择“导出函数”。在生成的代码中,我们看到执行应用程序中步骤的两行代码:过滤和区域属性计算。

通过将上限值改为 inf 来移除过滤操作中的上限。同时,注释提示我们可以通过取消注释一行代码来将变量 properties 作为表格返回,我们照做。然后保存新函数。

现在,我们准备看看是否可以使用面积作为特征来对不同的硬币进行分组。


应用特征与聚类评估

为了使用面积特征对硬币进行分组,我们需要将之前在应用程序中创建的图像分割和区域过滤函数应用到所有图像上。然后,我们将对观测值进行聚类,并将聚类结果与已知的硬币标签进行比较。

有一个提供的实时脚本可以完成此分析。我们在此快速浏览,你可以更详细地研究它。

第一步是创建一个图像数据存储。注意,它使用文件夹名称作为图像的标签。这就是我们将聚类结果与已知硬币进行比较的方式。要在你的计算机上运行此脚本,需要更新图像的位置。

while 循环内部,获取每张图像的特征并添加到一个名为 properties 的表格中。每次循环迭代,从数据存储加载一张图像,应用刚刚创建的两个函数来计算当前图像的区域属性。代码获取图像的标签,为图像中找到的每个硬币重复该标签,然后将其添加到表格中。循环结束时,将当前图像的结果添加到总表中。

很好,我们现在有了一个包含89个观测值及其特征的表格。

那么,如何确定面积是否是一个有用的特征呢?之前你看到了几种评估特征的方法。由于响应变量“类型”是分类变量,可以使用 anova1 函数来检验面积作为特征的有效性。

得到的P值几乎为零,表明硬币类型依赖于面积。此外,带凹口的箱线图显示,尽管一角硬币和一美分硬币的面积接近,但它们在统计上是显著不同的。

完成此分析后,假设你不知道有四种硬币,但想尝试基于面积对数据进行分组,即使用你的特征对数据进行聚类。

第一步可能是使用 evalclusters 函数找到最佳聚类数量。这里我们使用K均值算法,测试K值从2到6的聚类效果。

很好,最佳K值(聚类数量)是4,这正是我们对此数据集的期望。接下来,将面积数据传递给 kmeans 函数并指定4个聚类。这将返回每个观测值被分配的簇,我们将其添加到表格中。

浏览表格,我们看到每种类型的硬币只与一个单独的簇相关联。无需对任何图像进行标记,你就能得出正确的结论:存在四种类型的硬币。


总结与拓展

本节课中,我们一起学习了如何利用MATLAB的应用程序(App)工作流对图像进行特征工程。我们从图像预处理和分割开始,生成了描述硬币形状的特征,清洗了无关数据,最后使用聚类算法验证了“面积”这一特征能有效区分不同类型的硬币。

一个基于应用程序的类似工作流可以应用于许多场景。例如,有基于颜色的分割应用程序和图像配准应用程序。这些应用程序大多会生成代码,使你能够快速在单张图像上探索技术,然后在更大的数据集上测试整个工作流程。

要了解更多可用功能,请尝试使用你自己的图像来探索这些应用程序。你可能会因此发现一个新的爱好。

41:文本特征工程 📝

在本节课中,我们将学习如何处理和分析文本数据。你将了解如何从常见文档格式中提取文本,如何在MATLAB中预处理和清理文本,以及如何从文本中提取有意义的特征,例如词频和情感倾向。我们将以莎士比亚的十四行诗为例,演示如何通过数据分析发现其主题的转变。


导入与提取文本

上一节我们介绍了数值和分类数据的处理。本节中,我们来看看如何处理文本数据。

许多有价值的信息都隐藏在文本中。处理文本数据需要类似的步骤:提取、预处理和特征工程。MATLAB提供了多种方法来从不同来源提取文本。

以下是常见的文本提取方法:

  • 从纯文本文件、Microsoft Word文档、PDF和HTML中提取文本,可以使用 extractFileText 函数。
  • 对于文本、CSV或Excel文件,可以像之前一样使用导入工具。
  • 要从网页直接读取,可以结合使用 webreadextractHTMLText 函数。

让我们以莎士比亚的十四行诗为例。首先,我们需要将文本导入MATLAB。

% 从文本文件提取全部内容
fullText = extractFileText('sonnets.txt');

预处理与清理文本

现在我们已经有了原始文本,但为了分析,需要将其分割成独立的十四行诗。

观察文本结构,发现每首诗之间有两个空行。我们可以利用这个模式进行分割。

% 按两个连续的换行符分割文本
sonnets = split(fullText, newline + newline);

分割后,会得到一些标题和空字符串。通过计算每个部分的长度并可视化,可以识别出哪些是过短的无效字符串。

% 计算每个字符串的长度
strLengths = strlength(sonnets);
% 可视化长度分布
histogram(strLengths);

由于一首标准的十四行诗有14行,每行约10个音节,长度过短(例如少于25个字符)的字符串很可能是标题或空行,可以将其移除。

% 移除过短的字符串(例如长度小于25)
sonnets = sonnets(strLengths > 25);

现在,每首十四行诗都作为一个独立的字符串存储在变量中,便于后续分析。


文本分析与特征提取

接下来,我们开始分析文本,并思考如何提取特征来发现“暗黑夫人”系列十四行诗的开始。

特定词语的出现和频率可以用于分类或预测,例如判断邮件是否为垃圾邮件,或产品评论的情感是积极还是消极。

让我们用这种方式来研究十四行诗。首先,使用 tokenizedDocument 函数将每个字符串转换为文档及其独特的组成部分(即词元,通常是单词和标点)。

% 将字符串数组转换为分词文档
documents = tokenizedDocument(sonnets);

我们可以使用词云来可视化最常见的词元及其相对频率。

% 创建词云
figure
wordcloud(documents);

词云显示,最常见的词元是逗号,还有其他标点、因大小写差异而重复的单词,以及诸如“the”、“and”、“but”之类的停用词。这些元素对句子结构很重要,但本身缺乏独立含义,可能会干扰分析。

可以使用以下函数移除这类“词汇噪声”:

  • removePunctuation:移除标点。
  • lower:将所有字母转换为小写。
  • removeStopWords:移除常见停用词。
% 清理文档:移除标点、转为小写、移除停用词
cleanedDocs = erasePunctuation(documents);
cleanedDocs = lower(cleanedDocs);
cleanedDocs = removeStopWords(cleanedDocs);
% 查看被移除的停用词列表
stopWordsList = stopWords;

词云现在包含了更有意义的词,但可能仍包含一些莎士比亚时代特有的“停用词”,如“thou”、“thee”、“thy”。我们可以使用 removeWords 函数移除自定义词集。

% 移除自定义的词汇
customStopWords = ["thou", "thee", "thy", "thine"];
cleanedDocs = removeWords(cleanedDocs, customStopWords);
% 再次生成词云
figure
wordcloud(cleanedDocs);

不出所料,最常出现的有意义的词是“love”。

词云能快速可视化文本中的常见元素。但要进行更深入的分析并利用词频等特征,需要将文本量化。这时 bagOfWords 函数就非常有用。它会根据文档列表创建一个计数矩阵。

% 创建词袋模型
bag = bagOfWords(cleanedDocs);
% 可视化矩阵结构(非零条目)
figure
spy(bag);

在这个矩阵中,每一行代表一个分词后的文档,每一列代表所有文档中出现的一个独特单词,每个值是该单词在文档中出现的次数。

我们可以对列求和,以查看每个独特单词在所有文档中出现的总次数。

% 计算每个单词的总出现次数
wordCounts = sum(bag.Counts, 1);
% 使用 topkwords 获取出现频率最高的单词
T = topkwords(bag, 20);

或者,可以提取特定单词(如“love”)的列,查看它在哪些文档中出现以及频率如何。

% 获取“love”一词的出现情况
loveIdx = (bag.Vocabulary == "love");
loveCounts = bag.Counts(:, loveIdx);

此外,还可以使用 context 函数进一步分析单词出现的上下文。


应用分析:发现主题转变

为了尝试找到从“俊美青年”系列到“暗黑夫人”系列的转变,让我们观察“love”(爱)与“hate”(恨)这两个词在全部十四行诗中出现频率的变化。

为了捕捉与这些词相关的情感或主题,需要考虑它们的各种形式,如“loved”、“loves”或“hated”。可以使用 normalizeWords 函数将单词还原为其词根形式。

% 对文档进行词形还原(归一化)
normalizedDocs = normalizeWords(cleanedDocs, 'Style', 'lemma');
% 基于归一化文档创建新的词袋
normBag = bagOfWords(normalizedDocs);

现在,让我们查看“love”和“hate”词根在所有诗篇中的分布。

% 获取归一化后‘love’和‘hate’的出现次数
loveCountsNorm = normBag.Counts(:, (normBag.Vocabulary == "love"));
hateCountsNorm = normBag.Counts(:, (normBag.Vocabulary == "hate"));
% 绘制条形图
figure
subplot(2,1,1)
bar(loveCountsNorm)
title('Occurrences of "love" (normalized) per Sonnet')
subplot(2,1,2)
bar(hateCountsNorm)
title('Occurrences of "hate" (normalized) per Sonnet')

仅从条形图很难得出结论。之前我们学过如何使用汇总统计量来提取时间序列数据的特征。让我们计算每个词出现次数的归一化移动平均值。

% 定义移动平均窗口大小
windowSize = 10;
% 计算移动平均值
loveMA = movmean(loveCountsNorm, windowSize);
hateMA = movmean(hateCountsNorm, windowSize);
% 绘制移动平均曲线
figure
plot(loveMA, 'b-', 'LineWidth', 2)
hold on
plot(hateMA, 'r-', 'LineWidth', 2)
xlabel('Sonnet Number')
ylabel('Normalized Moving Average Count')
legend('Love', 'Hate')
title('Thematic Shift in Shakespeare Sonnets')
grid on
hold off

有趣的是,虽然“love”的出现频率上下波动,但“love”和“hate”在后期诗篇(大约从第127首之后开始)的出现频率都出现了非常明显的同步上升。请记住,“俊美青年”系列结束于第127首,而“暗黑夫人”系列开始于第128首。看来我们成功地利用数据科学发现了这一主题转变。


总结

本节课中,我们一起学习了文本数据常见的提取、预处理和特征工程任务。我们以莎士比亚十四行诗为例,演示了如何从原始文本开始,经过清理和分词,创建词袋模型,并最终通过分析关键词的频率变化来揭示文本中的主题转变。

然而,MATLAB中关于文本分析的功能远不止于此。你可以探索文档,了解如何使用词序列进行类似的分析和特征提取,执行完整的情感分析,训练自己的分类器,创建主题模型等等。

42:风暴事件特征工程 🌀

在本节课中,我们将学习如何对风暴事件描述文本进行特征工程。我们将预处理数据,从冰雹事件描述中提取并处理冰雹尺寸信息,以创建能够预测损失成本的特征,并使用可视化和统计测试来评估这些特征的预测能力。

数据加载与初步预处理

上一节我们介绍了文本特征工程的核心技术。本节中,我们来看看如何将其应用于一个更复杂的真实数据集——风暴事件数据。

首先,使用 StM Data importm 函数加载一年的风暴事件数据。你也可以自行导入更多年份的数据进行深入探索。

接下来,对数据进行预处理:

  • 将所有缺失的成本值替换为零。
  • 将财产损失和作物损失合并为一项总损失。
  • 提取描述字段非空的冰雹事件。

请注意,像“quarter sized”这样的短语有时带连字符,有时是分开的单词。为了保持一致性,将所有连字符替换为空格,以便单独评估每个单词。通常,初始预处理步骤因情况而异,因此务必先检查数据,以确定需要做哪些调整。

文本数据标准化处理

现在,就像在莎士比亚十四行诗的例子中一样,我们对文档进行分词、移除标点符号和停用词、添加词性标签、将所有单词转换为小写并还原为其词根形式。

代码示例:文本预处理

% 假设 documents 是文本数据数组
documents = tokenizedDocument(documents);
documents = removePunctuation(documents);
documents = removeStopWords(documents);
documents = addPartOfSpeechDetails(documents);
documents = normalizeWords(documents, ‘Style‘, ‘lemma‘);
documents = lower(documents);

然后,用词云可视化处理结果。这些步骤是分析文本数据时常见的预处理工作流。

识别并提取冰雹尺寸描述

我们的目标是找到冰雹尺寸的描述。一个很好的起点是查找包含“size”一词的多词序列。

观察这些例子,你会发现其中包含两词和三词序列。

就像在莎士比亚例子中看到的 bagOfWords 函数一样,bagOfNgrams 函数用于查找包含“size”一词的多词序列。我们先检查紧邻“size”之前的单词。

正如我们之前探索数据时所预期的,像“ball size”这样的短语本身提供的信息有限。因此,让我们提取包含这些单词的三词序列(三元组)。

这样更有意义了,我们得到了“golf ball size”、“half dollar size”和“ping pong size”。这再次说明了理解数据的重要性,以便知道何时需要定制预处理步骤。

处理拼写错误与统一表达

处理文本数据时,一个常见且令人头疼的问题是拼写错误。使用 replaceWords 函数来纠正拼写错误。在本例中,“nickel”一词存在拼写错误。

此外,虽然不一定错误,但像“tennis ball”和“half dollar”这样的多词描述比单个单词更难查找。因此,让我们将这些多词短语替换为单个单词。

处理文本时,拼写错误、缩写和表达替换是预料之中的。因此,通常建议仔细检查数据,以便及早发现可能的问题。

统一尺寸描述并排序

注意,这里使用的尺寸描述物品种类繁多,从美国硬币到体育用品再到食品。语言往往有多种方式表达同一概念,因此在处理文本数据时,留意冗余表达是一个好习惯。我们将在后续的实时脚本中处理这些冗余。

在本例中,为了观察尺寸与损失成本之间是否存在趋势,我们使用美国国家气象局提供的物体到尺寸的转换关系,将这些描述符按尺寸大小排序。

定位尺寸描述符并构建特征矩阵

现在,找出哪些事件描述包含了不同的尺寸描述符。首先,使用词袋模型来搜索每个描述符。

请注意,由于之前进行了多词替换,我们现在只查找单个术语。

接下来,使用 Intersect 函数找出尺寸描述符在词袋词汇表中的位置。将 setOrder 参数设为 ‘stable‘,以确保结果的索引与描述符的尺寸排序相对应。

就像在莎士比亚的例子中一样,提取搜索词的计数矩阵,这样你就能确切知道哪些事件描述包含了哪些尺寸描述符。

特征可视化评估

现在,可以开始对尺寸特征进行可视化评估了。

首先,组装一个包含不同事件损失成本和尺寸描述符的表格。你可以用箱线图来可视化这些数据。由于成本跨越了几个数量级,因此使用以10为底的对数刻度。

你可以看到一个清晰的趋势:随着尺寸增大,损失也在增加。但有些组只有少数几个数据点,而其他组的分布看起来非常相似。因此,将这些描述符分组为小、中、大类别将有助于简化分析。

统计检验与特征优化

现在,可以通过在所有组内进行成对方差分析(ANOVA)测试来更严格地评估特征。

根据此分析,中等和大型类别与小型类别有显著差异,但彼此之间没有显著差异。但是,等等,可能存在异常值使分析产生偏差。

让我们从每组中移除异常值。

现在,所有三个尺寸类别都成为了损失成本的显著不同的预测因子。

课程总结

本节课中,我们一起学习了一个使用特征工程工作流来处理、探索、提取和评估新的、更复杂特征的例子。

我们对数据进行了预处理,以识别多词序列作为潜在的预测特征。然后,我们使用箱线图和方差分析测试等视觉和统计工具评估了这些特征,并进一步重组和清理了特征以提高其预测能力。

你可能已经对如何扩展本视频中的分析有了一些想法。例如,如何整合未使用参考物体提供的额外尺寸信息(例如“直径两英寸的冰雹”)?你可以使用这个脚本和可用的风暴数据来探索这种可能性以及更多其他方向。

模块5:特定领域特征工程总结 🎯

在本节课中,我们将总结特定领域特征工程的核心工作流程与关键步骤。通过学习,你将掌握处理信号、图像和文本等不同数据类型的通用方法。

上一节我们介绍了特征工程的多种应用,本节中我们来看看贯穿不同数据类型的统一工作流程。尽管处理的数据类型各异,但你能够使用相同的工作流程来构建有用的特征。

每种方法都始于数据预处理。以下是针对不同数据类型的预处理示例:

  • 信号:同步具有不同采样率的信号。
  • 图像:通过应用阈值和形态学操作进行图像分割。
  • 文本:移除停用词,然后将剩余词语规范化为其词根形式。

预处理是数据科学中较为困难且耗时的活动之一,尤其是在处理新数据时。你常常会尝试一系列步骤,却发现结果并不符合预期。

这时,交互式工具(如应用程序和实时编辑器任务)就派上了用场。你可以使用这些工具在单份数据上快速尝试不同方法,然后利用生成的代码在其余数据上测试该方法。

在完成预处理后,下一步是从数据中提取特征。以下是特征提取的示例:

  • 信号:提取显著频率。
  • 图像:计算图像中对象的大小。
  • 文本:进行词频统计。

在新数据集中寻找有用特征可能是一项艰巨的任务,但请记住,特征工程既是一门科学,也是一门艺术。你在特定领域的专业知识是构思新特征的宝贵财富。

最后,你需要使用过滤技术(如假设检验)来清理和评估你的特征。

这个工作流程是一个通用过程,可以帮助你在几乎任何领域进行特征工程。请不要忘记,这是一个高度迭代的过程。你应该在每一步之后检查结果,并根据需要返回到之前的步骤。

现在,你已经准备好在一些新数据集上测试你的技能了。

首先,花几分钟时间回顾本模块视频附带的实时脚本。它们包含了将这些概念应用于新数据的额外细节和解释。

复习完成后,请完成测验。祝你好运。

本节课中我们一起学习了特定领域特征工程的完整工作流程,涵盖了从数据预处理、特征提取到特征清理与评估的关键步骤。记住这是一个迭代的过程,你的领域知识至关重要。现在,你可以尝试将这套方法应用到自己的项目中了。

4.4:数据处理与特征工程总结 🎯

在本节中,我们将回顾并总结数据处理与特征工程的核心工作流程与技能要点。

恭喜你完成了MATLAB数据处理与特征工程部分的学习。你现在掌握了一套新技能,这套技能不仅可用于数据科学,也能应用于任何你遇到杂乱数据的场景。让我们花点时间回顾一下,凭借这些新技能,你现在能够完成哪些工作。

大多数现实世界的数据处理问题都会涉及分布在多个文件中的数据。

这些文件可能以相同的方式组织,但按日期分隔,例如航班数据。


或者,你可能拥有来自不同来源但共享关键变量的数据。

无论是哪种情况,你现在都知道如何为后续分析合并与组织你的数据。

然而,如果你不先清理数据,分析可能会很困难。缺失数据和异常值可能会使可视化结果产生偏差。

噪声数据可能掩盖潜在的趋势。

同时,比较具有不同尺度的变量的重要性也具有挑战性。

清理数据可能非常耗时,因为你通常需要测试许多不同的方法。你现在可以使用诸如实时编辑器任务、应用程序和专用函数等工具来快速迭代,并选择最适合你应用场景的方法。

清理数据之后,你就可以开始创建新特征了。你现在知道如何应用不同的方法来做到这一点。例如,你可以对现有变量应用一个公式

或者使用无监督聚类算法对数据进行分组。

无论采用哪种方法,你都在寻找能更好地解释观测值方差的新特征。有用的特征可以减少构建预测模型所花费的时间,并有助于理解某些特征为何重要。

最后,你看到了所有这些概念在几个特定领域的示例中的应用。

尽管处理信号、图像和文本的细节有所不同。

但你看到,整体的特征工程工作流程保持不变。

那么,接下来你将如何运用这些技能呢?

让我们问问Heather,她将带领你学习第三门课程。Heather,接下来涵盖哪些主题?

谢谢,Adam。现在你已经清理了数据并创建了特征,是时候将这些特征用于机器学习了。😊 在这门课程中,你将使用K均值和其他算法将数据聚类成组。

这被称为无监督机器学习,因为你只提供输入数据,让算法对数据进行聚类。

在无监督学习中,没有正确或错误的答案,其目标通常是发现隐藏的模式,并更多地了解数据的底层结构。


但考虑这样一种情况:你已知结果,例如手机传感器数据。在这种情况下,你希望利用已标记数据中的信息来训练一个能够正确识别活动的模型。

这被称为监督机器学习。在这个例子中,最终目标是将模型部署到人们可以用来跟踪其活动的设备上。

加入我们的第三门课程,学习如何将监督机器学习应用于你的数据。你将使用应用程序快速应用不同的机器学习算法,然后评估结果并优化你的模型。你还将学习如何解决常见问题,例如你的模型无法泛化到新数据。

我期待在那里见到你。


总结

在本节课中,我们一起学习了数据处理与特征工程的完整工作流程。我们回顾了如何合并多源数据、清理数据中的缺失值与异常值、处理噪声与尺度问题,并掌握了创建新特征(如应用公式或使用聚类算法)的方法。最后,我们了解到这些技能是通往机器学习(包括无监督与监督学习)的关键基础。

0:课程概述 🎼

在本节课中,我们将要学习《实用数据科学与MATLAB》专项课程的总体介绍。您将了解数据科学如何改变世界,以及本课程如何帮助您掌握将原始数据转化为有意义结果的技能。

您可能听说过数据科学正在彻底改变医疗保健、汽车、消费电子等众多领域。实际上,几乎每个行业都受到了影响。如果您正在考虑学习这个专项课程,您很可能已经看到了数据科学在您自己领域的潜力。

无论您身处哪个领域,拥有强大的数据科学技能都能让您脱颖而出,并帮助您将原始数据转化为有意义的成果。这就是MathWorks创建《实用数据科学与MATLAB》专项课程的原因。完成此专项课程将为您提供快速取得实际成果所需的技能和信心。

在整个专项课程中,您将使用MATLAB。

MATLAB是数百万工程和科学专业人士的首选工具,它提供了完成数据科学任务所需的能力。MATLAB使用熟悉的数学符号,并附带图形化应用程序,帮助您快速迭代常见的分析任务。这些应用程序减少了进行有意义的数据科学工作所需的时间,并帮助您立即开始处理数据。



您了解您的领域,也了解您的数据。借助正确的工具和一些实践,您可以构建能够基于数据模式进行准确预测的模型。这些技术对于任何希望保持竞争力的公司都至关重要。

完成此专项课程后,您将能够使用自己的数据构建预测模型。这是当今雇主最需要的高需求职业技能之一。

课程结构 📚

上一节我们介绍了课程的整体目标,本节中我们来看看这个四门课程的专项课程具体包含哪些内容。

以下是本专项课程四个核心课程的简要介绍:

  • 第一门课程:数据探索
    在这门课程中,您将学习如何使用MATLAB中的图形化工具探索数据。您将生成可视化图表并执行常见的统计分析。这门课程设计为适合所有技能水平的学习者入门。图形化工具使您能够快速尝试不同的技术和可视化方法。您执行的操作所对应的代码会显示在屏幕上,帮助您学习MATLAB语言并开始自己编写完整的脚本。

  • 第二门课程:数据预处理与特征工程
    在第二门课程中,您将在第一门课的基础上,增加为后续探索和建模而对数据进行预处理的关键技能。完成这门课程后,您将能够整合来自不同来源的数据,去除异常值和缺失数据点等不需要的干扰,并开始构建用于分类和回归的基本模型。这门课程还探讨了您可能会遇到的特定类型数据,例如音频信号、图像和文本。即使您不每天处理这类数据,当需要时,您仍然可以应用相关的概念和应用程序。

  • 第三门课程:机器学习建模
    当您进入第三门课程时,您将准备好开始使用MATLAB应用程序构建机器学习模型。您将尝试多种不同的建模技术和参数。当找到满意的组合时,您将构建模型并用它进行预测。与任何新技能一样,数据科学成功的关键在于实践。

  • 第四门课程:毕业项目
    最后的毕业项目涵盖了完整的数据科学工作流程。您将应用专项课程中所有课程学到的技能来构建一个预测模型。您将与同伴合作评估模型,更重要的是,从他们独特的视角中学习。

总结 🎯

本节课中我们一起学习了《实用数据科学与MATLAB》专项课程的概览。我们了解到数据科学在各行各业的重要性,以及MATLAB作为强大工具如何帮助我们从数据探索、预处理、机器学习建模到完成毕业项目,走完一个完整的数据科学工作流程。准备好开始构建实用的数据科学技能,为您所在的组织和行业带来改变了吗?让我们开始吧。

1:教师介绍 👨‍🏫

在本节课中,我们将认识本系列课程的讲师团队。每位讲师都将分享他们的背景、与MATLAB的渊源以及个人兴趣,帮助你了解他们丰富的行业经验和教学热情。

大家好。我是Adam Philllian。我是Heather Gore。我是Brendan Armstrong。我是Er Burnne。

我是MathWorks的在线课程开发人员。我是MathWorks的产品经理。我是MATLAB和数据科学的技术产品营销经理。我是MathWorks的在线内容开发人员。

我从小就是一个科学爱好者。我在四年级时最大的梦想是成为一名迪士尼幻想工程师。我早在2004年就开始使用MATLAB,当时我在弗吉尼亚理工大学攻读航空航天工程学士学位。我在研究和教学中使用MATLAB已超过10年。我第一次接触MATLAB是在攻读物理学博士学位期间购买了学生版。我主要使用MATLAB来可视化数据并拟合简单模型。我第一次使用它是在哈维穆德学院攻读工程学期间。我博士期间的主要项目是关于生物流体模式识别的机器学习。那非常有趣。我的研究生研究集中在一种称为“晕轨道”的领域。我在这个领域的研究涉及寻找从低地球轨道到这些晕轨道的最优转移轨迹,自然地,我用代码实现了它。

在MATLAB方面,最近一个很酷的项目是部署用于实时预测的机器学习模型。我在MATLAB中创建了信号处理和机器学习算法,然后在云上的流式架构中使用这些预测。我的职业生涯始于航空航天工程师。我为卫星和星际任务(包括火星探测漫游者)进行系统级设计和分析。在MathWorks,我的职责是帮助其他人学习如何将机器学习、深度学习和数据科学应用到他们的工作中。我与我们的开发组织合作,确定接下来要构建哪些新的数据科学工具。基本上,我的全部工作就是帮助像你这样的人开始并熟练地将MATLAB用于你的应用。我曾经是一名职业摇摆舞者。我是一名音乐家。

我弹吉他、打鼓,也喜欢唱歌和创作音乐。我认为我对音乐的热情确实对我的职业生涯有所帮助,因为我很有创造力,并且能从不同角度思考问题,这在数据科学中很重要。我开始涉足一些天文摄影。我最喜欢的一张是从邻居家车道上拍摄的猎户座星云照片,因为我家院子里的树挡住了视线。实际上,我在业余时间也会使用MATLAB,我就是喜欢摆弄数据。我每天早上第一件事就是打开MATLAB,甚至在查看邮件之前。在开始一天的工作之前,我会有一段小小的MATLAB时间。我非常高兴能在这个系列课程中与大家分享我的一些经验和来之不易的教训。我希望你能看到MATLAB如何帮助像你这样的领域专家在数据科学领域表现出色。


本节课中,我们一起认识了本系列课程的四位讲师:Adam、Heather、Brendan和Er。他们来自MathWorks的不同岗位,拥有从工程研究到产品开发与教学的丰富背景,并且都长期使用MATLAB解决实际问题。他们分享了各自的专业历程、与MATLAB结缘的故事以及工作之外的兴趣爱好。通过他们的介绍,我们了解到MATLAB在学术研究、工业应用以及新兴的数据科学和机器学习领域都扮演着重要角色。在接下来的课程中,他们将带领大家深入探索实用数据科学的各个方面。

2:监督机器学习介绍 🎼

在本课程中,我们将学习如何构建和评估监督机器学习模型。机器学习应用广泛,从识别疾病风险因素到设计汽车高级安全系统都有涉及。

上一节我们介绍了课程的整体目标,本节中我们来看看本专项课程涵盖的机器学习类型。

在课程2中,我们通过聚类数据执行了无监督机器学习。当希望发现数据中的分组或模式时,会使用无监督机器学习。这种方法没有所谓的“正确答案”,因此被称为无监督学习。

相比之下,监督机器学习的目标是构建一个预测模型。数据必须包含一组特征和每个观测值的已知响应。如果该响应是连续数值变量,则属于回归问题。如果响应是离散值或类别之一,则称为分类问题

例如,根据天气条件和一年中的时间预测太阳能电池板的发电量是一个回归问题;而预测患者是否有心脏病风险则是一个分类问题。用于评估回归和分类模型的模型与指标有很大不同,但两者遵循相同的工作流程。

理解这个工作流程是成功应用监督机器学习的关键。第一步是导入和探索数据。数据包含什么内容?是否有足够的信息来回答你的问题?

在开始构建机器学习模型之前,你需要理解数据。这些技能在本专项课程的第一门课程中已经学习过。

我们的目标是对新的观测值进行预测。为了评估模型在新数据上的表现,分割数据集非常重要。

其中一部分数据集将用于训练模型。这个数据集包含训练数据和验证数据,稍后会看到。另一部分被称为测试数据。测试数据用于模拟你的最终模型从未见过的新观测值。

将测试数据集搁置一旁,直到获得最终模型前都不要使用它。

接下来,对合并后的训练和验证数据进行预处理。

这包括清理数据和创建新特征等任务。这些技能在本专项课程的第二门课程中学习。

一旦准备好数据,就可以开始监督机器学习的过程了。这是本课程的重点。

在尝试寻找最佳模型时,你需要尝试多种方法。

应该使用哪种类型的模型?哪些特征是重要的?如何找到最优的模型参数?你需要多次迭代才能找到最适合你数据的模型。

请注意,在此步骤中需要再次分割数据。

我们希望模型能捕捉潜在趋势,而不是拟合数据中的噪声。

拟合噪声被称为过拟合

在训练过程中使用验证数据有助于防止过拟合,本课程将学习使用验证数据的不同方法。

当你找到最佳模型选项后,使用合并后的训练和验证数据训练一个最终模型。

一旦获得最终模型,就可以将其应用于新的观测值了。

这时就需要使用之前预留的测试数据。

在应用相同的预处理步骤后,使用你的模型对测试数据进行结果预测。这代表了你的模型在新观测值上的预期表现。

现在,你可以看到专项课程中的每一门课程是如何融入监督机器学习工作流的。接下来,让我们看看本课程是如何组织的。

在模块1和模块2中,你将学习如何训练常见的回归和分类模型。

你将使用应用程序快速尝试不同方法,并确定对你的应用最有前景的模型。

你还将学习评估回归和分类模型的指标和技术。

一旦知道如何训练和评估模型,就可以开始应用工作流程了。

在模块3中,你将使用验证数据来帮助防止过拟合,并帮助你选择最佳模型。

你将执行特征选择,并优化模型参数以提高准确性。

最后,你将通过将最终模型应用于测试数据来评估模型性能,结束本模块。

在模块4中,你将学习处理潜在问题的策略。例如,如果存在类别不平衡,即大多数观测值属于同一类别,该怎么办?

在本课程结束时,你将掌握在自己的数据上应用监督机器学习技术所需的技能。

那么,让我们开始吧。

3:出租车数据介绍 🚖

在本节课中,我们将学习数据科学项目的第一步:理解数据。我们将以2015年纽约市黄色出租车行程的抽样数据集为例,介绍如何将数据文件导入MATLAB,如何通过可视化探索变量间的关系,以及如何识别数据中需要清理的问题,为后续构建预测模型做准备。

理解数据集

任何数据科学项目的第一步都是理解数据。在本课程中,主要数据集来自纽约市出租车和豪华轿车委员会提供的2015年纽约市黄色出租车行程抽样数据。

数据抽样与规模

2015年,纽约市的乘客进行了近3亿次黄色出租车行程。处理所有这些行程的完整数据集将需要大量的时间和计算资源。在这种情况下,通常的做法是使用一个较小的样本数据集。抽样使您能够快速尝试许多不同的模型和测试参数。

随后,完整的数据集可用于微调模型。提供的12个数据文件代表了从每个月随机抽取的总行程的2%。

导入数据到MATLAB

让我们通过将数据导入MATLAB来查看文件包含哪些信息。

首先,双击一月份的数据文件以打开导入工具。

每次行程都提供了许多详细信息,包括上车和下车的地点与时间、行程距离和车费。现在重命名一些冗长或不方便的变量名,将使后续输入更容易且不易出错。例如,tpep_pickup_datetime 可以缩短为 pickup_time

请注意,您可以通过在导入工具中单击变量名来更改它。让我们也给其他变量起更短、更具描述性的名称。本视频后的阅读材料列出了数据文件中的原始名称以及您将在本课程中使用的名称。

请注意,其中一些变量只能取少数几个值。例如,rate_code 只能取值1到6。将 rate_codevendorpayment_type 的数据类型更改为 categorical

看起来不错,让我们生成一个脚本并探索数据。运行脚本将一月份的出租车数据导入到一个表中。大多数变量,如上车和下车的日期时间,都已准备就绪可以使用。然而,分类变量都以数字作为类别名称。例如,费率代码“1”不如“标准费率”这个类别直观。

让我们使用实时编辑器来更改这些。单击变量名旁边的三角形并选择“编辑类别”。然后将类别名称从数字更改为实际的费率代码。您可以在本视频后的阅读材料中找到费率代码列表。

现在对 payment_typevendor 变量重复此过程。单击“更新代码”按钮,使这些更改成为实时脚本的一部分。别担心,您不需要每次都执行这些步骤,课程中会为您提供函数来使用。

数据可视化探索

可视化数据是快速了解变量的好方法。直观上,您会期望行程距离和车费之间存在关系。让我们通过创建车费随距离变化的散点图来验证一下。

scatter(taxiData.trip_distance, taxiData.total_amount)

嗯,这个330万英里的行程似乎不太可能,因为这大约是往返月球六次的距离。而且许多负车费值也很可疑。这些异常值主导了整个图表。

纽约市从北到南大约40英里,从图表来看,大多数车费似乎低于200美元。让我们将x轴限制在0到40英里之间,y轴限制在0到200美元之间。

这很有趣。图中似乎存在三种线性关系。一种是水平的,表明是固定车费,与距离无关。这些是否与不同的费率类型有关?使用以 rate_code 作为分组变量的分组散点图应该能回答这个问题。

gscatter(taxiData.trip_distance, taxiData.total_amount, taxiData.rate_code)

固定费率线对应于JFK机场费率代码类别。看起来另外两条线性关系对应于标准费率和纽瓦克机场费率。仅仅一个图表就让我们对数据集的趋势有了相当深入的了解。

分析变量分布

散点图显示了车费如何随行程距离变化,但这两个变量的分布情况如何?直方图将显示每种距离和每种车费的行程发生的频率。

histogram(taxiData.trip_distance)

好吧,那个前往外太空的300万英里行程再次主导了图表。处理直方图中异常值的一种方法是将箱边缘指定为第二个输入参数。任何落在箱外的点都将被排除在绘图之外。

histogram(taxiData.trip_distance, 0:0.25:10)

将箱边缘设置为从0到10英里,以0.25英里为间隔,能更好地揭示分布情况。大多数行程少于两英里,但许多较长的行程使数据向右偏斜。

车费是否显示出相同的趋势?让我们制作一个直方图看看。

histogram(taxiData.total_amount)

数据中存在一些非常高的车费。大多数车费相当小,但在远离主群的地方有一个大的尖峰。指定箱边缘,确保包含那个尖峰。使用从0到60美元的1美元增量应该可以捕捉到它。

histogram(taxiData.total_amount, 0:1:60)

车费显示出与距离直方图类似的偏态分布,但在52美元处有一个近5000美元车费的尖峰。这对应于分组散点图中JFK费率代码的水平线。

探索小费模式

车费只是出租车行程成本的一部分,小费应该是多少?让我们看看小费随车费变化的情况。

scatter(taxiData.total_amount, taxiData.tip_amount)

看起来有一些非常慷慨的付小费者。还有一些负值,这些肯定是记录错误的数据。从图表来看,似乎20美元的小费和100美元的车费将涵盖大部分数据。让我们将这些用作坐标轴限制。

xlim([0 100])
ylim([0 20])

有趣的是,您可以看到许多对应于固定金额的水平和垂直线,以及对应于小费占车费百分比的斜线。让我们再次尝试按 rate_code 分组,看看这个变量是否能解释这种行为。

gscatter(taxiData.total_amount, taxiData.tip_amount, taxiData.rate_code)

大多数标准费率车费落在图的左侧,而特殊费率代码构成了更多的高车费行程。

可视化上车地点

到目前为止,您只关注了出租车行程的成本。黄色出租车可以在城市的任何地方接载乘客。上车地点是否存在某种模式?使用地理散点图来可视化这些位置。

geoscatter(taxiData.pickup_latitude, taxiData.pickup_longitude)

看起来这些数据中也有一些极端的异常值。

将地图中心定位在纽约并放大。哇,您可以看到中央公园的轮廓。单击“更新代码”并将这些新的边界保存到实时脚本中。

总结与下一步

在本节课中,我们一起学习了如何导入和初步探索出租车数据集。您已经发现了数据集中的几种趋势和模式,同时也找到了许多异常值和错误值,例如负成本和不可能的大距离。在使用数据进行预测之前,需要清理这些数据。后续课程中,您将运用目前所学的知识来清理数据并生成一些有用的特征。

4:创建和清理特征

在本节课中,我们将学习如何为预测模型创建和清理特征。我们将以纽约市出租车数据为例,探索如何从原始数据中提取有用的信息,并处理其中的错误和异常值,为后续的机器学习建模做好准备。

数据准备与特征提取

上一节我们介绍了数据科学项目的基本流程,本节中我们来看看如何从原始数据中提取核心特征。

现代导航软件的核心功能之一是根据历史数据预测行程时间。对于出租车数据,我们需要计算行程时长,并从记录的上车时间中提取一天中的具体时刻。

以下是我们可以从现有数据中直接计算或提取的特征:

  • 行程距离:数据中已记录。
  • 上车/下车地点:数据中已记录。
  • 行程时长:通过计算下车时间与上车时间的差值获得。
  • 上车时刻:从记录的上车时间中提取。

数据清理的必要性

然而,真实数据总是杂乱的。错误和异常值会干扰分析并导致计算偏差,因此在生成新特征前,必须对数据进行清理。

清理完成后,我们可以生成所需的新变量或特征。在对新特征进行任何必要的额外清理后,就可以通过训练和测试预测模型来评估它们的有效性了。

开始数据清理

首先,让我们检查原始数据中存在多少未定义的条目。我们可以使用 ismissing 函数返回的非零索引数量进行计数。

% 检查缺失值数量
numMissing = sum(ismissing(rawData));

在这个案例中,没有未定义的值,但这并不意味着没有错误。

使用 summary 函数,可以看到距离数据中存在为零的条目。我们知道这些是错误,因为行程距离为零没有意义,可以将它们视为缺失数据。

计算受这些错误影响的数据百分比,发现它非常小,不到1%。此外,这些条目似乎是随机出现的,因此可以安全地删除它们,而不会使分析产生偏差。

利用领域知识,可以对其他应为正值或非负值的变量进行相同的基本合理性检查,例如乘客数量、车费、附加费和总费用。

识别和处理异常值

查看变量的分布是识别异常值的好方法。让我们从剩余的距离数据开始。直方图显示,一些非常大的异常值使可视化产生了偏差。

箱线图证实存在少数极端异常值,并且大部分数据集中在更低、更合理的数值上。还可以看到分布严重偏斜,这使得许多基于分位数的异常值去除方法并不理想。

例如,基于标准四分位距的边界会切掉6.5英里以上的所有数据。如果删除这些数据,将会丢失大量完全合理的行程。

相反,让我们使用 prctile 函数来检查去除顶部0.01%数据的边界在哪里。

% 计算去除顶部0.01%数据的距离边界
upperBoundDistance = prctile(cleanedData.trip_distance, 99.99);

结果显示大约是40英里,考虑到纽约市的地理范围,这似乎是一个合理的上限。使用 rmoutliers 函数执行此清理后,得到了更合理的分布。

清理地理位置数据

现在让我们看看上车和下车地点。回顾 summary 结果,会注意到上车地点的坐标为 (0, 0),位于赤道和本初子午线上。下车地点也存在同样的情况。这些一定是错误,因为出租车不可能穿越海洋。

让我们在纽约市周围定义一个宽泛的区域,只包含合理的坐标,例如北纬40度到42度,西经75度到73度。

为了消除该区域之外的所有位置,使用一个逻辑向量,然后用这个向量索引表格。

以下是创建逻辑向量的步骤:

  1. 上车纬度必须大于等于下限,且小于等于上限。
  2. 下车纬度必须满足相同条件。
  3. 上车经度必须满足类似条件(注意经度值为负)。
  4. 下车经度也必须满足相应条件。
% 定义初始地理边界
latMin = 40; latMax = 42;
lonMin = -75; lonMax = -73; % 西经为负值

% 创建逻辑向量筛选合理的地理位置
validLocations = (data.pickup_latitude >= latMin) & (data.pickup_latitude <= latMax) & ...
                 (data.dropoff_latitude >= latMin) & (data.dropoff_latitude <= latMax) & ...
                 (data.pickup_longitude >= lonMin) & (data.pickup_longitude <= lonMax) & ...
                 (data.dropoff_longitude >= lonMin) & (data.dropoff_longitude <= lonMax);

% 应用筛选
cleanedData = data(validLocations, :);

现在使用 geoplot 函数在地图上可视化该区域内的数据,首先从上车地点开始。

geoplot(cleanedData.pickup_latitude, cleanedData.pickup_longitude, ‘.’, ‘MarkerSize’, 1)

基于上车地点,看起来可以进一步缩小区域范围。为了可视化下车地点,复制并粘贴上面的代码,将表格变量更改为下车纬度和经度。同样,围绕市中心的一个更小区域似乎就能捕获所需的数据。

为了找到更精确的边界,让我们使用直方图来可视化下车纬度的分布,然后将上车纬度添加到同一图中,并添加图例作为参考。北纬40.6度到40.9度似乎可以涵盖几乎所有数据。

让我们将清理边界更新为这些新值。现在,对经度重复这个过程。复制刚刚使用的代码,并将表格变量编辑为经度变量。结果非常相似。这次,西经-74.2度到-73.6度的范围基本上涵盖了一切。因此,让我们也更新这些边界。

使用这些新边界重新运行清理和地图可视化代码,可以看到上车地点和下车地点现在看起来合理多了。

最后,为了谨慎起见,让我们验证被移除的位置数据百分比是否不太高。结果小于2%,看起来不错。

创建并清理衍生特征

现在我们已经清理了距离和位置数据,接下来需要查看的变量是行程时长和上车时刻。由于这些在原始数据中不存在,我们需要创建它们,并且可能也需要清理它们。

使用 timeofday 函数从上车日期时间中提取一天中的时刻非常简单。

% 提取上车时刻
cleanedData.pickup_timeofday = timeofday(cleanedData.tpickup);

查看其分布没有发现任何不合理之处,因此这个特征似乎不需要额外清理。让我们使用 hours 函数将这个持续时间变量转换为数值变量,因为这是机器学习算法所需要的。

接下来,通过计算下车时间与上车时间的差值来计算行程时长。使用 minutes 函数将其从持续时间数据类型转换为数值型的分钟数。

% 计算行程时长(分钟)
cleanedData.trip_duration_min = minutes(cleanedData.tdrop - cleanedData.tpickup);

现在,让我们查看这个特征的直方图。这次,分布清楚地表明需要进行一些清理。没有人会乘坐超过10,000分钟的出租车。

清理行程时长特征

基于这些结果,下一步是清理这个特征。通常,清理一个新特征通常是必要的,即使用于计算它的变量本身似乎没有异常。

再次从一些基本的合理性清理开始。行程时长必须为正数,并且肯定远小于一整天。

% 基本合理性清理:时长大于0且小于24小时(1440分钟)
validDuration = (cleanedData.trip_duration_min > 0) & (cleanedData.trip_duration_min < 1440);
cleanedData = cleanedData(validDuration, :);

双重检查清理掉的数据百分比,发现这基本上没有移除任何数据。然而,从零分钟到一整天仍然是一个不合理的大范围。

尝试使用 prctile 函数计算从顶部和底部均匀移除1%数据的边界。

% 计算移除底部0.5%和顶部99.5%的边界
lowerBound = prctile(cleanedData.trip_duration_min, 0.5);
upperBound = prctile(cleanedData.trip_duration_min, 99.5);
validDuration2 = (cleanedData.trip_duration_min >= lowerBound) & (cleanedData.trip_duration_min <= upperBound);
cleanedData = cleanedData(validDuration2, :);

大约1.5分钟到接近70分钟的范围似乎是合理的。最后,重新可视化分布,现在看起来现实多了。

总结与下一步

至此,我们已经准备好通过训练和测试预测模型来开始评估所选特征的效果了。

请记住,特征工程是一个迭代过程。可能需要返回前面的步骤执行额外的清理或计算新的特征,以增强模型。

在本节课中,我们一起学习了如何从原始数据中创建核心特征(如行程时长和时刻),并系统地清理数据中的错误和异常值(包括零值、不合理的地理坐标和极端的行程时长)。这些步骤是构建可靠预测模型的重要基础。

5:回归介绍 🎯

在本节课中,我们将要学习回归模型的基本概念。回归模型用于根据一个或多个预测变量的值来预测一个连续响应变量的值。有多种回归模型可供选择,具体选择哪一种取决于你的数据和你试图回答的问题。本节视频将详细介绍常见的线性回归、多项式回归和决策树回归模型,包括它们的工作原理以及如何训练它们。

线性回归 📈

上一节我们介绍了回归的基本目标,本节中我们来看看最基础的线性回归模型。线性回归模型通过将预测变量的值乘以一组系数来预测响应值。通常还会包含一个称为截距或偏置的加法项。

公式y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ

虽然回归通常包含多个预测变量,但为了便于说明概念,我们先看一个只有一个预测变量的例子。这里,预测变量显示在x轴上,响应变量显示在y轴上。例如,你想根据距离来估计出租车行程的时长。数据点代表行程距离(X轴)和行程时长(y轴)的数据。

回归的初步尝试可能是找到一条能捕捉图中趋势的直线。然而,有许多可能的直线都能合理地捕捉趋势。那么,如何为给定的模型和数据集选择系数值呢?

模型评估:残差与均方误差

首先,考虑观测到的响应值与模型预测值之间的差异。这个差异被称为残差。较大的残差对应较大的误差,较小的残差意味着较小的误差,也就是更好的预测。此外,正残差表示观测值大于预测值,而负残差则表示相反。

为了了解模型在整个训练数据集上的表现,你可以对所有残差求平均值。然而,正负残差会相互抵消,导致平均值很小,即使你的模型很差。为了解决这个问题,在求平均值之前先将残差平方,确保所有值都是正数。

以下是计算均方误差的步骤:

  1. 计算每个数据点的残差:残差 = 观测值 - 预测值
  2. 将每个残差平方。
  3. 计算所有平方误差的平均值。

这个过程被称为计算模型的均方误差。现在你可以看到,最佳的线性回归模型是给出最小均方误差的那条直线。当你训练模型时,就是寻找使这个值最小化的系数。虽然具体过程有些复杂,但MATLAB函数会自动为你处理。

训练完成后,线性回归模型提供一个方程,使用新观测的预测值来估计响应值。在这个例子中,意味着能够根据距离预测行程的时长。

线性回归模型有几个优点:

  • 训练速度快。
  • 易于理解,即使对非数据科学家也是如此。
  • 易于可视化。
  • 预测速度快,因为它们只使用基础数学。

然而,当你需要预测更复杂的行为时,简单的线性模型可能不够用。

多项式回归与交互项 🔄

例如,当趋势不再遵循简单的直线时,通常会用多项式方程(如二次方程)来拟合数据。这是通过在公式中加入一个额外的x²项来实现的。现在有一个额外的项来解释曲线的弯曲。但训练模型的过程与直线相同。最终,结果是给定数据下具有最小均方误差的抛物线。

除了二次项,还可以添加更多项,如X³等。这被称为多项式回归,添加这些高阶项有助于捕捉更复杂的行为。

但在此之前,这里有一个快速问题:拟合多项式方程仍然被认为是线性回归吗?多项式回归只是线性回归的一个特例,其中每个多项式项在技术上都是一个新的预测变量。对于算法来说,这个方程本质上与考虑两个独特的预测变量相同。

此外,就像多项式项可以通过变量自乘生成一样,也可以通过将不同的变量相乘来创建新项。这些额外的预测变量被称为交互项。当响应变量不仅依赖于预测变量的单独值,还依赖于它们的组合乘积时,就应该包含交互项。

例如,行程的时长取决于距离,但也取决于出租车的平均速度。因此,通过包含距离和速度之间的交互项,可以提高模型的准确性。

非线性回归与决策树 🌳

但是,当线性回归不足时会发生什么?在这种情况下,你可以使用非线性回归。有几种类型的非线性回归模型使用完全不同的方法来预测响应变量。数据科学中其他常见的算法是决策树、高斯过程回归和支持向量机。后两者与线性回归相似,因为它们从连续方程中得出预测。然而,它们的训练过程和底层算法更为复杂。

另一方面,决策树是一种常见且高度自适应的模型类型,可以执行回归和分类。那么它们是如何工作的呢?本质上,它们会问一系列关于预测变量的真假问题,以便将具有相似响应变量的数据分组。

例如,这类似于你如何预测从肯尼迪机场到时代广场的即将到来的驾驶时长。从该路线先前行程时长的数据集开始,你可能使用平均值来预测即将到来的时长。但请注意,数据集中有很多尚未解释的变异性。

因此,你可以使用问题将数据分成两组。例如,哪些行程是在周末进行的?这为预测提供了两个平均时长可供选择。但两个数据子集内部仍然存在变异性,所以下一个问题可能是:行程是在高峰时段进行的吗?

这进一步分割了你的数据,并通过提供另一个取决于即将到来的行程条件的估计时长来再次加强预测。根据一系列真假问题细分数据的过程会持续进行,直到每个子集内的变异性最小。

模型训练完成后,要进行预测,只需将即将到来的行程作为一个数据点,跟随这一系列问题,直到你到达一个具有代表性的平均时长。例如,假设是工作日,而且是高峰时段,但不是节假日。

与大型数据集可能构建的模型相比,这个示例树模型很简单。它只包含三次分割和四个预测,这些预测被称为叶节点。然而,对于具有许多特征的大型数据集,树模型可能变得相当复杂,有数千个分割和叶节点。

幸运的是,分割过程在模型训练期间会自动处理。不过,你必须设置一些初始参数,例如最大分割次数,以限制树的生长。这反过来又会影响提出哪些问题以及顺序,从而影响最终模型。

总结

本节课中我们一起学习了选择回归模型时的几种选项。你了解了线性回归如何通过最小化均方误差来拟合数据,以及多项式回归和交互项如何扩展线性模型以捕捉非线性关系。我们还探讨了决策树这种非线性模型,它通过一系列问题分割数据来进行预测。接下来,你将学习如何使用这些模型,并为你的应用选择一个合适的模型。

6:使用回归学习器应用程序 🚖

在本节课中,我们将学习如何使用MATLAB的回归学习器应用程序,通过迭代地选择、训练和评估多种回归模型,来预测纽约市出租车行程的时长。


有多种回归模型可供选择,但通常无法预先知道哪一种最合适。因此,需要测试几种不同的方法。

回归学习器应用程序可以帮助你快速训练模型。它协助完成从选择数据到导出训练模型的整个过程。选择、训练和评估模型的任务是迭代进行的。这种探索过程是该应用程序工作流程的优势,它让你能够快速测试模型并比较结果。

为了跟上进度,首先需要将出租车数据导入MATLAB。使用数据集附带的定制导入函数来导入五月份的数据。行程时长很可能与一天中的时间有关。因此,我们添加“time_of_day”作为一个新特征,以考虑交通状况的潜在变化。课程文件中提供的名为add_time_of_day的函数可以为你完成此特征提取。它会创建一个名为time_of_day的新变量,这是一个介于0到24之间的连续数字,代表行程开始的小时数。现在,你已准备好使用回归学习器应用程序对出租车数据进行建模。


选择数据

应用程序工作流程的第一步是选择要建模的数据。

首先点击“新建会话”按钮。这会打开一个窗口,提示你选择要使用的数据集。从第一个下拉列表中选择出租车数据。接下来,需要指定哪个特征是你要预测的响应变量,在本例中是行程时长。然后,选择预测变量。

有许多变量可供选择,但并非所有变量都对预测响应变量有用。例如,行程时长不太可能取决于乘客数量。让我们从简单开始,选择两个可能的预测变量:distancetime_of_day。最后,通常在训练期间会使用验证,但你将在课程后面学习这项技术,所以现在选择“无验证”,然后点击“开始会话”返回应用程序。

现在你已经加载了出租车数据并选择了预测变量和响应变量,可以开始探索模型并比较它们的结果了。


熟悉应用程序界面

首先,花点时间熟悉一下应用程序界面。有几个工具将用于训练和评估模型,包括顶部的工具条、包含模型历史和详细信息的数据浏览器,以及位于中心的可视化窗口。

默认的可视化称为“响应图”,它将响应变量(本例中为duration)绘制在Y轴上。请注意,默认情况下,X轴是记录号,即每个数据点在原始表格中的行号。你可以使用绘图右侧的下拉列表将X轴更改为预测变量,例如distance。在探索过程中的任何时候,都可以使用特征选择选项指定不同的预测变量组合以包含在模型中。此外,如果你有许多特征,可以在应用程序内执行主成分分析,以测试降维后的特征集。

对于这个应用,让我们看看仅使用单个变量distance是否足以准确建模行程时长。现在,你已准备好开始迭代选择、训练和评估模型的过程。


训练第一个模型

在工具条中,你可以选择要训练的回归模型。模型按类型分组,每种类型提供多个默认选项。

基本的线性回归通常是一种快速且简单的训练模型。因此,从列表中选择“线性”。然后点击“训练”按钮来生成你的第一个回归模型。

请注意,图中添加了黄色标记,代表模型对时长的预测值。你还会注意到,关于新模型的信息已出现在左下角的当前模型浏览器中。此区域显示有关模型的重要信息,例如性能指标、使用的模型特定选项以及包含的特征。

工具条中还有其他几种可视化工具可帮助你分析新模型。


分析模型性能

下一个可视化称为“预测值与实际值图”,它有助于确定是否有任何响应值建模不佳。在这里,行程时长的响应变量显示在两个轴上。X轴代表数据集中的真实值,而Y轴代表模型的预测值。因此,每个数据点的残差是到黑线的垂直距离。

但如果你想知道模型的残差如何依赖于每个变量呢?为了找出答案,选择下一个可视化:“残差图”。默认情况下,X轴与上一个图相同,而Y轴现在代表每个观测值的残差。然而,也可以将X轴更改为不同的预测变量,以可视化残差如何依赖于它们。例如,通过选择X轴为预测变量并选择time_of_day,你可以看到残差对行程出发时间有一定的依赖性。最明显的是,清晨时段的时长往往被高估。

因此,让我们看看通过使用特征选择按钮将time_of_day变量添加到模型中,结果是否能得到改善。


添加特征并训练多个模型

由于新模型尚未训练,残差图显示为空白。现在,返回到响应图。之前,你只训练了一个线性回归模型,但应用程序也允许你一次训练多个模型。在模型菜单中,前两个选项是“全部快速训练”和“全部”。“全部”训练此列表中的每个模型,这包括更高级的算法,如支持向量机和高斯过程回归,因此对于大型数据集,训练所有模型可能需要数小时才能完成。“全部快速训练”选项仅训练最快的模型,特别是线性回归以及一些回归树。选择此选项并点击按钮开始训练。

整个过程可能需要几分钟才能完成,具体取决于你的计算机。

那么,添加time_of_day是否改进了你之前的模型?为了进行比较,你可以查看当前模型浏览器中显示的几项指标。


评估和比较模型

例如,有均方误差,它在线性回归的训练过程中被最小化。通常也会比较该值的平方根,称为均方根误差。你会注意到,为了快速参考,历史浏览器中会显示RMSE。

最终,看起来添加time_of_day变量仅略微改善了线性回归的均方根误差。

然而,树模型的表现明显更好。每个树模型都遵循相同的过程:基于预测值迭代地进行分割,以便将数据划分为具有相似响应值的组。精细、中等和粗糙树之间的区别是预定义的单个叶节点中的最小观测值数量。你可以在当前模型浏览器中看到这个值。对于精细树,最小叶节点大小为4,而对于粗糙树是36,这意味着总的叶节点更少。

但如果你需要制作一个比默认粗糙选项更粗糙的树呢?所有模型都有可以自定义的高级选项。对于回归树,这些选项包括设置你自己的最小叶节点大小。


导出模型

在回归学习器应用程序中交互式地创建回归模型后,你可以通过导出来保存最佳模型。有两种方法可以做到这一点:你可以导出训练好的模型,也可以保存用于训练模型的算法。

首先,让我们导出训练好的模型。这种方法允许你从脚本访问模型以进行预测。选择精细树回归模型并选择此选项。这会将模型作为自己的变量保存在MATLAB工作区中,因此你需要给这个变量起一个名字。

现在你可以在MATLAB工作区中看到该模型。它在这里被列为结构体类型。这是一种可以使用点号表示法像表格一样访问的数据类型。例如,如果你键入模型的名称,你会看到一个自动完成的可用变量列表。标记为regression_tree的变量是导出模型的存储位置。然后,你可以用第二个点号深入模型。本质上,应用程序中的所有数据现在都存储在这个MATLAB工作区变量中。例如,如果你选择变量X并执行脚本,你将看到回归树的预测变量表,在本例中是distancetime_of_day。同样,变量y保存行程时长的响应值。

稍后你将学习如何使用训练好的模型对新数据进行预测。但现在,如果不想保存训练好的模型,而是想使用不同的数据集重新训练一个新模型,而不重复在应用程序中执行的所有步骤,该怎么办?


导出训练函数

这时,应用程序的第二个导出选项就很有用了。通过此选项,你可以生成一个函数,该函数保存模型的训练过程,而不是训练好的模型本身。现在选择此选项以创建一个新函数。

这将在MATLAB中打开一个新文件。这里会自动提供注释来记录函数的使用方法,而代码部分则重新创建了应用程序训练模型所采取的精确步骤。


总结

在本节课中,我们一起学习了如何使用回归学习器应用程序的工作流程,迭代地选择、训练和评估多个回归模型,以预测出租车行程的时长。稍后,你将学习如何使用训练好的模型对新数据进行预测。

7:自定义模型参数 🛠️

在本节课中,我们将学习如何通过编写代码来自定义回归模型的参数,以提升模型性能。我们将以线性回归和回归树模型为例,介绍从数据导入、模型训练、结果预测到参数调整的完整工作流程。


概述

上一节我们介绍了在回归学习器应用中尝试不同模型。本节中,我们来看看如何通过编写代码来自定义模型参数,例如为线性回归模型添加高阶多项式项,以获得最佳性能。


导入数据与特征工程

首先,导入一个月的出租车数据,并添加一些额外特征,例如行程发生的时间段。目标是训练一个能够预测行程时长的模型。

% 示例:导入数据并添加特征
% taxiData = readtable('taxi_data.csv');
% taxiData.TimeOfDay = hour(taxiData.PickupDateTime);

训练线性回归模型

要拟合线性回归模型,请使用 fitlm 函数。

以下是训练模型的基本步骤:

  1. 将出租车数据表作为第一个参数。
  2. 将模型类型指定为第二个参数,这里先使用字符串 'linear'
  3. 使用名称-值对指定响应变量和预测变量。
linearModel = fitlm(taxiData, 'linear', 'ResponseVar', 'Duration', 'PredictorVars', {'Distance', 'TimeOfDay'});

运行此代码后,将看到大量关于模型的信息。顶部是一个描述模型的表达式,其中包含变量名称。下面的部分提供了关于拟合系数和统计信息的更多详情。例如,距离的系数估计值为正,这意味着距离和时长呈正相关。


检查模型与进行预测

要更详细地检查输出,可以在工作区中双击模型变量。您将看到具有不同类型信息的多个属性。您可以在脚本中使用点表示法访问这些属性。

例如,要查看拟合系数的信息,可以输入:

coeffInfo = linearModel.Coefficients;

这是一个表格,包含与 fitlm 输出中显示的相同的估计值和统计信息。

虽然可以使用这些系数来计算预测的时长值,但使用名为 predict 的函数更为简便。第一个输入应为训练好的模型,第二个输入应是一个列名与训练数据匹配的数据表。目前,我们先使用训练数据本身。

predictedDuration = predict(linearModel, taxiData);

输出是一个响应预测向量,在本例中即行程时长(分钟)。


评估初始模型性能

让我们通过添加一个散点图来查看这些预测值与实际响应的比较情况,其中X轴为时间段。

scatter(taxiData.TimeOfDay, taxiData.Duration, 'b.');
hold on;
scatter(taxiData.TimeOfDay, predictedDuration, 'r.', 'MarkerFaceAlpha', 0.3);
xlabel('Time of Day');
ylabel('Trip Duration (minutes)');
legend('Actual', 'Predicted');

可以看到预测点和实际点之间存在显著的重叠。但是,中午时分的预测时长与一天中其他时段的预测时长差异不大,而实际上它们应该更低。这表明模型有改进空间。


自定义线性回归模型

除了 'linear' 选项,fitlm 还有其他选择,例如 'interactions''quadratic'。由于时长在一天中可能上下波动,进一步自定义模型以包含高阶项可能是个好主意。

对于多项式回归,使用字符串 'poly',后跟一系列整数,用于指定每个预测变量的多项式阶数。

例如,输入 'poly14' 可以为距离设置一阶项,为时间段设置最高四阶的项。

polyModel = fitlm(taxiData, 'poly14', 'ResponseVar', 'Duration', 'PredictorVars', {'Distance', 'TimeOfDay'});

现在可以在输出中看到四阶项,以及低阶项和交互项。当您重新运行包含散点图的代码段时,可以看到预测结果有所改善。现在,模型预测清晨和深夜的行程时长较短。

您也可以完全用 Wilkinson 表示法格式的表达式替换此字符串。由于变量在表达式中已明确指定,因此不需要包含响应和预测变量选项。

例如,您可以通过将时间段提升到四次方,然后将两个变量相乘,来重建具有交互作用的多项式模型。

customModel = fitlm(taxiData, 'Duration ~ Distance * TimeOfDay^4');

请注意,输出中的几个项带有冒号,在 Wilkinson 表示法中用于表示交互作用。您可以在输出顶部的完整展开表达式中看到这些带冒号的项是如何包含的。


训练回归树模型

接下来,让我们重复训练过程,使用回归树模型,以便了解 fitrtree 函数与 fitlm 的异同。

fitlm 类似,数据表应是 fitrtree 的第一个参数。然而,第二个参数是响应变量名称 'Duration'。最后,使用名称-值对指定预测变量。

treeModel = fitrtree(taxiData, 'Duration', 'PredictorNames', {'Distance', 'TimeOfDay'});

请注意,训练模型可能需要很长时间,具体取决于数据集大小和模型类型等因素。回归树的默认选项将创建一个具有大量叶子的树,这比之前的线性回归模型训练时间更长。


检查回归树模型

fitrtree 的输出是一个模型变量,具有其独特的属性。让我们从工作区打开模型来查看它们。例如,NumNodes 属性是树大小的度量,它是决策节点(或分割)数量与终端节点(或叶子)数量之和。

要查看树本身,请使用 view 函数。输出是定义树结构的决策规则列表。

view(treeModel, 'Mode', 'text');

可以看到顶部节点都使用距离变量,这表明距离是该模型中最重要的预测变量。


评估回归树预测

让我们通过另一个散点图来查看此模型如何预测时长。像之前一样,使用 predict 函数和树模型,然后绘制预测响应与时间段的关系图。

treePredicted = predict(treeModel, taxiData);
scatter(taxiData.TimeOfDay, taxiData.Duration, 'b.');
hold on;
scatter(taxiData.TimeOfDay, treePredicted, 'g.', 'MarkerFaceAlpha', 0.3);
xlabel('Time of Day');
ylabel('Trip Duration (minutes)');
legend('Actual', 'Predicted (Tree)');

实际值和预测值之间显然有更多的重叠。但这是好事吗?出租车数据与大多数现实世界的数据一样,存在噪声。这个模型似乎在拟合主要趋势之外,还拟合了噪声。因此,简化树结构以减少节点数量可能更好。


自定义回归树参数

那么,如何自定义回归树呢?fitrtree 有许多选项,但两个重要的选项是 MinLeafSizeMaxNumSplits

MinLeafSize 参数设置每个叶子必须包含的数据点数量的阈值。MinLeafSize 的默认值为 1。让我们将此值增加到 50。这种自定义将使树更小或更粗糙,类似于在回归学习器应用中从精细树更改为粗糙树。

treeModelCustom1 = fitrtree(taxiData, 'Duration', 'PredictorNames', {'Distance', 'TimeOfDay'}, 'MinLeafSize', 50);

再次查看散点图,看看这如何影响预测。现在,实际值和预测值之间的重叠减少了。但这可能是件好事,因为模型没有拟合数据中的所有噪声变化。

另一个 fitrtree 选项 MaxNumSplits 将明确设置树的决策规则数量。尝试将此值设置为 20 并再次训练模型。

treeModelCustom2 = fitrtree(taxiData, 'Duration', 'PredictorNames', {'Distance', 'TimeOfDay'}, 'MaxNumSplits', 20);

现在模型的节点比以前更少,因为树中只有 20 次分割。您可以通过将 mode 选项设置为 'graph',使用 view 函数以图形方式可视化树。

view(treeModelCustom2, 'Mode', 'graph');

将出现一个单独的图,显示树的可视化表示。您可以放大以检查各个分支。例如,此节点使用距离创建两个分支,然后根据时间段进行分割。

请记住,当有成千上万个节点时,这种类型的可视化会非常混乱。

让我们最后看一下散点图。

treePredictedCustom2 = predict(treeModelCustom2, taxiData);
scatter(taxiData.TimeOfDay, taxiData.Duration, 'b.');
hold on;
scatter(taxiData.TimeOfDay, treePredictedCustom2, 'm.', 'MarkerFaceAlpha', 0.5);
xlabel('Time of Day');
ylabel('Trip Duration (minutes)');
legend('Actual', 'Predicted (Custom Tree)');

您现在可以看到预测数据点的明显条带,这是决策规则较少的结果。换句话说,这种自定义使模型过于简单,可能会损害性能。

为所有不同参数选择一个好的值是一个难题,但别担心,您将在后续模块中学习有助于选择参数的不同技术。


总结

本节课中,我们一起学习了如何通过编写代码来训练、检查和自定义几种类型的回归模型。自定义选项将帮助您从模型中获得最佳性能。

请记住,MATLAB 中的许多拟合函数共享相似的功能和选项,但对于不同的模型类型存在细微差别。在自定义模型时,请花些时间查阅文档,以查看所有可用的选项和示例。

8:评估回归模型 🎯

在本节课中,我们将要学习如何评估回归模型的性能。我们将了解几种不同的评估指标,学习它们的计算方法,更重要的是,掌握如何解读这些指标,以便比较不同模型并选择最佳的一个。

你已经学习了不同类型的回归模型,以及如何使用回归学习器应用快速训练多个模型。

但是,如何比较不同的模型以选择性能最佳的那个呢?

应用会报告一个名为均方根误差的值。

但这个数字究竟意味着什么?是否有其他衡量回归模型性能的方法?

本节中,我们将探讨几种关键的评估指标。

理解残差与误差指标

所有本节介绍的指标都是基于模型的残差来计算的。残差是实际数据点与模型预测值之间的差值。

如果模型能很好地预测响应值,残差将接近0;反之,残差则会较大。衡量残差的一种方法是计算它们的平均大小。

以下是基于残差计算的核心误差指标:

  • 平均绝对误差:首先取每个残差的绝对值,然后计算其平均值。这个指标称为MAE。MAE非常实用,因为它简单且易于沟通。例如,MAE与响应变量具有相同的单位。如果一个预测出租车行程时长(分钟)的模型MAE为5,那么可以说预测时长平均偏差5分钟。
    • 公式MAE = mean(abs(实际值 - 预测值))
  • 均方误差与均方根误差:回归模型在训练时通常使用残差的平方而非绝对值,因此基于平方残差的指标也很常见。将所有残差平方的面积相加,得到误差平方和。计算这些平方面积的平均值,则得到均方误差。MSE的优点是会放大较大的误差。但MSE的单位是响应变量单位的平方。因此,更常报告的是MSE的平方根,即均方根误差
    • 公式
      • MSE = mean((实际值 - 预测值)^2)
      • RMSE = sqrt(MSE)

MAE和RMSE对于模型间的比较非常有用。例如,可以比较线性回归模型与回归树模型的误差值。通常,误差值较低的模型性能更好。

引入基准模型:R平方

然而,上述误差指标只能告诉你两个模型相比如何,无法判断一个模型是否客观地对数据拟合良好。

不同的思路是将模型与一个简单的基准模型进行比较。这就是R平方指标背后的动机。

最简单的基准模型是什么?一个选择是位于响应值平均值处的一条水平线。

计算这条基准线的预测残差平方和,得到总平方和。R平方值就是回归模型的SSE相对于SST的相对减少量。可以将其理解为,通过拟合更复杂的模型所消除的总误差比例。

  • 解读
    • 如果模型预测准确,SSE值相对于SST会很小,使得R平方值非常接近1。
    • 如果预测不准确,SSE和SST值相似,R平方值则接近0。
    • 公式R² = 1 - (SSE / SST)

R平方值还有一个有用的特性:与误差指标不同,它不依赖于数据的尺度。无论响应变量的单位或数值范围如何,R平方都在0到1之间,更高的值表示更好的性能。

综合运用指标进行模型选择

回到之前的例子,线性回归模型的R平方值更高,这支持了它是更好选择的结论。然而,回归树的R平方值也接近1,表明它也是一个可行的模型。

当比较两个新模型时,即使MAE和RMSE值与之前的例子相似,但若两者的R平方值都很低,则表明这两个模型的表现都不佳。

如果遇到这种情况,可能需要添加不同的特征或重新考虑模型的选择。数据可能具有某种潜在结构,而不同的模型或许能够捕捉到它。更好的选择将带来更低的误差指标和更高的R平方值。

总结

本节课中我们一起学习了评估回归模型的几种指标。

  1. 所有指标都使用模型残差来量化模型性能。
  2. MAE、MSE和RMSE是误差度量,数值越低越好。这些度量对于模型间的比较很有用。
  3. R平方衡量的是模型相对于简单基准模型的表现,其值介于0到1之间,数值越高表示性能越好。
  4. 最后,综合使用这些指标,可以帮助选择性能最佳的回归模型。

9:在MATLAB中评估模型 🧮

在本节课中,我们将学习如何在MATLAB中评估回归模型的性能。我们将通过计算关键指标和创建可视化图表,来深入理解模型的表现,并判断其是否适用于实际场景。

你已经学习了如何通过解释RMSE和R平方等指标来评估回归模型的性能。你也看到了在回归学习器应用中可视化模型性能的一些方法。在本视频中,你将看到如何在MATLAB中可视化预测模型的结果并计算回归指标。你将学习如何回答以下问题:模型在哪些地方表现良好?在哪些地方表现不佳?这些指标有什么实际意义?考虑到模型的应用场景,其性能是否合理?

计算回归指标

上一节我们介绍了评估模型的重要性,本节中我们来看看如何具体计算这些指标。

让我们从一个之前见过的线性回归模型开始,该模型使用出租车数据预测行程时长。使用距离和一天中的时间作为预测变量,并将模型类型设置为poly14。这意味着模型将包含距离的一阶多项式项,以及一天中时间的高达四阶的项。

记住,你可以使用predict函数来获取预测的时长。将这些预测值分配给一个名为y_predict的变量。然后将实际的时长值分配给一个名为y_actual的变量。这些是你计算回归指标所需的变量。

首先,使用这些变量计算残差,通过从y_actual中减去y_predict得到。

让我们使用残差来计算均方根误差。记住,RMSE是通过取残差平方的平均值的平方根来计算的。

在MATLAB中,这可以通过将每个残差进行平方,然后应用meansqrt函数来轻松计算。

residuals = y_actual - y_predict;
RMSE = sqrt(mean(residuals.^2));

该模型的RMSE约为6.5。

你可以对其他指标重复类似的过程,但为了帮助你,这里提供了一个名为R_metrics的函数,可以同时计算多个值。该函数将返回一个包含以下指标的表:平均绝对误差、均方误差、均方根误差和R平方。

当前模型的MAE约为4.5,这意味着预测的行程时长平均偏差约4.5分钟。考虑到一些出租车行程可能超过一小时,这似乎是合理的。然而,R平方值约为0.68。记住,接近1的值表示更好的性能,所以这个模型肯定不完美。

可视化模型性能

如果模型表现不佳,那么可以在哪些方面改进?误差对于任何行程时长是否一致?为了回答这些问题,让我们创建一些可视化图表。

你在回归学习器应用中看到的一个可视化是响应图。让我们通过在同一坐标轴上绘制y_actualy_predict来制作一个。

预测值捕捉到了一些时长与距离的趋势。但请注意,存在一些值不重叠的区域。这可能表明模型在这些地方表现不佳。

另一种比较预测值和实际值的方法是使用散点图,这在应用中被称为“预测值与实际值”图。

这里的黑色对角线标记了值相等的点。因此,在这种情况下,点大致围绕对角线分布是好的。但似乎低于对角线的点比高于对角线的点多。这表明预测值往往低于实际值。当然,很难看出大多数数据点的位置,因为很多点相互重叠。

另一种可视化是二维直方图,它使用颜色来表示点的密度。

直方图中最密集的区域,即数据点最多的区域,用黄色表示。

当你放大黄色区域时,可以看到它实际上位于对角线上方。这意味着对于最常见的短行程,模型倾向于高估时长值。这与放大前看到的趋势相反,意味着模型对于不常见的较长行程会低估时长。

现在,你已经确认误差并非对所有时长都一致。但是预测中是否存在整体偏差?

为了回答这个问题,让我们制作一个残差的直方图。它们应该围绕0中心分布,对于这个模型来说,这似乎大致正确。无论如何,从X轴的范围可以看出,一些残差相当大。看起来最差的预测偏差超过一个半小时。考虑到MAE不到五分钟,这是一个相当大的值。

为了更详细地查看这个分布,让我们重新创建应用中的残差图,该图显示了残差相对于响应值的分布。但让我们使用另一个二维直方图来更好地理解数据点的密度。

你再次可以看到,短行程往往被高估,因为数据点最多的黄色区域略低于0。然而,还有另一个趋势需要指出。残差的散布在响应值范围内发生变化,意味着残差的方差不是均匀的。这表明模型对某些时长的预测比其他时长更准确。理想情况下,这不应该发生,但对于预测出租车行程时长来说,这可能是可以接受的。你可能不关心短行程偏差5分钟,但长行程偏差20分钟或更多。这回答了关于模型偏差的问题。误差在响应范围内并不一致,但预测中似乎没有整体偏差。

比较不同模型

接下来,让我们看看回归树模型是否表现出类似的行为。首先,在此脚本中保存你的工作,然后单击“另存为”以创建脚本副本并使用不同的文件名。

现在你可以进行更改而不会丢失之前的工作。

滚动回脚本顶部,将fitlm函数调用替换为fitrtree。为了公平比较,使用相同的预测变量,并设置最小叶节点大小为50。然后单击“运行到结束”按钮以运行整个脚本(加载数据部分除外)。让我们滚动浏览脚本以查看模型的性能。

R_metrics输出显示该模型的MAE为3.73,RMSE为5.6,R平方为0.76。这些值都比线性回归模型好,误差指标更低,R平方更高。因此,回归树模型具有更好的指标。但这在实际中意味着什么?平均误差改善了大约一分钟,根据应用场景,这可能很重要。

例如,使用此模型做出财务决策的出租车公司可能会喜欢更好的性能,因为即使准确性的微小提高也可能带来显著的成本节约。然而,如果手机应用程序使用该模型提供行程估算,那么最终用户可能不会注意到甚至不关心额外的准确性。

让我们继续看可视化图表。时长与距离的散点图表明,树模型捕捉到了更多随距离变化的趋势。当你将此图与之前的版本进行比较时可以看到这一点。线性回归图显示预测值和实际值之间的重叠较少。

预测值与实际值的二维直方图也显示了准确性的提高,因为密集的黄色区域更接近对角线。然而,黄色区域仍然略高于对角线,表明树模型也高估了短行程的时长。

最后,残差的二维直方图表明,残差的散布仍然不均匀。当你将所有信息汇总在一起时,你可以说回归树的性能优于线性回归模型,但仍然存在类似的问题,例如长行程的误差较大。尽管如此,对于某些应用来说,它可能足够准确。

总结

本节课中我们一起学习了如何在MATLAB中使用可视化和指标来评估回归模型。

总结如下:

  • 使用如MAE、RMSE和R平方等指标来评估和比较回归模型。
  • 然而,由于这些值不能说明全部情况,因此使用可视化来更深入地理解模型性能。
  • 寻找预测中的偏差,以及模型表现不佳的具体区域。
  • 最后,在评估时考虑模型的应用场景。领域和具体情况在判断模型性能时应发挥重要作用。

10:回归总结 🎯

在本节课中,我们将对回归分析模块进行总结,回顾核心概念与工作流程,并指导你如何应用所学知识进行实践。


你已经成功完成了本模块的学习。回归模型用于预测连续的数值型结果。

在本课程中,我们以预测出租车行程时长为案例,但相同的工作流程适用于许多其他应用场景。

以下是几个典型的回归应用示例:

  • 预测电力需求
  • 预测温度
  • 估计股票价格



上一节我们介绍了回归的应用场景,本节中我们来看看所掌握的工具。现在,你可以使用回归学习器应用程序来训练多种类型的模型。

以下是使用该应用程序的关键步骤:

  • 尝试使用不同的预测变量组合。
  • 利用应用程序提供的可视化图表和评估指标,来确定最适合你应用场景的建模方法。



在应用程序中比较和测试模型后,你很可能需要更详细地探索其他模型选项和参数。现在,你可以使用代码来进一步定制和训练模型。

同时,你也学会了如何解释均方根误差和R平方等关键指标。一个好的模型应同时具备较低的RMSE和接近1的R平方值。

核心评估指标公式如下:

  • 均方根误差RMSE = sqrt(mean((y_true - y_pred).^2))
  • R平方R² = 1 - (SS_res / SS_tot)


在尝试测验之前,建议你动手实践创建一些回归模型。

如果你有自己的数据集,并且其响应变量是连续数值,可以尝试构建一个有效的模型。

以下是进行实践的建议:

  • 使用对你有实际意义的数据集是极佳的练习方式。
  • 在查看模型评估指标时,运用你的领域知识来解读这些值,并判断模型是否按预期工作。



如果你没有现成的数据集,也无需担心,你可以利用课程中的出租车数据探究许多问题。

例如,你可以尝试以下挑战:

  • 改进行程时长的预测精度。
  • 尝试预测行程费用。

当你准备就绪,即可参加本模块的测验。祝你好运。


本节课中我们一起学习了回归模型的完整工作流程,从应用场景识别、使用回归学习器App训练与比较模型,到利用代码进行高级定制,以及关键评估指标(RMSE和R²)的解读。最重要的是,我们强调了通过实践来巩固技能,无论是使用个人数据还是课程提供的示例数据。

11:分类介绍 🎯

在本节课中,我们将要学习分类模型的基础知识。分类是机器学习的一个核心领域,它用于根据一个或多个预测变量来预测离散的响应值。我们将介绍几种最流行的分类模型,并解释它们的工作原理。

分类概述

上一节我们介绍了回归模型,本节中我们来看看分类模型。分类模型使用一个或多个预测变量来预测离散的响应值。你可以将其理解为将未知项目归类到一个离散的类别集合中。

分类的应用非常广泛,例如:

  • 电子邮件过滤
  • 语音和手写识别
  • 医疗诊断

分类问题示例

假设你在纽约市,想要根据上车和下车地点等特征来预测某次行程是否需要支付过路费。

请注意,这里的目标不是预测过路费的具体金额,而是将行程归类为“需要过路费”或“不需要过路费”。这意味着这个问题有两个类别。你可以使用分类数据标签如“有”和“无”,或者使用逻辑值“真”和“假”。

无论你如何命名类别标签和选择变量,分类的目标都是为未标记的测试案例确定类别标签。

在这个例子中,我们有两个类别,这被称为二元分类。但你也可能遇到更复杂的问题,例如需要识别过路费的来源。

具有三个或更多类别的问题被称为多类分类。为了介绍分类概念,本视频将重点讨论二元分类。

有多种分类模型可供选择,以下是一些最常见的模型。

常见分类模型

你已经学习了回归中决策树的基础知识。在分类情况下,主要区别在于响应变量现在是离散的,因为可能的结果是从你的类别列表中预先确定的,而不是基于数据计算得出的。

接下来,让我们更仔细地看看逻辑回归、K最近邻和支持向量机。请记住,每个模型都可以处理任意数量的预测变量。

逻辑回归

让我们从逻辑回归开始。逻辑回归类似于线性回归。

线性回归中,你找到一个方程,使用预测变量来预测连续的响应值。
逻辑回归中,目标同样是找到一个方程,但现在是为了估计一个二元响应变量,例如“是/否”或“真/假”,所有这些都可以编码为0或1。

为了实现这一点,逻辑回归不是将一条直线拟合到数据,而是拟合一个S形的逻辑函数,也称为Sigmoid函数。这条曲线从0到1,它根据你的预测特征来估计行程需要过路费的概率。

因此,逻辑回归仍然使用一个公式,但这个公式更适合二元问题。与线性回归的情况一样,任务是确定方程的系数。

需要注意的是,你可以选择一个阈值。如果概率大于这个阈值,则预测行程需要过路费;否则,预测不需要。很容易假设分类阈值应始终为0.5。但阈值取决于具体问题,在许多情况下,你必须调整阈值。例如,你可能会设置一个高阈值来分类垃圾邮件,以免过滤掉重要的电子邮件。

当你有一个二元响应变量时,应该考虑使用逻辑回归,这正是该模型独特构建的目的。此外,当你的数据行为良好且关系不太复杂时,这个模型效果很好。因为它训练速度快,所以非常适合作为初始基准模型。

K最近邻

有时,你的数据对于简单的数学公式来说过于复杂。在这种情况下,使用一种称为K最近邻的分类模型是一个好方法。

该分类模型假设相似的事物存在于相近的位置,换句话说,彼此靠近。KNN通过查看给定数量K的邻近观测值来预测响应。

为了更好地理解KNN的工作原理,考虑一个你将K设置为3的例子。对于一个新数据点,分类将考虑其3个最近的邻居。这里,注意有两个数据点标记为“有”,一个标记为“无”。由于大多数邻居是“有”,因此新数据点被分类为“有”。这也被称为多数投票机制

KNN模型与逻辑回归不同,因为进行新预测需要参考所有现有数据,而不是通过数学方程运行。因此,对于大型数据集,KNN模型在计算上可能很昂贵。此外,你需要注意K的正确值。K值为1可能导致预测对噪声或异常值的鲁棒性较差。较大的K值由于多数投票机制会产生更稳定的预测。但最终,非常大的K值会使预测变得不那么准确,因为难以捕捉复杂的行为。你需要调整K以找到最适合特定数据集的值。

根据K值的大小,通常使用术语“精细”、“中等”和“粗糙”来描述KNN分类。

总的来说,KNN分类模型是最容易理解和解释的模型之一,并且正如你将在本模块后面看到的,它可以相当准确。KNN的主要缺点是随着数据量的增加,其速度会显著变慢。这使其在需要快速预测或内存限制严格的环境中可能不切实际,因为进行预测时必须所有数据都可用。

支持向量机

本视频涵盖的最后一种模型是支持向量机。你可能记得SVM模型也是回归的一个选项。SVM模型因其灵活性而成为分类的热门选择。

在二元分类问题中,假设你想将代表“无”的橙色方块与代表“有”的蓝色圆圈分开。此图上显示的任何一条线都是一个可行的选项,它们都能完美地将橙色方块与蓝色圆圈分开。但是否存在一条最优的线或决策边界?为了最好地捕捉数据的行为,目标是找到一条能最准确地将新观测值分类到两个类别之一的线。

你可能想要一条在两个类别之间均匀间隔并为每个类别提供缓冲区的线。这正是SVM所做的。该算法试图找到一条正好位于两个类别中间的线,最大化两者之间的距离,称为间隔

为了找到最大化间隔的线,SVM算法首先从两个类别中找到离该线最近的点。这些点被称为支持向量。因此,SVM算法试图以这样一种方式找到决策边界,使得两个类别之间的分离尽可能宽。在这个二维情况下,该决策边界对应于一条线。但这个边界通常被称为超平面,它适用于更高维度。

简而言之,支持向量机是一种分类器,它找到一个最优超平面,以最大化两个类别之间的间隔。

在实际例子中,通常不可能找到一个完美分离两个类别的超平面。一个在间隔内但被正确分类的点称为间隔误差。一个在分离边界错误一侧的点是分类误差。总误差是间隔误差和分类误差的总和。

当数据可以被一条直线或超平面分离时,会发生什么?在这些情况下,你可以使用核方法,它将数据投影到一个额外的维度。现在,不是决策线,而是有一个分离点的决策曲面。这个概念可以推广到更高维度。通过核方法,你将数据映射到一个更高维度的空间,在那里数据是线性可分的。用于转换的数学函数称为核函数,并且有不同类型的核函数。线性是最常见的,但其他选项包括多项式、径向基函数,特别是高斯函数。这些函数中的每一个都有其自身的特性和表达式。

核方法是SVM的一个真正优势,因为它使你能够高效地处理非线性数据。然而,必须正确选择核函数,以避免训练速度急剧增加。

总结

本节课中我们一起学习了几种广泛使用的分类模型,它们可以调整以处理任意数量的预测变量。每种模型在准确性和训练速度方面都有其自身的优点和缺点。要知道哪种模型在特定数据集上效果最好,唯一的方法是尝试它们并查看每种模型的性能。

接下来,你将学习如何在MATLAB中使用出租车数据快速训练这些模型。

12:使用分类学习器应用程序 🎼

在本节课中,我们将学习如何使用MATLAB的分类学习器应用程序来创建、比较和评估分类模型。我们将以出租车数据为例,尝试根据行程的上下车位置来预测该行程是否需要支付过路费。

你已经了解了一些常见分类模型的基本原理,现在让我们将这些知识应用到出租车数据上。

商业导航应用提供了大量关于行程的信息,例如距离、预计行驶时间以及途中可能遇到的收费站。我们能否利用出租车数据中的上车和下车位置来预测行程是否需要支付过路费?让我们使用一个二元分类模型来找出答案。

准备工作与数据导入

要开始使用分类学习器应用程序,首先需要在MATLAB中导入并准备数据。

以下是具体步骤:

  1. 加载一月份的出租车数据。
  2. 使用 AddWasTollPaid 函数向数据表中添加一个变量,用于指示每次行程是否支付了过路费。这个变量将作为分类模型的响应变量。

数据预处理完成后,就可以打开分类学习器应用程序了。

启动分类学习器应用程序

在MATLAB工具栏的“应用程序”选项卡中,选择“分类学习器”应用程序。

与回归学习器应用程序类似,通过点击“新建会话”并选择“从工作区”来开始一个新会话。选择 WasTollPaid 作为响应变量。分类响应变量通常是逻辑型或类别型变量,因为它们自然地将数据集划分为不同的类别。

在“预测变量”窗格中,取消选择所有变量,然后选择用于构建预测模型的四个特征:上车地点的纬度和经度,以及下车地点的纬度和经度。

典型的建模工作流程会包含验证环节,但该主题将在后续课程中介绍。因此,目前请选择“无验证”。

点击“开始会话”以完成数据加载。

应用程序界面概览

分类学习器应用程序的界面与回归学习器应用程序非常相似。

顶部的工具栏让你可以轻松选择模型类型、访问模型选项、训练模型和可视化结果。

左侧窗格显示模型历史记录和当前模型的详细信息。

中心窗格显示模型可视化结果,默认视图是数据的散点图。例如,可以显示上车位置,并根据 WasTollPaid 变量进行分组。蓝色圆点表示未支付过路费,橙色圆点表示支付了过路费。

两个应用程序的主要区别在于可用的模型和可视化类型。

选择并训练模型

打开“模型类型”窗格,可以看到可用的分类模型。逻辑回归是创建二元分类模型的一个良好起点,它训练速度快,并能提供一个简单的表达式来对数据进行分类。

现在让我们训练模型。模型只需几秒钟即可完成训练,并且准确率超过95%。

分组散点图现在使用标记来指示模型正确预测支付过路费的位置。圆点代表正确预测,X代表错误预测。具体来说,蓝色X表示实际未支付过路费但模型预测了过路费,橙色X表示实际支付了过路费但模型未预测到。

理解混淆矩阵

上述描述可能有些令人困惑,但混淆矩阵可以清晰地展示情况。

混淆矩阵可视化显示了模型正确预测每个类别的频率,以及当模型错误分类一个数据点时选择了哪个类别。

  • 代表数据集中 WasTollPaid 的实际值。矩阵的顶行显示未支付过路费的行程,底行显示支付了过路费的行程。
  • 代表模型的预测值。第一列包含模型预测不会有过路费的行程,第二列包含模型预测会有过路费的行程。

主对角线上的元素是模型正确预测响应的行程,包括真阴性(实际无过路费,模型预测无过路费)和真阳性(实际有过路费,模型预测有过路费)。

非对角线上的条目显示模型做出错误预测的情况。右上角显示假阳性(模型预测了不存在的过路费),左下角显示假阴性(模型错误地预测了无过路费行程)。

处理类别不平衡问题

在这个模型中,只有大约10%的实际过路费被模型正确预测。这是因为类别大小不平衡。在超过23万次行程中,只有不到1万次支付了过路费。由于只有约4%的行程有过路费,一个总是预测“无过路费”的模型也会有96%的准确率,但这显然没什么用处。

像逻辑回归和支持向量机这样的模型通常难以处理这种类别不平衡的数据集。让我们尝试使用K最近邻模型。

KNN模型提供了几个选项。“精细”、“中等”和“粗糙”模型使用欧几里得距离,而“余弦”、“立方”和“加权”模型使用更复杂的距离度量。

选择“中等KNN”作为起点。该模型可以通过“高级”按钮调整参数。一个中等KNN模型使用10个最近的数据点进行预测,粗糙模型查看100个最近的点,而精细模型则使用最近的一个点进行预测。

让我们训练这个模型。准确率达到99%。但请记住,总是预测“无过路费”的准确率是96%。

散点图上可见的X标记显著减少,这个模型看起来很有希望。但让我们检查一下混淆矩阵。这个模型有更多的真阳性。看起来KNN模型可能是这个预测任务的一个好选择。要确定它有多好,我们需要更多的性能指标,这将在后续课程中详细介绍。

导出模型

现在,让我们通过将模型导出到MATLAB来保存你的工作。与回归学习器应用程序类似,分类学习器应用程序可以选择保存用于训练模型的算法,或者直接将训练好的模型导出到MATLAB工作区。

点击“导出模型”,并从列表中选择“导出模型”。将导出的模型命名为 KNN_Model。现在,该模型已在MATLAB工作区中可用,你可以像访问回归模型一样访问它。

总结

在本节课中,你学习了如何使用分类学习器应用程序来选择、训练和评估一些简单的分类模型。你找到了一个有希望的候选模型,可以根据出租车行程的上下车位置来预测是否需要支付过路费。在接下来的课程中,你将学习更多用于量化分类模型性能的指标。

13:评估分类模型 🎯

在本节课中,我们将学习如何评估分类模型的性能。我们将从构建混淆矩阵开始,并从中推导出四个关键的评估指标:召回率、误报率、精确率和准确率。接着,我们将探讨在评估模型性能时,为何需要考虑这些指标之间的权衡。最后,我们将使用接收者操作特征曲线来系统地评估召回率与误报率之间的权衡关系。

从混淆矩阵开始

上一节我们介绍了常见的分类模型及其训练方法。本节中,我们来看看如何评估这些模型的性能。让我们从一个简单的二分类例子开始。

回忆一下,二分类模型使用一个决策边界来分隔两类数据。在这个例子中,数据点被分为正类和负类。决策边界一侧的数据点被预测为正类,另一侧的被预测为负类。

假设有12个正类数据点,模型正确分类了其中9个,这些被称为真正例。其余3个被错误分类为负类的正类数据点,被称为假反例。同样,有12个负类数据点,其中10个被正确分类为真反例,2个被错误分类为正类的负类数据点,被称为假正例

评估这四种情况的一个常用方法是使用混淆矩阵。在混淆矩阵中,真实值按行分组,预测值按列分组。矩阵的每个象限分别对应真正例、真反例、假正例和假反例的数量。

以下是混淆矩阵中各项的基本关系:

  • 实际正例总数 = 真正例 + 假反例
  • 实际负例总数 = 假正例 + 真反例
  • 预测正例总数 = 真正例 + 假正例
  • 预测负例总数 = 假反例 + 真反例

四个关键评估指标

基于混淆矩阵,我们可以计算四个核心的评估指标。在探讨它们之间的权衡之前,让我们先逐一详细了解每个指标。

以下是四个关键指标的定义:

  1. 召回率:衡量模型正确识别出某个类别的能力。对于正类,其计算公式为:
    召回率 = 真正例 / (真正例 + 假反例)
  2. 误报率:衡量模型对某个类别产生“误报”或“假警报”的频率。对于二分类中的正类,其计算公式为:
    误报率 = 假正例 / (假正例 + 真反例)
  3. 精确率:衡量模型对某个类别的预测有多准确。对于正类,其计算公式为:
    精确率 = 真正例 / (真正例 + 假正例)
  4. 准确率:衡量模型整体分类正确的比例。其计算公式为:
    准确率 = (真正例 + 真反例) / 总样本数

如果分类是完美的,那么准确率、精确率和召回率都将为1,而误报率将为0。然而,在现实中,我们很少能达到这种理想状态,因此需要考虑指标间的权衡。

评估中的权衡考量

回到我们的例子,该模型的准确率为79%,召回率为75%,精确率为82%,误报率为17%。这样的性能在现实应用中是否可以接受?这取决于具体的应用场景。

  • 癌症检测:假阳性可能导致患者暂时焦虑,但假阴性(即漏诊)可能带来致命的后果。在这种情况下,我们可能希望最大化召回率,以确保不遗漏任何阳性病例。但需要注意,通过移动决策边界使召回率达到100%,可能会降低准确率至71%,并使精确率降至63%,误报率升至58%。
  • 信用卡欺诈检测:频繁因误报而锁定客户卡片会带来巨大困扰。因此,我们需要最小化误报率。然而,将误报率降至0%可能会使准确率降至71%,同时召回率大幅下降至42%,这意味着模型会放过58%的潜在欺诈活动。
  • 垃圾邮件过滤:让几封垃圾邮件进入收件箱问题不大,但让用户错过来自亲友或同事的重要邮件则严重得多。此时,我们需要关注精确率,以最小化被模型误判为垃圾邮件的正常邮件数量。

在现实场景中,决策边界很少能完美分隔正负类。因此,我们需要根据应用目标,在各项指标之间进行权衡,以构建一个可接受的模型。

注意类别不平衡

基于目前所学,你可能会认为追求高准确率就能在所有指标间取得良好平衡。有时确实如此,但再次提醒,必须谨慎。

如果你的数据存在类别不平衡,例如负类样本占绝大多数,那么一个将所有或几乎所有数据点都预测为负类的模型,仍然会具有很高的准确率,甚至精确率也很高,误报率很低。然而,其召回率会非常差。反之亦然。

因此,在评估模型时,同时查看多个指标(例如召回率和误报率)通常是一个好主意。

使用ROC曲线进行系统评估

一种同时使用召回率和误报率来评估模型的有效方法是构建ROC曲线并计算曲线下面积

ROC代表“接收者操作特征”,这个术语源于雷达工程领域。ROC曲线描绘了当决策阈值从0变化到1时,模型的召回率与误报率之间的关系。

AUC值范围在0到1之间,值越接近1,表示模型性能越好,意味着模型能够在保持低误报率的同时实现高召回率。AUC值为0.5时,模型相当于随机猜测;低于0.5,则意味着模型预测错误的能力比正确预测的能力还强。

ROC曲线通过可视化召回率与误报率的关系,有助于你确定决策边界的最佳设置位置。

总结

本节课中,我们一起学习了如何构建混淆矩阵,并从中推导出评估分类模型的关键指标。我们看到了评估分类模型需要考虑指标间的权衡,并学习了如何使用接收者操作特征曲线来系统地评估召回率与误报率之间的权衡关系。

接下来,你将在MATLAB中实践这里所学到的内容。

14:在MATLAB中评估分类模型

概述

在本节课中,我们将学习如何在MATLAB的分类学习器应用中评估分类模型。我们将应用多种评估指标,解读混淆矩阵,并利用ROC曲线分析模型性能。最后,我们将了解如何导出模型或训练代码,以便进行更深入的分析和定制。

评估分类学习器中的模型

上一节我们介绍了分类模型的评估指标,包括准确率、精确率、召回率和误报率。本节中,我们来看看如何将这些方法应用到在分类学习器应用中训练的模型上。

我们将使用一个逻辑回归模型和一个中等KNN模型作为示例。这些模型根据上车和下车位置来预测是否需要支付通行费。模型在一月份的出租车数据上训练,未使用验证集。

从散点图的可视化结果中,可以大致了解模型正确和错误分类观测值的情况。

每个模型的准确率显示在此处。仅从准确率来看,两个模型似乎都表现良好。然而,我们之前也学到,评估分类模型时,应始终考虑多个指标。

解读混淆矩阵

让我们查看混淆矩阵,以了解如何在应用中评估其他指标。

混淆矩阵以绝对值形式显示正确和错误分类的数据。由于“通行费已付”是一个逻辑变量,两个类别结果被命名为“true”和“false”。请注意不要将这些类别名称与指标名称中的“真”和“假”混淆。记住,“false”表示无通行费,“true”表示有通行费。任何一个结果都可以被视为正类或负类。

例如,如果将“false”(无通行费)类视为正类,则左上角为真正例,右下角为真负例,右上角为假负例,左下角为假正例。然而,如果将“true”(有通行费)类视为正类,则真正例和真负例会交换位置,假正例和假负例也是如此。这完全取决于您将哪个类别视为正类。

您可以从混淆矩阵本身计算所有学过的指标,也可以让应用为您计算。

在“绘图”下选择“真正例率,假负例率”选项。

矩阵条目将变为百分比,并出现两个新列。这些新列报告了真正例率和假负例率,其中将每一行的实际类别视为正类。请注意,这些百分比与您现在在混淆矩阵中看到的百分比相同。这仅适用于二分类问题。稍后,当您训练多类模型时,这些百分比会有所不同。

对于二分类,一个类别的真正例率就是另一个类别的真负例率。同样,一个类别的假负例率就是另一个类别的假正例率。利用这些事实,您可以获得每个类别的所有这四个指标。例如,如果您想获得此处“false”类别的真正例率(召回率)和假正例率(误报率),它们分别由“false”类所在行的真正例率和“true”类所在行的假负例率给出。

如果您需要知道精确率而不是召回率,请选择“正预测值,错误发现率”选项。

现在,您关注的是列(即总预测数)的百分比,而不是混淆矩阵的行。正预测值给出了给定类别的精确率。正如您可能想到的,您也可以以类似的方式获得每个类别的错误发现率、负预测值和错误遗漏率,就像您刚才看到的行归一化指标一样。

模型性能比较

现在您已经能够解读混淆矩阵,让我们来评估模型。

逻辑回归模型对于“false”(无通行费)类别的召回率高达99%,但该类别的误报率非常糟糕,为90%。换句话说,需要支付通行费的行程有十分之九会被错误分类。

让我们将这些结果与中等KNN模型进行比较。

该模型对于“false”类别的召回率超过99%,并且误报率要好得多,仅为14%。

使用ROC曲线优化模型

这是每个模型能达到的最佳性能吗?请记住,ROC曲线用于显示召回率和误报率之间的关系。

让我们看看逻辑回归模型的ROC曲线。由红色标记表示的当前分类器使用了默认阈值0.5。曲线下面积为0.93,这表明如果使用不同于默认值的阈值,该模型能够实现更好的召回率-误报率权衡。看起来,通过使用更高的阈值,您可以将误报率降低到KNN模型所具有的14%,同时保持召回率在95%以上。

要自定义阈值并查看更新后的混淆矩阵,可以将模型导出到MATLAB工作区,或者生成代码以训练具有自定义设置的新模型。您将在后续的阅读材料中学习如何在代码中评估和自定义模型。

总结

本节课中,我们一起学习了如何评估分类模型,并将ROC和AUC分析应用于在分类学习器应用中训练的模型。然后,我们了解了如何导出模型或训练代码本身,以便进行进一步的分析和定制。

15:训练多类模型

在本节课中,我们将学习如何训练一个多类分类模型。之前我们使用二分类模型预测出租车行程是否会产生通行费。但如果想进一步知道通行费具体来源于哪个收费站,二分类模型就不再适用,因为结果类别超过了两个。本节将介绍如何训练能够从两个以上类别中预测结果的多类模型,并学习如何使用混淆矩阵来比较不同模型的性能。

数据准备与问题定义

上一节我们介绍了二分类模型,本节中我们来看看如何将问题扩展到多类别预测。

首先,观察一张纽约市地图,其中高亮显示了不同的通行费来源。根据通行费金额,可以将各个桥梁和隧道分为五类。例如,标记为“MTA”的紫色过境点在2015年收费均为5.54美元。这些缩写或指桥梁名称(如“HH”指亨利哈德逊桥),或指收取通行费的交通管理局(如“MTA”指大都会运输署)。数据集中还有一些通行费与官方报告的任何价格都不匹配,这些通行费被归入第六类,名为“其他”。

以下是开始建模的步骤:

  1. 打开一个新的实时脚本,加载一个月的出租车数据。
  2. 使用提供的函数 addTollSource 来添加一个包含六个通行费来源的新分类变量。
  3. 使用另一个自定义函数移除未收取通行费的行程,因为这些数据点不再需要。

使用分类学习器应用程序

接下来,我们从工具条打开“分类学习器”应用程序,并开始一个新的会话。

在应用程序中,请确保在下拉列表中选择了出租车数据,并选择变量 TollSource 作为响应变量。像之前进行二分类时一样,选择上车和下车坐标变量作为预测变量。在开始会话前,选择“无验证”。

观察散点图中上车位置的分布,可以大致看出曼哈顿岛的轮廓。大多数产生通行费的行程始于曼哈顿或附近机场。然而,仅从上车位置很难区分不同的通行费来源。

尝试选择下车位置进行观察。现在,可以看到相同颜色的点形成了不同的簇。大部分点是紫色的,属于MTA类。也可以看到其他颜色(如VN或HH类)的较小点群。这些类别在视觉上的清晰分离表明,下车位置将有助于预测通行费来源。

训练多类模型:K最近邻算法

那么,如何训练一个模型来预测多个类别呢?有些算法可以轻松地从二分类扩展到多类模型,例如K最近邻算法。

K最近邻分类器的工作原理是识别每个数据点的最近邻居,然后将其分配到这些邻居中最常见的类别。邻居集合中代表多少个类别并不重要。

以下是K最近邻算法的核心概念:

对于一个新数据点,找出训练集中与其距离最近的K个邻居。
统计这K个邻居中各个类别的数量。
将该数据点分配给数量最多的那个类别。

要亲自尝试,请在应用程序中选择一个“粗略KNN”模型并点击“训练”。这个KNN模型表现如何?报告的准确率超过98%。这是否意味着模型性能很好?

查看散点图会发现,许多行程被错误地标记为MTA类。事实上,看起来有些类别根本没有出现。这一点在混淆矩阵中可以看得更清楚。

多类模型的混淆矩阵与二分类情况类似,X轴是预测类别,Y轴是真实类别。但现在,每个类别都对应一行和一列,因此这个矩阵的大小是6x6。注意,几乎所有数据点都被预测为MTA类,但由于这个类别最常见,整体准确率仍然很高。有三个列是空的,意味着那些类别的预测点数为零。

这种不佳的性能反映在每个类别的召回率(或真阳性率)上。HH和MTA类的召回率超过90%,但其他类别的召回率低于10%,甚至未定义。

为什么会发生这种情况?粗略KNN模型使用的K值为100,这意味着每个数据点都被分配给它100个最近邻居中最常见的类别。

然而,有几个类别的数据点甚至不足50个,这意味着它们总是会被分配给更常见的MTA类。你可以尝试自定义这个模型。什么样的K值能改善这些类别的召回率?

训练多类模型:支持向量机

让我们转向另一种类型的模型:支持向量机。

回忆一下,单个SVM模型会找到两个类别之间的决策边界,因此它不能轻易扩展到多个类别。相反,可以采用多个二分类器来实现相同目标。这种称为“一对多”分类的策略为每个类别使用一个单独的模型。

在训练之前,每个模型中的数据点被标记为属于或不属于某个特定类别。然后使用SVM或逻辑回归等二分类技术训练这些模型。当需要预测新数据点的类别时,会为每个模型计算一个分数。该分数代表新数据点与孤立类别的匹配程度。数据点被分配给其模型得分最高的类别。

所有这些在MATLAB中都是自动处理的,因此训练SVM的过程对于二分类或多类模型是相同的。

以下是“一对多”策略的核心步骤:

对于N个类别,训练N个独立的二分类器。
第i个分类器学习区分“类别i”和“所有其他类别”。
预测时,用所有N个分类器对新样本进行评分。
将新样本分配给给出最高“属于该类”置信度的分类器所对应的类别。

让我们在应用程序中训练一个多类SVM。首先从下拉列表中选择一个“线性SVM”模型。在高级选项中,默认的多类方法是“一对一”。这是“一对多”策略的一个稍高级的版本,但它使用了相同的训练多个模型的方法。保持此选项被选中并训练模型。

SVM模型的整体准确率高于KNN模型,但它是否在预测较小类别方面表现更好?从散点图来看似乎是这样,因为更多的类别可见。换句话说,SVM模型没有将所有来自较小类别的点都分配给MTA类。

混淆矩阵也显示了更好的召回率(除了“其他”类)。尽管如此,这些结果表明,线性SVM模型在预测已知通行费来源方面比粗略KNN模型做得更好。

那么,为什么“其他”类的性能不佳呢?回到散点图,取消选择除“其他”之外的所有类别。下车位置相当分散,这意味着这个类别与其他类别有显著的重叠。

因此,除了上车和下车位置之外,还需要额外的特征来准确预测这个类别。另一方面,这些通行费可能本应属于某个已知来源,但它们的金额记录有误。值得进一步调查,看看这些数据点是否应被视为缺失值。

总结

本节课中我们一起学习了在MATLAB中训练和评估多类分类模型。总结要点如下:

  1. 模型构建方法:多类模型可以通过将二分类模型扩展到更多类别,或通过组合多个二分类模型来训练。
  2. 工具使用:分类学习器应用程序可以执行这两项任务,因此多类模型和二进制模型的工作流程大体相同。
  3. 模型评估:整体准确率指标很少能说明全部情况。在评估模型时,务必查看每个类别的性能指标。

16:分类总结 🎯

在本节课中,我们将对分类模块的核心内容进行总结。我们将回顾分类问题的定义、模型训练与评估方法,以及如何将二分类模型扩展到多分类问题。

当响应变量具有一组离散的可能结果时,需要使用分类模型。

例如,预测患者是否有患病风险,或者预测机器是否需要维护。

在本次课程中,我们使用出租车数据来预测行程是否包含通行费。

y = predict(model, X) 其中 y 为离散类别标签。


上一节我们介绍了分类问题的应用场景,本节中我们来看看如何训练模型。

使用分类学习器应用程序,您可以训练多种不同类型的模型。

以下是几种常见的分类模型类型:

  • 决策树
  • 支持向量机
  • K近邻
  • 集成方法


模型训练完成后,评估其性能至关重要。混淆矩阵和ROC曲线是帮助您评估模型的工具,使您能够快速迭代并找到最适合您应用的方法。

混淆矩阵展示了模型预测结果与实际类别的对比情况。

ROC曲线则通过可视化召回率与误报率之间的权衡,帮助您评估模型性能。


分类模型的性能评估不仅仅关乎预测准确率。通常,正确预测某一特定类别比其他类别更为重要。

您学习了多个分类评估指标来帮助评估模型。

以下是几个关键指标:

  • 准确率:正确预测的样本比例。
  • 召回率:实际为正例的样本中被正确预测的比例。公式:Recall = TP / (TP + FN)
  • 精确率:预测为正例的样本中实际为正例的比例。公式:Precision = TP / (TP + FP)
  • F1分数:精确率和召回率的调和平均数。

例如,使用ROC曲线可视化召回率和误报率,有助于识别这两个指标之间的权衡关系。

您可以根据需求调整模型或尝试新的方法。


最后,我们通过训练和评估多类别模型来结束本模块。您学习了如何利用“一对一”和“一对多”方法将二分类器扩展到多分类问题。

  • 一对一:为每两个类别训练一个分类器。
  • 一对多:为每个类别训练一个将其与其他所有类别区分的分类器。

您还学习了如何解读多类别混淆矩阵来评估结果。


本节课中我们一起学习了分类问题的完整流程:从定义问题、使用分类学习器训练模型,到利用混淆矩阵和ROC曲线等工具评估模型性能,最后扩展到多分类问题的解决方法。

现在,请花些时间练习您所学到的知识。如果您自己的数据包含离散响应变量,可以尝试训练一些分类模型。

使用对您有实际意义的数据集是很好的练习方式。

您也可以继续在出租车数据上进行练习。尝试使用夏季月份的数据,看看结果是否有所不同。

当您准备好后,请完成本模块的测验。

祝您好运。

17:解决欠拟合和过拟合

在本节课中,我们将要学习机器学习中的两个核心问题:欠拟合与过拟合。我们将探讨它们产生的原因,并学习如何使用训练集、验证集和测试集来找到模型复杂度的最佳平衡点,从而构建泛化能力强的模型。

什么是过拟合与欠拟合?

上一节我们介绍了在应用中选择“无验证”选项的警告。本节中,我们来看看为什么验证数据对于避免过拟合至关重要。

考虑以下数据以及拟合到这些数据的一个简单线性模型。我们知道,简单线性模型易于解释、训练和预测速度快。然而,它们有一个缺点:线性模型无法捕捉复杂的模式和趋势,这可能导致较大的误差。这种效应被称为欠拟合,该模型被称为具有高偏差

如何避免欠拟合?如果模型对数据来说过于简单,你可以使用更复杂的模型,或者设计具有更强预测能力的新特征。例如,如果一阶线性模型对这个数据集来说太简单,你可以选择更高阶的多项式,如下所示:

% 示例:从一阶线性模型转为二阶多项式模型
% 欠拟合模型:y = β0 + β1*x
% 更复杂模型:y = β0 + β1*x + β2*x^2

此时,你已经知道更复杂的模型可能更难以解释,并且需要更多时间来训练和预测。但它们还可能带来另一个问题。观察结果,你会发现模型对训练数据的拟合非常好,但可能“太好”了。这意味着它捕捉到了数据中的噪声,即捕捉到了不真实且未来不会以相同方式重现的模式。一旦将此模型应用于新数据,就可能导致更大的误差。这种效应被称为过拟合,该模型被称为具有高方差

模型误差与复杂度的关系

在介绍如何避免过拟合之前,我们先来看看模型误差与模型复杂度之间的关系。

选择一个简单模型,并开始增加模型的复杂度以避免欠拟合并获得更小的误差。你可以一直这样做,直到训练数据的误差变得非常小。现在,当你观察额外的数据时,与训练数据相比,模型误差几乎总是会高一些。但请注意,随着复杂度的增加,存在一个误差开始增大的点。选择在训练数据上误差最低的模型,将导致在额外数据上产生相对较高的误差。因此,这个模型可能不是最佳选择。

请注意,模型复杂度存在一个最佳点,在该点上,模型能很好地捕捉训练数据中的趋势,同时又足够灵活,能在训练集之外的数据上做出良好预测。这个模型在预测训练数据时会显示出较大的误差,但它更有可能很好地泛化。位于这条最佳线右侧的模型会过拟合数据,而左侧的模型则会欠拟合

如何找到最佳模型配置?

那么,如何找到模型的最佳配置并避免过拟合呢?你刚刚了解到可以考虑降低模型复杂度。你也看到,为了对模型复杂度做出最佳决策,你需要不止一个数据集来验证你的模型。

以下是避免过拟合的几种主要方法:

  • 降低模型复杂度:选择更简单的模型。
  • 使用验证数据:通过额外数据评估模型在训练过程中的表现。
  • 减少特征数量:移除不相关或冗余的特征。
  • 正则化模型:在模型训练过程中引入惩罚项,限制参数大小。

本视频重点介绍使用额外数据(即验证数据)的方法。另外两种方法将在后续课程中介绍。

训练集、验证集与测试集

你已经看到在应用和监督学习工作流程中对此有所提示。仔细观察工作流程,你会注意到另一个称为测试集的数据集。这是在训练和验证最终模型后,用于评估最终结果的额外数据。

因此,总体而言,你需要三个不同的数据集:

  • 训练集:通常是最大的数据集,用于构建模型。
  • 验证集:用于指导模型选择、参数优化以及任何迭代的预处理步骤。
  • 测试集:用于最终评估模型在从未见过的数据上的表现。

因为验证数据被用作此过程的一部分,它不能代表未见的未来数据。你需要测试数据来最终评估你的模型在从未见过的数据上的表现。在对测试数据应用相同的预处理步骤后,你将看到模型预测新数据的效果如何。

数据分割方法

让我们从第一次分割开始,将初始数据集分为训练与验证数据以及测试数据。

假设这些点代表你的数据。一个典型的分割可能如下所示:保留80%的数据用于训练和验证,但留出20%作为你的测试数据。这种方法称为留出法。你可能也听说过测试数据被称为留出测试集。你不必选择80/20分割,其他百分比也可能适用,具体取决于数据集的大小。将测试集放在一边,它仅用于评估你的最终模型。

现在,取剩余的组合训练和验证数据,并对其进行预处理。然后将其分割成训练数据和验证数据。

有以下几种常见的数据分割方法:

  • 留出法:你已经从测试数据分割中了解了这种方法,它的工作方式与之前相同。例如,保留80%作为训练数据来构建模型,20%的数据进入验证数据集。然后你在训练集上训练模型,并用验证集评估其性能。
  • K折交叉验证:你将数据平均分配到几个子集,即所谓的“折”。以三折为例。对于第一折,选择一个子集进行验证,而另外两个用于训练。计算性能后,下一个折使用不同的子集作为验证数据,训练集也相应改变。重复此过程,直到所有子集都曾被用作验证数据一次。最后,计算所有折的平均性能。

如何选择验证方法?

那么,你应该使用哪种验证方法?我们来比较一下两者。

留出验证涉及在单个验证集上测试你的模型,而K折交叉验证将验证过程重复K次并平均性能。这会导致更长的训练时间,但可以得到更准确的结果,特别是对于较小的数据集。如果你有大量的观测数据,那么留出法可以准确地捕捉数据中的所有趋势,并且速度也会快得多。

一旦决定了验证方法,你就使用验证数据来选择最佳模型、选择特征和调整参数。当你对模型满意时,然后使用训练数据和验证数据一起训练最终模型。应用程序会自动为你执行此步骤。

最后,使用一开始留出的测试数据来评估最终模型的泛化误差。

总结

本节课中我们一起学习了机器学习模型开发中的关键概念。

简单模型通常更易于解释、训练速度更快,预测速度也更快,并且需要更少的计算资源。但简单模型可能无法捕捉数据中更复杂的模式和趋势,这种失败被称为欠拟合

更复杂的模型,如高阶多项式、树或具有非线性核的SVM模型,可以捕捉这些趋势,但可能无法很好地泛化到新数据,这种失败被称为过拟合

通过使用验证数据来指导你的建模过程,你可以找到合适的模型复杂度水平,以尽可能好地预测新数据。

18:训练时使用验证数据

在本节课中,我们将学习如何在训练机器学习模型时使用验证数据,以防止模型过拟合,并选择泛化能力更强的模型。

上一节我们了解到,更复杂的模型虽然能以更低的误差捕捉数据中的模式和趋势,但也可能对训练集产生过拟合,导致在泛化到新数据时产生更大的误差。

数据分割的重要性

为了准确评估模型,将数据划分为不同的子集至关重要。

以下是关键的数据分割步骤:

  • 将一部分数据留作最终测试。
  • 使用验证数据来防止选择过拟合的模型。

现在,让我们以预测出租车行程时长为例,看看如何在MATLAB中实现这一点。

准备数据与划分数据集

首先,导入五月份的出租车原始数据。此时无需进行预处理,因为仍需划分测试集。

% 为可重复性设置随机数生成器种子
rng('default');

% 使用 cvpartition 函数划分数据
c = cvpartition(height(data), 'Holdout', 0.2);

% 获取测试集索引并提取数据
testIdx = test(c);
testData = data(testIdx, :);

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/mathworks-prac-ds-matlab/img/1246604ca4b9c9491c0fe8be29d1e89e_11.png)

% 获取训练集索引并提取数据
trainIdx = training(c);
trainData = data(trainIdx, :);

接下来,在训练任何模型之前,对训练数据应用基本的预处理函数,例如添加“一天中的时间”和“星期几”特征。

不使用验证数据的模型训练

现在,让我们打开回归学习器应用程序并开始一个新会话。选择训练数据作为数据集变量,duration作为响应变量,并选择相关特征作为预测变量。为了后续对比,我们首先选择“无验证”。

使用“所有树”选项进行训练,会生成粗、中、细三种决策树模型。检查结果发现,细树的RMSE(均方根误差)最佳。然而,这些指标是使用训练模型所用的同一批数据计算得出的,这意味着我们可能正在过拟合。

使用验证数据的模型训练

为了进行比较,让我们看看使用验证数据时的结果。为此,请启动一个新会话。数据集、响应和预测变量保持不变,但这次选择使用验证。虽然可以使用交叉验证,但由于数据超过20万行,保留验证法已足够且速度更快。我们尝试使用20%的数据作为验证集。

训练与之前相同的树模型。然而这一次,指标将使用那20%的保留验证数据进行计算。现在,粗树拥有最佳的RMSE。正如所怀疑的,细树对训练数据存在过拟合,而粗树的泛化能力更好。

总结

本节课中,我们一起学习了如何在回归学习器应用程序中使用验证数据来更好地评估模型性能,并防止选择过拟合的模型。下一节,我们将学习更多的方法和训练选项,以创建性能更优的模型。

19:用于特征选择的内嵌方法 🎯

在本节课中,我们将要学习如何处理高维数据,并重点介绍一种称为“内嵌方法”的特征选择技术。当数据集中特征数量与观测样本数量相当甚至更多时,模型容易变得复杂并导致过拟合。通过内嵌方法,我们可以在模型训练过程中自动识别并强调最有用的特征。

到目前为止,你已经在拥有数千个观测样本和少于10个特征的数据集上训练过模型。然而,你处理的数据集并不总是观测样本数量远多于特征数量。

例如,医疗数据集可能记录了少量患者的许多信息片段。

当特征数量与观测样本数量相当甚至更多时,该数据集被称为高维或宽数据集。

使用高维数据进行训练可能导致模型复杂并过拟合数据。在极端情况下,你可以创建一个能精确预测训练数据的模型,但代价是对新数据的泛化能力很差。那么,你能做什么呢?

你处理高维数据的主要工具是特征选择和降维。这些概念在本专项课程的前面部分已经介绍过。

记住,特征选择方法有三种类型。

以下是三种主要方法:

  • 过滤式方法:在训练模型之前应用,利用特征的统计特性来移除那些预测能力低的特征。
  • 封装式方法:使用不同的特征组合训练多个模型,然后选择能产生最佳模型性能的特征组合。
  • 内嵌式方法:将特征选择作为模型训练过程的一部分。

内嵌式方法的结果是一个仅强调最有用的特征的模型。在本视频中,你将学习如何使用内嵌方法来确定在预测患者卵巢癌的模型中应包含哪些特征。

让我们从加载数据开始。这个数据集有4000个特征,这些特征是通过分析216名患者的血液样本识别出来的。

目前,工作区中有两个变量。预测变量矩阵包含每位患者的4000个特征,响应变量包含“癌症”或“正常”的标签,以指示哪些患者患有癌症。目标是训练一个二元分类器来预测这些标签。

首先,使用 cvpartition 将数据拆分为训练集和测试集。虽然在本课中不会完成最终评估,但始终预留一些数据用于测试训练好的模型是一个最佳实践。

打开分类学习器应用程序。从工作区中选择包含训练数据的预测变量矩阵。记住,这个矩阵有4000列,因此加载可能需要一些时间。然后从工作区中选择包含训练数据的响应变量。

要查看模型是否过拟合,你需要比较使用验证和不使用验证时的性能。

现在,选择“无验证”并开始会话。选择“中型树”作为模型。然后开始训练。该模型将最多使用20次分割。报告的准确率为100%。但请记住,这是在无验证的情况下进行的,意味着模型是使用其训练所用的相同数据进行评估的。

现在,让我们将结果与使用验证的情况进行比较。

重新开始会话。并选择与之前相同的数据。这次,选择20折交叉验证。交叉验证对这个数据集有帮助,因为观测样本非常少。选择折数没有硬性规定,但对于小型数据集,使用10折或更多有助于确保每一折都能代表整体数据。

数据加载完成后,训练另一个中型树模型。

注意,现在的准确率是83%,而无验证时的值是100%。

模型的性能在使用验证数据时几乎总是会下降,但17%的下降表明中型树模型对数据过拟合了。

让我们尝试通过移除最弱的预测变量来改进模型。决策树包含一种内嵌的特征选择方法,可以量化每个预测变量的相对重要性。你可以通过将训练好的模型导出到工作区来访问此信息。

在实时脚本中,使用 predictorImportance 函数返回一个重要性值向量。如果一个预测变量有助于模型,它就被认为是重要的。因此,如果一个预测变量在多个决策规则中被使用,其重要性就会很高。

可视化重要性的一种简单方法是使用 pareto 函数。帕累托图将对数据进行排序,并以条形图显示最重要的预测变量。

左侧的Y轴显示每个条形的重要性值。X轴上的标签是特征索引。条形上方是重要性值累积和的折线图。右侧的Y轴显示百分比。因此,你可以看到这五个特征几乎达到了预测变量重要性总和的97%。pareto 函数只会绘制达到95%所需数量的特征。因此,这个图表告诉你,4000个特征中的五个代表了超过95%的预测变量重要性。

让我们创建一个仅包含这五个特征的新预测变量矩阵。记住,你可以使用索引向量来提取特定的列。

接下来,返回分类学习器应用程序并开始一个新会话。

选择新的预测变量矩阵。并将交叉验证设置为与之前相同的20折。

选择一个中型树模型。然后开始训练。报告的准确率现在是95%,意味着在使用更少特征时,准确率实际上提高了。这证实了原始模型确实过拟合了,因为即使数据量只是原始的一小部分,性能却更好了。

对于不同的模型或数据集,性能可能不会提高。你会发现,在移除特征时,性能通常会保持不变,甚至略有下降。

但这不一定是坏事。即使准确率从83%下降到,比如说80%,它仍然可能是一个更好的选择,因为数据集要小得多。

使用较小的数据集有多个好处,例如更低的内存需求、更快的训练时间和更好的可解释性。

就是这样。你现在可以使用内嵌特征选择方法来改进使用高维数据的模型。这个方法特定于决策树,但还有其他针对不同类型模型的内嵌方法。

以及封装式方法。别忘了你之前学过的过滤式方法和降维技术。没有一种方法能在所有情况下都有效。因此,在处理新数据集时,尝试不同的方法。这样,你将能够仅使用你需要的特征获得最佳性能。

20:使用正则化防止过拟合 🎯

在本节课中,我们将要学习一种防止机器学习模型过拟合的重要技术——正则化。我们将了解其工作原理,并学习如何在MATLAB中训练一个正则化模型。

概述

当使用大量特征训练模型时,模型很容易对数据产生过拟合。正则化是一种帮助防止过拟合的技术。

正则化的基本思想

上一节我们介绍了过拟合的问题,本节中我们来看看正则化如何解决它。

让我们从一个简单的数据集和多项式模型开始考虑。这个模型从一个单一特征X开始。你可以将添加多项式项视为向模型添加额外的特征。当一个高阶多项式拟合数据时,其系数(此处用beta表示)会变得非常大。这些大值对于捕捉数据中的噪声波动是必要的。

防止过拟合的一种方法是降低多项式的阶数。这类似于在高维数据集上使用特征选择方法。使用更少的系数后,模型不再过拟合。同时,beta值也会变小,因为多项式不再被拉伸以适应数据中的每一个波动。

但如果你想保留所有多项式项呢?为了防止过拟合,你可以限制系数变得过大。这样,多项式的阶数仍然很高,但结果看起来像一个低阶多项式,因为没有哪个项在拟合中占主导地位。这种通过约束模型参数来防止过拟合的思想,就叫做正则化。

正则化的类型

对于不同类型的模型,存在不同的正则化方法。

以下是几种常见的正则化类型:

  • 例如,你可以通过剪枝和减少树深度来正则化决策树。当你将细树改为粗树时,你已经这样做了。
  • 在本视频中,你将看到一种用于线性和逻辑回归的正则化类型。你将用它来改进卵巢癌数据集的逻辑回归模型。

线性模型的正则化原理

为了解释这种正则化类型,请记住大多数回归模型是通过最小化均方误差(MSE)来训练的。正则化模型则是通过最小化MSE项加上一个根据模型参数计算的额外惩罚项来训练的。惩罚项可以防止beta值变得过大。

MSE项和惩罚项在训练过程中相互制衡。如果模型过拟合,MSE会很小,但惩罚项会很大。如果模型欠拟合,MSE会很大,但惩罚项会很小。最终的结果是一个平衡了两者的拟合。

惩罚项的计算方法

那么惩罚项是如何计算的呢?

有两种常见的方法。岭回归使用beta系数的平方,而套索回归使用绝对值。这看起来可能是一个微小的差异,但它会对训练出的模型产生显著影响。

例如,以下是之前展示的正则化多项式模型的beta值。这些系数是使用岭回归拟合的。

现在,与使用套索回归拟合的beta值进行比较。beta的尺度相似,但许多值为0。

这是因为套索回归在训练过程中倾向于将小的beta值驱动为零。因此,套索回归也是一种嵌入式特征选择,因为将beta值设置为0本质上就是从模型中移除了该特征。

在MATLAB中训练正则化模型

现在让我们在MATLAB中训练一个正则化模型。

首先,加载卵巢癌数据集。请记住,这些数据是高维的,它有4000个特征。

将数据拆分为训练集和测试集,以便稍后评估你的最终模型。接下来,对数据进行归一化,使所有特征具有相似的尺度。这对于惩罚项在岭回归和套索回归中正常工作至关重要。保存用于归一化训练数据的数值,以便对测试数据应用相同的归一化。

用于训练岭回归和套索模型的两个函数是 fitrlinear(用于回归)和 fitclinear(用于分类)。由于这是一个分类问题,我们使用 fitclinear

以下是使用 fitclinear 函数的基本步骤:

  1. 将预测变量矩阵和响应向量作为前两个输入添加到函数中。
  2. 然后将 Learner 选项设置为 ‘logistic’ 以指定逻辑回归。
  3. 由于岭正则化会保留所有特征,我们将其作为起点。将 Regularization 选项设置为 ‘ridge’。但之后你可以自由尝试套索以比较结果。
  4. 最后,将 KFold 选项设置为20以使用20折交叉验证。

让我们看看模型的表现如何。由于这个模型进行了K折验证,使用 kfoldPredict 函数来获取预测类别。你唯一需要的参数是训练好的模型。然后使用 confusionmat 函数获取性能指标。

准确率非常好,几乎达到95%。并且由于该模型使用了验证数据,你可以合理地相信它在新数据上也会表现良好,尽管它使用了全部4000个特征。

调整正则化强度

你现在已经成功地训练了一个正则化模型,但在使用测试数据进行评估之前,还有最后一件事需要考虑。

如果你再次查看惩罚项,请注意它们都有一个变量lambda。这是一个控制正则化强度的超参数。更高的lambda值意味着更强的惩罚项。

MATLAB使用 1/n 作为lambda的默认值,其中n是观测值的数量。这个默认值在卵巢癌数据上表现良好,但情况可能并非总是如此。

你可以通过超参数优化来调整Lambda的值,这将在以后学习。

总结

本节课中我们一起学习了正则化技术。

正则化通过限制模型参数来帮助防止过拟合。两种常见的正则化类型是岭回归和套索回归。当你想减少特征数量时使用套索回归;否则,当你希望所有特征都起作用时使用岭回归。函数 fitclinearfitrlinear 分别具有用于分类和回归的正则化选项。最后,别忘了调整超参数lambda以调节正则化强度。

21:集成模型介绍 🎼

在本节课中,我们将要学习机器学习中的集成模型。集成模型通过结合多个模型的预测结果,旨在获得比单一模型更可靠、更准确的预测。我们将重点介绍两种基于决策树的常见集成方法:提升树和袋装树。

在探索不同的机器学习模型时,你可能会注意到其中几个模型产生的分类准确率大致相同。

然而,这些模型各自的预测结果可能仍然存在差异。

在这种情况下,你可能需要考虑多个模型的结果,而不是仅从最准确的那个模型得出结论。综合多个模型中最常见或平均的预测,通常比单一模型的单个预测更可靠。这就是机器学习集成模型背后的原理。

集成模型的类型

集成模型有多种类型。本节视频将重点介绍两种最常见的方法:提升树和袋装树,它们都是决策树的扩展。

提升树集成

上一节我们介绍了集成模型的基本概念,本节中我们来看看提升树是如何工作的。

提升树集成针对回归和分类问题使用特定的算法。为了说明概念,我们仅关注回归问题。在这个例子中,目标是预测出租车行程的时长。

训练一个常规决策树后,每个观测到的时长都会有一个对应的预测值和模型残差。提升树集成的方法是使用这些残差作为响应变量,来训练一个额外的回归树。这会产生一组新的预测值,以及新的残差。然后,这个过程可以重复多次,用新的残差训练更多的树。

一个训练好的提升树集成的最终结果是一系列的决策树。第一棵树做出初始预测,然后由后续的每棵树进行精炼。

将结果相加,可以得到一个比初始预测更准确的最终预测。其核心思想可以概括为:

最终预测 = 树1预测 + 树2预测 + ... + 树N预测

袋装决策树

了解了提升树后,我们再来看看另一种集成算法:袋装决策树。

对于这种模型,多个决策树同时在相同的数据上进行训练。

因为拥有多个完全相同的模型是冗余的,所以每个模型被赋予可用数据的一个随机子集,这确保了它们都是独特的。

然后将结果平均在一起,形成最终预测。袋装树的一个扩展是随机森林算法。

随机森林

还记得决策树是通过一系列关于预测变量的问题来分割训练数据的吗?袋装集成中的所有树都遵循这种模式。然而,由于每棵单独的树都在对相似的数据子集进行建模,它们的结构很可能高度相关。

随机森林集成通过在每次分割时使用可用特征的一个随机子集来避免这个问题,确保每棵单独的树都是独特的。

个别树可能损失的准确性,在将它们全部平均时可以得到恢复。

其结果是,集成模型可能比简单的袋装树对过拟合具有更强的鲁棒性。以下是其关键步骤的简化描述:

  1. 从数据中随机抽取样本(有放回)。
  2. 为每个样本构建一棵决策树,但在每个节点分割时,只考虑特征的一个随机子集。
  3. 将所有树的预测结果进行平均(回归)或投票(分类)。

总结与注意事项

本节课中我们一起学习了回归和分类问题的各种集成方法。

除了Matlab提供的集成方法,你还可以通过将几个模型平均在一起来创建自己的自定义集成。

集成模型可以提供比其单一模型版本更高的准确性,但请注意,这种改进通常需要付出代价。

以下是需要考虑的代价:

  • 训练时间
  • 内存利用率
  • 预测速度

总而言之,集成模型是提高预测性能的强大工具,但在使用时需要权衡其带来的计算成本。

22:训练集成模型 🎼

在本节课中,我们将学习如何使用集成模型来提升预测性能。集成模型通过对多个独立模型的预测结果进行平均,从而获得比单一模型更稳健、更准确的预测。我们将使用回归学习器应用,基于之前的出租车行程数据,训练并比较几种决策树集成模型。


上一节我们介绍了单一决策树模型。本节中,我们来看看如何训练集成模型,并评估它们对行程时长预测的改进效果。

首先,我们尝试使用提升树集成模型。

请注意,在高级选项中,该算法有两个在常规决策树中不存在的超参数:学习器数量学习率

以下是提升算法的工作原理:每一棵后续的树都会修正前一棵树的预测结果。

  • 学习器数量 决定了总共训练多少棵树,在本例中默认值为3。
  • 学习率 用于缩放修正预测的幅度。

现在,我们使用应用默认的参数值来训练模型。

看起来,提升树模型的表现比之前的最佳单一模型(粗树)更差。

这可能意味着需要调整超参数,或者提升树集成本身就不适合当前的数据。


让我们暂时搁置提升树,看看装袋集成模型的表现如何。

从菜单中选择此选项并点击训练。

看起来,与之前的单一粗树模型相比,性能有了显著提升。

请注意,这个结果是使用应用的默认参数获得的。你能否做得更好呢?

之前表现最佳的粗树模型的最小叶节点大小为36,让我们在集成模型中尝试这个值。

注意,装袋集成模型也有一个学习器数量的超参数。

这个值决定了使用多少棵独立的树来求取最终的预测平均值。

我们暂时将此值保持在30,并训练新模型。

有趣的是,增加最小叶节点大小并没有改善装袋集成的RMSE。

因此,随着模型中树的数量增加,对于当前数据,更小的最小叶节点大小似乎更有效。


最终,装袋树集成模型的表现显著优于单一决策树,是预测出租车行程时长的一个有前景的方法。

下一步是寻找最优的超参数值,例如最小叶节点大小,这将在下一课中学习。


本节课中,我们一起学习了如何使用回归学习器应用训练提升树和装袋树集成模型。我们发现,对于当前的出租车数据,装袋集成模型通过组合多个决策树的预测,显著提升了模型的预测性能。这为后续的模型优化奠定了基础。

23:超参数介绍 🎯

在本节课中,我们将要学习机器学习模型中的两个核心概念:参数与超参数。我们将明确两者的区别,理解超参数的重要性,并探讨如何优化超参数以提升模型性能。

模型参数与超参数

在机器学习中,你可能会遇到“参数”和“超参数”这两个术语,它们都用于描述模型的特征。那么,这两者之间有何区别呢?

模型参数是模型内部的配置变量,其值从数据中估计得出。模型参数从训练数据中学习,其值由机器学习算法本身进行优化。因此,数据科学家无需手动设置它们。

例如,在逻辑回归中,S型函数(sigmoid equation)的系数就是根据数据计算得出的。

然而,有些参数无法通过训练单个模型来学习,这些参数被称为超参数。模型超参数会影响学习算法的工作方式,但其本身不会由训练算法利用数据进行优化。

超参数必须在运行算法之前进行设置。因此,为了估计模型参数,找到超参数的合适值是必要的。

超参数示例:K近邻模型

一个很好的例子是K近邻(KNN)模型中的 K。回想一下,K的值并非由数据设定,因为它不是由分类模型自动生成的。

因此,K是KNN模型的一个超参数。但这并非该模型中唯一的超参数,你还可以更改用于确定哪些点被视为“邻近”的距离度量

这两个值都会影响你的KNN分类器的准确性。之前,你已经尝试过使用出租车数据为超参数K寻找一个合适的值。

对于二分类和多分类模型,你都通过改变K值并评估性能进行了实验。

现在,你有了两个超参数:K距离度量

那么,是否存在一种更好的方法来寻找最优的超参数值呢?

超参数优化

虽然参数是通过使用训练数据训练模型来优化的,但超参数是在训练过程之外确定的。

因此,为了估计超参数的最优值,你需要依赖一个称为超参数优化调优的过程。

从概念上讲,超参数调优是在模型训练之上的一个优化循环,旨在搜索能带来最低误差的超参数组合。请注意,此过程必须使用验证数据。

尽管这种优化可以通过手动搜索来完成,但它很快就会变成一项反复试验的任务。

自动化超参数调优方法

有方法可以自动化这个过程。一种方法是网格搜索,它会遍历超参数的每一种组合。

以KNN为例,网格搜索会尝试K和距离度量的每一个值组合,以确定最优值集。然而,这种方法可能非常耗时,并且随着数值数量的增加,其扩展性很差。

你也可以使用一种称为随机搜索的方法。顾名思义,超参数值的组合是随机抽样的。因此,并非所有超参数值都会被尝试。这很有帮助,因为事先很难确定模型对哪些超参数值敏感。然而,随机搜索仍可能错过全局最优解。

尽管网格搜索和随机搜索易于理解,但它们的效率不高。

直观地说,根据过去组合的性能来选择下一个超参数组合会更高效。这正是贝叶斯优化的目标。采用这种方法,算法会跟踪过去的评估结果,并用其形成模型性能的概率表示。这是通过使用一个作为超参数组合主要评估器的目标函数,以及一个称为代理模型的目标函数近似来实现的。

贝叶斯优化方法之所以高效,是因为它们以知情的方式选择下一个超参数值,并且进行更少的函数评估。

总结与最佳实践

总而言之,改进模型的一种方法是明智地选择超参数。找到超参数的最佳组合可能很棘手,但你可以使用一些方法来自动化优化过程。

自动化的超参数调优过程在选择数值时所需的人工努力较少,但需要更多的计算时间。

由于大多数模型都有多个超参数,你通常需要选择对模型结果影响最大的超参数子集进行调优,而不是试图调优所有超参数。

在下一节课中,你将有机会了解如何使用MATLAB进行超参数调优。

24:优化超参数 🎯

在本节课中,我们将学习如何使用MATLAB的回归与分类学习器应用,通过自动化优化过程来寻找机器学习模型的最佳超参数集,从而提升模型性能。

概述

你已经使用回归和分类学习器应用训练了多个模型,并尝试手动调整一些超参数来改进结果。然而,手动调整参数值对于寻找最佳超参数集来说是不切实际的方法。现在,你将学习如何使用优化来自动化这一过程。

优化准备与注意事项

在开始之前,请注意优化例程会随机选择初始的超参数值集。这通常会导致每次运行优化时,最终结果略有不同。因此,如果你跟随操作,生成的数字和图表可能与视频中显示的不完全一致。

让我们开始吧。回归和分类学习器应用提供了多种可优化的模型。本视频重点介绍决策树和集成树。不过,无论选择哪种模型,训练可优化模型的过程都是相同的。可用的选项将取决于模型的类型。

优化决策树模型

上一节我们介绍了超参数优化的概念,本节中我们来看看如何优化一个决策树模型。

之前你已经看到,对于纽约出租车数据,最小叶节点大小如何影响决策树和树集成模型的准确性。对于单棵树,增加最小叶节点大小会提高准确性。但对于袋装树,效果却相反。那么,如何选择能最大化准确性的值呢?

决策树只有一个需要优化的超参数:最小叶节点大小。代理决策分割在处理缺失数据时很有用。如果某个节点的预测变量值缺失,则在该节点使用另一个预测变量。由于当前数据集没有任何缺失条目,你可以将此选项保持关闭状态。

点击“训练”开始优化。

一个显示最小均方误差(MSE)的图表会展示优化进度。优化默认运行30次迭代,但可以在“高级优化选项”对话框中更改此设置。

图表中的点传达了迄今为止识别出的最佳模型的信息。不要将它们误解为每次迭代的具体结果。深蓝色的点显示了最佳模型应用于训练数据时的MSE。浅蓝色的点是基于迄今为止测试过的所有超参数值集(包括当前迭代)对MSE的估计。你可以点击右下角的链接查看更多关于此图表的详细信息。

优化算法会选择产生最佳估计MSE的超参数值。这通常是具有最小观测MSE的模型,但并不总是如此。

优化结果对比

那么,具有优化超参数的模型与使用默认设置创建的模型相比如何呢?结果是得到一个接近36的最小叶节点大小,这也是粗树模型中默认使用的数字。这是本模块开始时单树模型中表现最好的。优化后的树有所改进,但误差仍然高于袋装集成模型。

让我们看看优化集成模型是否能进一步降低误差。集成模型比单棵树拥有更多的超参数。

以下是集成模型的可优化超参数:

  • 集成方法
  • 最小叶节点大小
  • 学习器数量
  • 学习率
  • 要采样的预测变量数量

优化五个超参数需要更多的迭代次数,并且可能非常耗时。

选择与优化集成模型

这里看起来袋装树比提升树更适合出租车数据,所以我们坚持使用袋装树模型。通常,你可能需要两者都尝试。

优化剩下的三个超参数仍然可能需要很长时间。在一个性能相当强大的笔记本电脑上,这个模型的30次迭代花费了一个多小时。所以让我们直接跳到结果。

最终模型评估与权衡

可优化的集成模型在所有已训练的模型中具有最低的RMSE。但学习器的数量很高。当导出并保存时,这个模型占用了超过2GB的磁盘空间。它在进行预测时也比拥有30个学习器的袋装树模型慢得多。

优化算法仅根据准确性选择最佳模型,但你的应用可能还有其他约束条件。

你可以通过减少学习器的数量来减小模型的大小并提高其速度。让我们尝试使用更少的学习器,看看是否能获得相似的准确性。

结果看起来很棒。预测速度更快,导出的模型明显更小,而RMSE仅增加了1%。

最终步骤

你现在拥有了最终训练的模型。请记住,即使你执行的是留出验证,最终模型也是在合并的训练和验证数据上训练的。

最后一步是将其应用于测试数据以评估性能。

总结

本节课中我们一起学习了如何利用MATLAB学习器应用的自动化优化功能来寻找模型的最佳超参数。我们实践了优化决策树和集成树模型的过程,理解了优化结果的解读方法,并认识到在实际应用中需要在模型准确性、大小和预测速度之间进行权衡。最终,我们得到了一个在性能和实用性之间取得良好平衡的模型,并准备好在测试集上进行最终评估。

25:评估和使用模型 🎼

在本节课中,我们将学习机器学习工作流的最后一步:评估最终模型在测试集上的性能,并将其应用于新数据以进行预测。

模型泛化能力评估

训练完最终模型后,你已经完成了机器学习工作流中最困难的部分。但一个重要的问题仍然存在:你的模型能否泛化到它从未见过的数据?

为了回答这个问题,你必须将最终模型应用于测试数据以评估其性能。

过拟合与测试集的重要性

回忆一下,过拟合是指模型对训练数据过于熟悉,导致在训练数据之外进行预测时表现不佳。这就是为什么在开始训练模型之前预留测试数据非常重要。因为测试数据不用于训练,它可以模拟模型在未见数据上的表现。

本节内容概述

在本视频中,你将通过将优化后的模型应用于测试数据来完成机器学习工作流。具体包括:评估优化模型的性能,以及在应用程序之外使用模型进行预测。

准备测试数据

首先,对测试数据应用与组合训练和验证数据相同的预处理步骤。你还必须添加模型预测出租车行程时长所需的所有特征。

导入测试数据至回归学习器应用

现在测试数据已准备就绪,下一步是将其导入回归学习器应用。从工作区中选择测试数据。响应变量和预测变量会根据已训练的模型自动选择。然后导入数据。

选择最终模型

在模型历史记录中,选择你的最终模型。这里我们将使用我们优化过的、包含较少学习器的集成模型。

应用模型至测试数据

接下来,将选定的模型应用于测试数据。

评估测试结果

那么它的表现如何?让我们查看位于摘要选项卡中的测试结果。

均方根误差告诉我们,模型预测行程时长的误差大约为5分钟。测试指标和训练指标非常相似。这是一个很好的迹象,表明模型没有对训练数据过拟合。

分析残差图

你可以通过查看残差图来了解误差如何随行程时长变化。以下是创建残差图的步骤:

  1. 从测试数据创建行程时长的残差图。
  2. 观察短途和长途行程的误差情况。

请注意,对于最常见的短途行程,模型表现良好,残差接近零。对于不太常见的超长途行程,模型表现不佳,会低估行程时长。这可能是由于事故或道路施工等不可预见的情况造成的。为这些事件添加额外的特征可能有助于改进模型。

使用模型进行新预测

完成最终模型的评估后,你就可以将其用于新的观测数据了。以下是具体步骤:

  1. 将模型导出到工作区。
  2. 为导出的模型命名。

导出的模型是一个结构体变量。结构体将相关但不同类型的数据组合在单个变量中。你训练的模型包含所需预测特征和模型类型的信息,但最重要的是,它包含一个用于新观测数据的预测函数

例如,假设你需要预测一个周二下午6点从下曼哈顿到时代广场的行程时长。

新观测数据应存储在一个表格中,该表格包含与模型训练期间使用的相同的预测特征。然后,使用导出模型的 predict 函数来估计行程时长。

% 示例:使用导出的模型进行预测
predictedDuration = trainedModel.predictFcn(newObservationTable);

看起来这次行程大约需要30分钟。

课程总结

恭喜你,这完成了整个机器学习工作流。

回顾一下,你从一个包含历史出租车行程数据的电子表格开始,探索并清理了数据,生成了新特征,然后成功地训练、验证并测试了一个预测模型。

你现在已经准备好将这个工作流应用到你自己的项目中了。

模块3:总结

在本模块中,我们学习了监督机器学习工作流中的关键步骤,包括模型评估、特征选择、集成方法以及超参数调优。现在,让我们来总结一下本模块的核心内容。

你已经成功完成了本模块的学习。结合你在课程1和课程2中获得的技能,你现在可以应用完整的监督机器学习工作流了。

以下是本模块所学内容的总结。

使用验证数据评估与比较模型

你首先学习了使用验证数据来评估和比较模型。验证数据有助于防止过拟合,使你的模型能够很好地泛化到新数据上。它还能提供模型性能的估计,以便你可以比较不同的方法。

由于你使用验证数据来指导训练过程,因此在工作流早期预留一个测试数据集至关重要。

测试集 = 总数据集 - 训练集 - 验证集

测试集使你能够使用模型从未见过的观测数据来评估最终模型。

最终模型性能 ≈ 在测试集上的表现

降低模型复杂度

接下来,我们探讨了如何使用特征选择和正则化来降低模型复杂度。这些技术帮助你识别最有用的预测变量并防止过拟合。它们对于宽数据集尤为重要。

构建集成模型

有时,单一模型不足以捕捉复杂的趋势。将多个模型的预测组合成一个集成模型可以提高准确性。常见的集成类型包括提升决策树和袋装决策树。

超参数调优

在测试不同模型时,你通常需要调整一个或多个超参数。现在,你可以根据应用需求和约束,通过调优选定的超参数来创建优化模型。

优化模型 = 调优(模型类型, 超参数, 验证集性能)

机器学习是一个迭代过程

请记住,机器学习是一个迭代过程。你需要尝试许多不同的模型和方法。你可能还需要返回到预处理步骤,以设计和清理新的特征。

花些时间复习和实践本模块的概念。当你准备好后,请继续完成本周的评估。祝你好运。

在本模块中,我们一起学习了监督机器学习工作流的完整闭环,从使用验证数据评估模型,到应用特征选择和正则化降低复杂度,再到构建集成模型和进行超参数调优。理解这个迭代过程对于构建稳健、高性能的机器学习模型至关重要。

27:处理类别不平衡 🎯

在本节课中,我们将要学习如何处理分类问题中常见的类别不平衡现象。类别不平衡是指数据集中某一类别的样本数量远多于其他类别,这可能导致模型对多数类预测效果好,但对少数类预测效果差。我们将通过评估指标识别问题,并学习使用欠采样技术来提升模型对少数类的预测性能。

识别类别不平衡问题

在分类问题中,某一类别的观测样本数量远多于其他类别的情况很常见,这被称为类别不平衡。

你在预测出租车行程是否包含过路费的任务中已经看到了这种现象。在一月份的数据集中,不包含过路费的行程数量是包含过路费行程数量的20倍。

本节目标

在本节中,你将学习:

  • 使用分类评估指标来判断类别不平衡是否影响模型性能。
  • 使用欠采样技术来减少训练数据中的类别不平衡。
  • 使用欠采样后的数据训练分类模型,以提升对少数类的预测性能。


建立基准模型

出租车数据清晰地显示了包含过路费与不包含过路费的行程之间存在类别不平衡。你之前已经看到,用这些数据训练的模型虽然整体准确率高,但在预测少数类(包含过路费)时表现很差。

之前的模型是在没有划分验证集或测试集的情况下创建的。



现在,让我们重新创建这些模型,但采用更严谨的方法。首先,留出20%的数据用于最终测试。同时,将预测变量 wasTollPaidtrue/false 值转换为更容易理解的类别标签。

与之前的模型一样,我们只选择上车和下车地点作为预测变量。


但这次,我们将使用五折交叉验证来代替不进行验证的方法。

接下来,让我们训练逻辑回归和中型K近邻模型。

假阴性率显示了模型未能预测出“包含过路费”的频率。

逻辑回归模型漏掉了近90%的过路费行程。KNN模型表现好得多。但请记住,KNN模型需要存储所有训练数据来进行预测,因此可能有较高的存储需求。

接下来,让我们训练一个不需要存储所有数据的支持向量机模型。

在本例中,一个精细高斯核的SVM模型产生了与KNN模型相当的结果。这个模型并不差,它能以超过99%的准确率正确预测“无过路费”。

但它仍然会漏掉大约每20个过路费行程中的3个。

处理类别不平衡的技术

上一节我们评估了基准模型在类别不平衡数据上的表现。本节中,我们来看看如何通过调整数据分布来改善模型对少数类的学习。

处理类别不平衡的一种技术是对训练数据进行欠采样或过采样。

  • 欠采样 涉及从多数类中移除数据点。在本例中,即移除“无过路费”的行程。这样,模型训练时能更均衡地关注每个类别。
  • 过采样 涉及复制或合成少数类中的更多数据点。由于需要谨慎处理以避免向测试集和验证集添加重复数据,该方法将在后续阅读材料中介绍。

自动欠采样:RUSBoost集成

使用欠采样来提升少数类性能的一种方法是使用随机欠采样增强树集成。

该模型在训练过程中自动执行欠采样。

虽然整体准确率低于SVM模型,但其假阴性率已低于10%。

手动欠采样与模型训练

如果RUSBoost的性能仍不满足要求,或者你想尝试其他类型的模型,可以手动对训练数据进行欠采样。

首先,根据 wasTollPaid 的值将训练数据分成两个表。

训练数据中大约有8000个包含过路费的行程。因此,让我们从“无过路费”的行程中抽取10000个样本,以创建一个更平衡的数据集。

使用 datasample 函数,并设置 ‘Replace’, false 选项,以避免在新训练集中出现重复数据。

% 示例代码:手动欠采样
minorityData = trainingData(trainingData.wasTollPaid == “Toll”, :);
majorityData = trainingData(trainingData.wasTollPaid == “NoToll”, :);
sampledMajorityData = datasample(majorityData, 10000, ‘Replace’, false);
balancedTrainingData = [minorityData; sampledMajorityData];

合并两个表,并检查分布。现在使用这个数据集来训练新模型。

在分类学习器应用中,使用欠采样后的数据集开启一个新会话。使用与之前相同的预测变量和验证方法。我们先训练一个中型KNN模型,其假阴性率低于3%。


之前表现良好且存储需求较低的精细高斯SVM模型也值得一试。其假阴性率低于2%。

在测试集上验证模型

这些模型表现良好,但它们的训练数据类别分布与实际数据不同。

它们在新数据上也能表现良好吗?

你可以在之前划分出的测试数据上检查这些模型,以确保它们能够泛化到新的观测数据。

总结

在本节课中,我们一起学习了如何处理类别不平衡问题。你使用了自动和手动欠采样技术对多数类进行处理,以训练在数据集存在严重类别不平衡时仍能表现良好的模型。你还学会了使用假阴性率作为优化指标,而不是整体准确率,这使你能够根据数据集的特点定制训练过程。做得好!😊

28:使用成本矩阵减少特定错误 🎯

在本节课中,我们将学习如何使用成本矩阵来减少分类模型中的特定类型错误。我们将了解成本矩阵的结构,并通过一个医学筛查的实例,演示如何在MATLAB的Classification Learner App中应用自定义成本矩阵来训练和评估模型。


当模型做出错误预测时,其结果可能代价高昂。例如,医学筛查中的假阳性结果可能导致昂贵的后续检查以确认诊断。而假阴性结果则可能导致漏诊,因延误治疗而增加总体成本。

由于误分类的成本取决于错误的类型,在训练模型时考虑这些成本通常很有帮助。这样,模型可以被训练为避免犯下代价高昂的错误。

上一节我们介绍了错误预测的潜在代价,本节中我们来看看如何通过成本矩阵来量化和管理这些代价。

成本矩阵的结构

成本矩阵的结构类似于混淆矩阵,其行对应真实类别,列对应预测类别。矩阵中的数字是误分类的成本。

当预测类别与真实类别匹配(即预测正确)时,成本为0。当预测错误时,两个类别的成本均为1,这意味着假阴性和假阳性的成本相等。

到目前为止,您训练的所有分类模型都使用类似这样的成本矩阵,其中每种错误的成本相同。

如果您想惩罚模型犯下特定错误,您可以在成本矩阵中增加相应的数字。例如,将假阴性(真实类别为癌症但预测为正常)的成本提高到5倍于假阳性。

以下是成本矩阵的通用表示:

成本矩阵 C:
行:真实类别
列:预测类别

C = [ C(真阴性), C(假阳性);
      C(假阴性), C(真阳性) ]

其中,C(真阴性)C(真阳性) 通常为0。

成本矩阵如何影响模型

具体细节取决于模型类型,但我们来看一个通用示例。考虑一个包含两个类别的散点图。

当使用默认成本矩阵时,线性模型会找到类似这样的决策边界。该边界旨在最大化整体准确率。

当假阴性的成本增加时,决策边界会向右上方移动。现在模型会做出更多的“癌症”预测,这意味着模型将漏掉更少的实际癌症病例。这也意味着该模型将产生更多的假阳性。

自定义成本矩阵将减少特定错误,但整体准确率总会下降。尽管如此,错误的总成本更低,因为漏诊癌症的代价更高。

上一节我们了解了成本矩阵的理论影响,接下来我们通过一个真实的数据集和MATLAB工具来实践操作。

实践:在MATLAB中应用成本矩阵

我们将使用之前见过的卵巢癌数据集。首先,像之前学习特征选择技术时那样准备数据。

具体来说,使用包装法(配合KNN模型)识别出的以下四个特征来创建预测变量矩阵:

predictors = data(:, {'feature1', 'feature2', 'feature3', 'feature4'});
response = data.Class;

以下是操作步骤:

  1. 打开Classification Learner App并开始一个新会话。
  2. 从工作区选择预测变量和响应变量。
  3. 由于此数据观测值不多,选择2折交叉验证。
  4. 选择一个中等复杂度的KNN模型并开始训练。

此模型使用默认成本矩阵,因此假阴性和假阳性的成本相等。准确率约为93%。查看混淆矩阵,可以看到有8个假阴性和6个假阳性。

现在,让我们看看使用自定义成本矩阵后性能如何变化。

设置自定义成本矩阵

  1. 点击工具栏上的“误分类成本”按钮。
  2. 将出现一个包含默认成本矩阵的窗口。将右上角的假阴性成本改为10。这将使每个假阴性的成本是假阳性的10倍。
  3. 点击“确定”按钮,然后训练另一个中等KNN模型。

模型的准确率下降了,但仔细观察混淆矩阵:现在只有一个假阴性,成本矩阵成功地减少了这类错误。然而,假阳性的数量增加到几乎与真阴性的数量相等。这意味着对于未患癌症的患者观测值,模型的准确率只有50%。这是惩罚假阴性所必须做出的权衡。

使用此模型的筛查测试将很少漏诊癌症,但代价是在排除健康患者患癌可能性的性能上表现不佳。

在ROC曲线中观察权衡

这种权衡也可以在ROC曲线中看到。

使用默认成本矩阵时,真正例率(召回率)为0.93,而假正例率为0.07。

具有自定义成本矩阵的模型位于ROC曲线上的不同位置。召回率更好(导致更少的假阴性),然而假正例率显著变差,达到0.52。

通过改变成本矩阵,您可以在这条ROC曲线上创建位于任何点的模型。

根据您的具体需求,您可以决定减少特定类别错误的权衡是否值得增加其他类别的错误。例如,您可能仍然想惩罚假阴性,但不像现在这样强烈。

再次点击“误分类成本”,将假阴性成本从10改为3,然后再次训练模型。新模型位于ROC曲线上的另一个点。召回率略微下降到0.97,但假正例率显著下降到0.21。在混淆矩阵中,可以看到现在有3个假阴性和18个假阳性。因此,该模型成功地惩罚了假阴性,但惩罚力度不那么严厉。正常类别的准确率比之前好得多。


本节课中我们一起学习了如何使用成本矩阵来管理分类错误。记住以下几点:

  • 成本矩阵指定了每个类别的误分类成本。
  • 更改成本矩阵中的值可以增加或减少对特定错误的惩罚。
  • 然而,更改成本矩阵总是存在权衡:错误总数会增加,尽管错误的总成本仍然被最小化。
  • 最后,在设计自定义成本矩阵时,请考虑这些权衡在现实世界中的实际代价。您的独特情况将帮助您权衡利弊并选择合适的成本值。

29:集成模型 🚀

在本节课中,我们将要学习如何将训练好的机器学习模型投入实际应用,这个过程被称为模型部署集成。我们将探讨三种不同的部署工作流,并了解MATLAB如何帮助你在不同场景下实现模型的实际应用。


模型部署概述

当你训练并测试好一个最终模型后,下一步就是将其投入实际应用。虽然证明模型预测准确很重要,但关键在于如何在现实场景中使用它。

无论是帮助零售公司优化产品推荐的数据科学家,还是利用机器学习提升自动驾驶汽车性能的工程师,都需要将模型部署到生产环境中。部署方法多种多样,每种方法对应不同的工作流程。


部署工作流一:共享MATLAB代码 📁

上一节我们介绍了模型部署的概念,本节中我们来看看第一种方法:共享MATLAB代码。这种方法适合希望与其他地点的同事分享研究成果的研究人员。

一个很好的选择是直接分享你的MATLAB代码。

以下是具体步骤:

  1. 首先,创建一个Live Script或函数,用于使用你训练好的模型进行预测。
  2. 然后,利用MATLAB中的源代码控制工具来跟踪更改,并将你的代码上传到基于云的代码仓库,例如GitHub。

这样,任何人都可以下载你的MATLAB代码,并在他们本地的机器上运行。你的MATLAB代码甚至可以在其他编程环境中被调用。如果你分享的对象使用C++、Java或Python等其他语言,他们可以利用MATLAB Engine API,从他们自己的环境中调用你的MATLAB代码。


部署工作流二:创建Web应用程序 🌐

上一节我们介绍了通过共享代码进行协作,本节中我们来看看如何让非技术人员也能使用模型。假设你是一家零售公司的数据科学家,希望让组织内的任何人(包括没有编程经验的人)都能使用你的模型。

针对这种用例,一个好的选择是创建一个带有易用界面的Web应用程序。

以下是具体步骤:

  1. 首先,在MATLAB中设计并创建一个交互式应用程序,该程序能使用你训练好的模型进行预测。
  2. 然后,将应用程序托管在一个Web服务器上。

这样,任何有网络连接的同事都可以通过浏览器使用这个应用程序。


部署工作流三:部署到硬件设备 🔧

上一节我们介绍了面向用户的Web应用部署,本节中我们来看看面向硬件的部署。假设你是一名致力于自动驾驶汽车的工程师。汽车中嵌入的许多硬件设备都可以受益于机器学习模型。

那么,如何将模型部署到不运行MATLAB的硬件设备上呢?

答案是:将你的代码转换为可以在该设备上运行的另一种语言。手动完成这个过程非常耗时。但MATLAB可以自动生成C和C++代码,这些代码可以轻松部署到硬件设备上。

代码生成功能通过让工程师快速原型化和测试新的硬件系统,可以为他们节省大量时间。


总结

本节课中我们一起学习了将机器学习模型投入实际生产的三种主要方法:

  1. 共享MATLAB代码:通过代码仓库和API实现跨团队、跨语言的协作与复用。
  2. 创建Web应用程序:构建交互式界面,让非技术用户也能便捷地使用模型。
  3. 部署到硬件设备:利用代码生成技术,将模型转换为C/C++代码,集成到嵌入式系统中。

每种方法都代表了一种在现实场景中使用模型的有效途径。要了解更多关于使用MATLAB集成模型的示例,请查看本视频后的阅读材料。

30:与Heather的讨论 🎤

在本节课中,我们将通过产品营销专家Heather的分享,了解数据科学实践中的常见问题、工作流程以及行业应用。我们将探讨如何开始一个项目、特征工程的重要性、跨领域应用以及团队协作的挑战。


Heather的角色与工作方式

Heather在MathWorks的产品营销团队工作。她的主要职责是制作视频、示例和博客文章,为数据科学主题提供实用的解释。同时,她也会收集用户和课程学员的反馈,帮助开发团队确定改进的优先级。最近,她专注于帮助数据科学家和工程师团队集成他们的机器学习和深度学习应用。

上一节我们介绍了Heather的背景,本节中我们来看看她个人的工作方式。

当开始一个新项目时,Heather倾向于使用应用程序尝试多种不同的模型。如果对数据有一定了解,可以排除或优先考虑某些可能表现良好的模型。她通常从一个非常简单的模型开始,例如线性模型。

代码示例:在MATLAB中拟合一个简单的线性模型

% 假设 X 是特征数据,y 是目标变量
mdl = fitlm(X, y);

即使知道数据关系可能不是线性的,这样做也有助于理解预测结果是如何产生的。线性模型能提供许多有用的特性,例如可视化图表和方差分析(ANOVA),这些都能帮助你更深入地理解数据和特征,并决定下一步该做什么。在获得对可能有效的模型的初步感觉后,就可以深入进行模型调优和特征工程。

特征工程与深度学习

上一节我们提到了特征工程,本节中我们来看看一个常见问题:是否需要进行特征工程,还是可以直接应用深度学习技术。

Heather认为,这通常取决于你的数据、具体应用以及数据量。深度学习的一个吸引力在于,通常不需要进行大量的特征工程或特征选择。然而,深度学习往往需要大量的数据。即使在许多深度学习应用案例中,人们仍然会进行一些特征选择或工程。

例如,考虑一辆汽车在行驶时收集的所有传感器数据。这将是一个大数据问题,在一秒钟内捕获的数据量就非常庞大。如果你试图实时应用机器学习或深度学习模型,每纳秒都进行处理将非常具有挑战性。因此,工程师们通常会将这一秒钟的数据表示为一组特征。

核心思想:是否需要特征工程,很大程度上取决于对最终应用的前瞻性思考,以及模型在部署时的实际需求。

机器学习的行业应用

机器学习正被应用于许多不同的行业。Heather个人偏爱那些以某种方式帮助人类或环境的应用。

她特别关注气候变化和生态学领域的应用。这些领域的数据量巨大,变化非常频繁,预测和建模极具挑战性,因此正在进行许多有趣的研究。此外,她也喜欢任何涉及音乐或创意领域的应用,例如风格迁移、艺术创作等。还有一些鼓舞人心的故事,比如帮助儿童预测乐器类型,并让他们与计算机竞赛,从而学习如何使用机器学习。

企业数据科学项目的挑战

随着机器学习在不同领域的普及,许多公司首次采用这些技术。Heather观察到,企业在启动数据科学项目时面临一些挑战,尤其是在尝试部署模型或将模型提升到新水平时。

以下是一些常见的挑战及克服方法:

  • 团队协作与集成:项目通常涉及多人协作。一个重要的解决方案是利用MATLAB能够轻松调用多种其他语言(如Python、C、Java)的特性。你可以将训练好的模型部署到这些环境中,便于与IT或设备工程部门的同事进行集成。
  • 文档与代码共享:在团队之间记录工作并共享代码至关重要。像在课程中使用的Live Script(实时脚本)这样的工具非常有用,它可以将所有结果、代码和注释整合在一起,便于团队内部沟通。

给初学者的建议

对于即将完成课程并开始将机器学习应用于自己项目的学习者,Heather有一条重要的建议:提前规划。

在开始之前,思考整个应用:目标是什么?期望是什么?这有助于你在众多令人兴奋的模型和有趣的工作中不迷失方向,始终记住项目的最终目标。同时,过程中的文档记录即使对你自己也极其重要。使用Live Script等工具,将可视化图表和所有笔记保存在一起,会非常有帮助。

总结与趣闻

在本节课中,我们一起学习了Heather关于数据科学实践的经验分享。我们讨论了从简单模型入手的工作流程、特征工程与深度学习的权衡、机器学习在环境与创意领域的应用、企业项目面临的协作挑战,以及对初学者的规划建议。

最后,Heather分享了一个有趣的事实:这项技术并不完全是新的。第一个在MATLAB中运行的神经网络是在1992年,而回归、多项式拟合等功能出现得更早。深度学习和机器学习并非全新事物,它们已经存在了一段时间,只是我们现在正在更好地利用它们。

感谢所有学员在课程和论坛中的积极参与,请继续提问和分享你们的见解。

第31章:预测建模与机器学习总结 🎯

在本章中,我们将总结整个预测建模与机器学习课程的核心内容。我们将回顾从基础算法到高级技巧,再到毕业项目的完整学习路径。


恭喜你完成了预测建模与机器学习部分的学习。你现在已经能够创建多种机器学习模型并评估它们的性能。让我们来总结一下你在本课程中学到的内容。

在模块1和模块2中,你学习了常见回归与分类算法的基础知识。

理解不同的模型非常重要,这能帮助你在选择和调优模型时做出明智的决定。以下是几种核心模型的对比:

  • 线性模型:训练速度快且易于解释,但可能无法捕捉复杂的趋势。其核心公式可表示为:y = β₀ + β₁x₁ + ... + βₙxₙ
  • 决策树:擅长捕捉非线性趋势,但引入了需要手动或通过优化过程设置的超参数

你使用了回归与分类学习器应用程序来训练不同的模型。采用基于应用程序的工作流程,使你能够快速选择特征并调整超参数。

你的训练历史会被保存,因此你可以将最新方法与之前的模型进行比较。关键指标和可视化图表在应用程序中也随时可用。

例如,混淆矩阵ROC曲线可以帮助你识别分类模型在何处犯错。你可以检查回归模型的残差,以找出模型表现良好和需要改进的地方。

相同的工作流程适用于回归和分类问题。

在模块3中,你通过创建用于评估最终模型的测试数据集,应用了监督式机器学习工作流程。

你使用验证数据来比较不同的模型,防止过拟合,并尝试了多种方法。这包括使用不同的算法、执行特征选择和优化超参数。

你在一个项目中应用了这些新技能,以预测不同地点和一天中不同时段的出租车需求。

在模块4中,你学习了一些高级技术,以及部署模型的选项。

分类问题中经常出现类别不平衡的情况。某些类型的错误比其他错误代价更高的情况也很常见。

你现在可以通过采样自定义代价矩阵来解决这两个问题。通常,你可能希望在MATLAB环境之外使用你的模型,例如在Web应用程序或设备上运行的应用程序中。你现在拥有帮助你开始部署模型的资源。


既然你已经能够构建预测模型,接下来该做什么?让我们问问Brandon,他将带领你完成毕业项目。Brandon,在Co4中接下来是什么?

谢谢Heather,你现在已经完成了整个监督式机器学习工作流程,只是每一步都使用了不同的数据集。在毕业项目中,你现在就是数据科学家,你将决定需要捕获哪些重要统计数据、如何预处理数据以及使用哪些机器学习模型。

完成毕业项目后,你将准备好处理自己的数据科学项目。期待在那里见到你。😊


总结

在本章中,我们一起回顾了预测建模与机器学习的完整学习旅程。我们从回归与分类的基础算法学起,掌握了使用MATLAB应用程序进行模型训练、比较和评估的流程。随后,我们深入实践,学习了如何通过验证防止过拟合,并应用技能解决实际问题。最后,我们探讨了处理类别不平衡、自定义错误代价等高级技巧,以及模型部署的初步知识。整个课程为你接下来独立应对数据科学挑战,特别是完成毕业项目,奠定了坚实的基础。

0:课程概述 🎼

在本节课中,我们将要学习《实用数据科学与MATLAB》专项课程的总体介绍。这门课程旨在帮助您掌握将原始数据转化为有意义结果的核心技能。

您可能听说过数据科学正在彻底改变医疗保健、汽车、消费电子等众多领域。几乎每个行业都受到了影响。如果您正在考虑学习这个专项课程,您很可能已经看到了数据科学在您自己领域的潜力。

无论您身处哪个领域,拥有强大的数据科学技能都能让您脱颖而出,并帮助您将原始数据转化为有意义的成果。这就是MathWorks创建《实用数据科学与MATLAB》专项课程的原因。完成这个专项课程将为您提供快速取得实际成果所需的技能和信心。

在整个专项课程中,您将使用MATLAB。

MATLAB是数百万工程和科学专业人士的首选工具,它提供了完成数据科学任务所需的能力。MATLAB使用熟悉的数学符号,并附带图形化应用程序,帮助您快速迭代常见的分析任务。这些应用程序减少了进行有意义的数据科学工作所需的时间,并帮助您立即开始处理数据。



您了解您的领域,也了解您的数据。借助正确的工具和一些实践,您可以构建能够基于数据中的模式进行准确预测的模型。这类技术对于任何希望保持竞争力的公司都至关重要。

完成这个专项课程后,您将能够使用您的数据构建预测模型。这是当今雇主最需要的高需求职业技能之一。

课程结构

上一节我们介绍了课程的整体目标,本节中我们来看看这个四门课程的专项课程具体包含哪些内容。

以下是专项课程中四门课程的详细内容:

  • 第一门课程:数据探索
    在这门课程中,您将学习如何使用MATLAB中可用的图形化工具探索数据。您将生成可视化图表并执行常见的统计分析。

    这门课程设计为适合所有技能水平的学习者入门。图形化工具使您能够快速尝试不同的技术和可视化方法。

    您执行的操作所对应的代码会显示在屏幕上,帮助您学习MATLAB语言并开始自己编写完整的脚本。

  • 第二门课程:特征工程
    在第二门课程中,您将在第一门课的基础上,增加为数据探索和建模进行数据预处理的关键技能。

    完成这门课程后,您将能够整合来自不同来源的数据,去除不需要的干扰(如异常值和缺失数据点),并开始构建用于分类和回归的基本模型。
    这门课程还探讨了您可能会遇到的特定类型的数据。

    例如音频信号、图像和文本。

    即使您不每天处理这类数据,当需要时,您仍然有机会应用相关的概念和应用程序。

  • 第三门课程:机器学习
    当您进入第三门课程时,您将准备好开始使用MATLAB应用程序构建机器学习模型。您将尝试多种不同的建模技术和参数。当您找到满意的组合时,您将构建一个模型并用它进行预测。与任何新技能一样,数据科学成功的关键在于实践。

  • 毕业项目
    最后的毕业项目涵盖了完整的数据科学工作流程。


    您将应用专项课程中所有课程学到的技能来构建一个预测模型。

    您将与同伴合作评估模型,更重要的是,从他们独特的视角中学习。

总结

本节课中我们一起学习了《实用数据科学与MATLAB》专项课程的概览。我们了解到,该课程旨在通过四门循序渐进的课程(数据探索、特征工程、机器学习、毕业项目),帮助学习者掌握使用MATLAB进行数据科学实践的完整技能链,从而能够构建预测模型,解决实际问题。

准备好开始构建实用的数据科学技能,以便在您的组织和行业中发挥作用了吗?很好,让我们开始吧。

1:教师介绍 👨‍🏫

在本节课中,我们将认识本系列课程的讲师团队。每位讲师都将分享他们的背景、与MATLAB的渊源以及个人兴趣,帮助你了解他们丰富的行业经验和教学热情。


大家好。我是Adam Filion。我是Heather Gorr。我是Brendan Hannigan。我是Erin Byrne。

我是MathWorks的在线课程开发人员。我是MathWorks的产品经理。我是MATLAB和数据科学领域的技术产品营销经理。我是MathWorks的在线内容开发人员。

我从小就是一个科学爱好者。四年级时,我最想成为的是迪士尼幻想工程师。

我早在2004年就开始使用MATLAB,当时我在弗吉尼亚理工大学攻读航空航天工程学士学位。我在研究和教学中使用MATLAB已超过10年。

我第一次接触MATLAB是在攻读物理学博士学位期间,购买了学生版本。我主要使用MATLAB来可视化数据并拟合简单模型。

我第一次使用它是在哈维穆德学院攻读工程学期间。我博士期间的主要项目是关于生物流体模式识别的机器学习,那非常有趣。

我的研究生研究集中在一种称为“晕轨道”的领域。我在这方面的研究涉及寻找从低地球轨道到这些晕轨道的最优转移轨迹,自然,我用代码实现了它。

在MATLAB中,最近一个很酷的项目是为实时预测部署机器学习模型。我在MATLAB中创建了信号处理和机器学习算法,然后在云上的流式架构中使用这些预测。

我的职业生涯始于一名航空航天工程师。我为卫星和星际任务(包括火星探测漫游者)进行系统级设计和分析。

在MathWorks,我的职责是帮助其他人学习如何将机器学习、深度学习和数据科学融入他们的工作。我与开发组织合作,确定我们接下来要构建哪些新的数据科学工具。

基本上,我的全部工作就是帮助像你这样的人开始并熟练地将MATLAB用于你的应用。我曾经是一名职业摇摆舞者。我是一名音乐家。

我弹吉他、打鼓,喜欢唱歌和创作音乐。我认为我对音乐的热情确实对我的职业生涯有所帮助,因为我很有创造力,并且能从不同角度思考问题,这在数据科学中很重要。

我开始涉足一些天文摄影。我最喜欢的一张是从邻居家车道上拍摄的猎户座星云照片,因为我家院子里的树挡住了视线。

实际上,我在业余时间也会使用MATLAB,我只是喜欢摆弄数据。我每天早上在查看邮件或做任何事之前,第一件事就是打开MATLAB,在开始一天工作前,我会有一段小小的MATLAB时间。

我非常高兴能在这个系列课程中与大家分享我的一些经验和来之不易的教训。我希望你能看到MATLAB如何帮助像你这样的领域专家在数据科学领域表现出色。


本节课中,我们一起认识了本课程的讲师团队。他们来自MathWorks的不同岗位,拥有工程、物理、数据科学等多元背景,并且都对MATLAB有着长期而深入的使用经验。他们的个人兴趣,如音乐和天文摄影,也展现了创造力与多角度思维,这些正是数据科学领域所需的宝贵特质。在接下来的课程中,他们将带领大家探索MATLAB在数据科学中的强大应用。

2:毕业项目简介 🎯

在本节课中,我们将要学习毕业项目的整体框架、核心目标以及具体的工作流程。这个项目旨在综合运用你在本专项课程中学到的所有数据科学技能。

欢迎来到“现实世界中的MATLAB数据科学项目”。你已在本专项课程中学到了许多新技能。完成这个毕业项目是一个既能实践又能展示所学知识的机会。

与真实世界的项目一样,毕业项目有明确的目标,但没有唯一正确的答案或方法。作为数据科学家,你的工作是应用机器学习工作流程。

上一节我们介绍了项目的目标,本节中我们来看看项目的具体任务。你将探索数据,决定如何预处理数据,并训练最终的机器学习模型。

你将再次使用在课程3中使用过的出租车数据。这次,你的目标是将预测出租车需求作为一个分类问题来处理,并且需要创建六个自定义区域来进行预测。

以下是项目的主要步骤:

  1. 从包含单次出租车行程信息的原始数据开始。
  2. 将其转换为一个汇总每个区域每小时行程数量的表格。
  3. 为需求设计一个响应变量,并为预测该响应设计特征。
  4. 在准备好数据并评估特征后,开始尝试不同的机器学习模型来预测出租车需求。

根据你的结果,可能需要迭代回到前面的步骤。这是数据科学工作流程中预期的一部分。

在探索数据和尝试不同方法的过程中,你将获得能改进结果的新见解。

一旦创建并评估了最终模型,你将创建一份数据科学报告与同行分享。这是一个为技术受众撰写报告的练习机会。

通常,你的最终听众并非其他数据科学家。例如,你可能需要说服业务团队基于你的结果尝试新方法。

有效的沟通能增加你的数据科学工作产生有意义影响的可能性。

你已具备完成项目所需的所有技能。为指导你,主要任务被分为四个模块。每个模块都包含列出你需要完成任务的阅读材料。如果你需要复习,还能找到提示和指向之前课程关键概念的链接。

在进行项目时,请使用讨论论坛提问和分享想法。

课程结束时,你将拥有自己独特的解决方案和分析与他人分享。

那么,让我们开始吧。

本节课中我们一起学习了毕业项目的概况。我们明确了项目目标是预测出租车需求,了解了从数据探索、预处理、特征工程到模型训练与评估的完整工作流程,并认识到沟通与迭代在数据科学项目中的重要性。现在,你已经准备好开启自己的数据科学实践之旅了。

3.1:创建出租车区域

在本节课中,我们将学习毕业项目的核心任务:预测纽约市特定区域的出租车需求高低。原始出租车数据集仅包含单次行程记录,为了分析区域需求,我们需要创建一个新的汇总表,统计每小时每个区域的乘客上车和下车数量。

上一节我们介绍了项目的总体目标,本节中我们来看看如何从原始数据构建这个关键的汇总表。整个过程分为两个主要步骤,本节课将专注于第一步:导入原始出租车数据,并为每次行程分配其对应的上车和下车区域。

首先,我们需要访问存储在CSV文件中的数据。出租车数据按月被分成了12个独立的文件。

为了提高效率并确保过程可重复,我们将通过创建一个导入函数来自动化数据读取过程。以下是处理多个数据文件的推荐方法:

  • 使用 文件数据存储 来批量导入所需的所有文件,而无需单独加载每一个。

一旦出租车数据被加载到MATLAB工作区,下一步就是为每次行程分配上车和下车区域。课程提供的 AddTaxiZones 函数将协助完成此任务。

纽约市共划分为260个出租车区域,而我们需要创建的6个分析区域则由这些基本区域组合而成。例如:

  • 上西区 区域由这6个基本区域组成。
  • 肯尼迪机场 区域则仅包含肯尼迪机场这一个基本区域。

在为数据表添加上车和下车的基本区域信息后,我们需要确定这些基本区域分别属于哪个更大的分析区域。以下阅读材料中提供的CSV文件包含了这一映射信息。

完成上述任务后,我们将得到一个包含整个出租车数据集的新表,其中新增了两个变量,分别代表每次行程的上车区域和下车区域。

接下来,我们将利用这些新的区域变量对数据进行探索。为了完成本模块的所有任务,我们将综合运用在整个专项课程中学到的多种技术。

为了便于您回顾,以下阅读材料总结了本视频内容,并提供了指向前期课程中有用章节的链接。

本节课中我们一起学习了如何导入原始出租车数据,并通过添加区域信息为后续的需求分析做好准备。下一课,我们将基于此数据创建最终的每小时区域需求汇总表。

4:准备数据集 🎼

在本节课中,我们将要学习数据准备流程中的关键步骤,包括数据清洗与汇总,为后续的特征工程和机器学习模型构建打下基础。

上一节我们成功将出租车行程的上车和下车区域信息添加到了数据表中。数据探索与准备是至关重要的步骤,因为原始数据通常组织混乱。

本模块还有两个步骤来完成数据准备工作。

探索与清洗数据

在创建分组汇总表之前,你可能还记得在课程3中,部分行程存在记录错误。

一个基础的预处理函数曾被用来移除这些行程。

这样的清洗过程是必要的,它能确保你的数据仅代表你想要包含在预测模型中的合理行程。

然而,课程3中完成的清洗只是一个基线,并非唯一可做的清洗。

例如,2015年出租车行程的最低允许费用是 $2.50

因此,不仅负值代表记录错误,低于此下限的值很可能也代表错误。

你能想到其他变量或变量组合可能指示错误记录吗?现在你有机会来清理这些异常值。

生成分组汇总表

完成初步清洗步骤后,就可以生成用于机器学习的分组汇总表了。

这里值得回顾课程一和课程二中的几个知识点。

首先,你需要按小时对出租车行程进行分组。

你在课程2中已经练习过使用 dateshift 函数来处理日期时间值,它将有助于为每次行程分配特定的小时。

接下来,你可以使用 groupsummary 函数计算特定区域和特定小时内的行程数量。

像你目前学到的许多MATLAB函数一样,groupsummary 的功能远不止本课程所涵盖的内容。

你可以通过查阅文档了解更多。

在本例中,你可以看到 groupsummary 函数如何同时使用多个分组变量。

如果你需要同时按区域和小时对出租车行程进行分组,这将非常有用。

此外,请记住,你的最终汇总表需要表示分组中的出租车行程数量。

分组由上车区域和小时定义。

同时也由下车区域和小时定义。每个结果都需要独立使用一次 groupsummary 函数。

合并数据表

一旦你获得了这些值,以及关于平均行程距离、持续时间和费用的一些汇总统计量,你可能需要将一些表格连接在一起。

请记住,你在课程2中练习过合并数据。连接表格的实时任务在这里可能很有用。

你还可以通过选择多个关键变量来指导合并过程,这在当前情况下是必需的,因为汇总表中的分组是由区域和小时共同定义的。

计算净需求

一旦你拥有了每个区域的上车和下车数量表,就可以通过计算净上车量来开始估算出租车需求。

本节课中我们一起学习了数据准备的核心步骤:首先清洗数据以移除异常记录,然后使用 groupsummary 函数按区域和小时对行程进行分组汇总,接着合并相关数据表,最后计算净上车量以估算需求。这些步骤为构建有效的预测模型奠定了坚实的数据基础。

模块2:特征工程工作流程介绍 🛠️

在本模块中,我们将从数据分析过渡到特征工程,为后续的机器学习建模准备数据。

上一模块中,我们介绍了出租车需求建模项目,并完成了数据导入、清洗、探索以及区域分组等关键任务。本节中,我们将重点学习特征工程的核心工作流程。

特征工程是机器学习工作流中的重要环节。其核心目标是通过创建和选择有效的特征,提升模型的预测能力。以下是特征工程工作流程的关键步骤。

首先,需要将数据划分为训练集和测试集。这一步至关重要,因为它能帮助我们在后续阶段更准确地评估模型性能。在MATLAB中,可以使用 cvpartition 函数来实现。

% 示例:按比例划分数据
cv = cvpartition(N, 'HoldOut', 0.3); % 保留30%数据作为测试集
idxTrain = training(cv);
idxTest = test(cv);

接下来,需要创建机器学习模型的响应变量。响应变量可以是原始变量、经过处理的变量,或是多个变量的函数。其选择完全取决于你试图解决的具体问题。

然后,可以生成预测特征。与响应变量类似,预测特征可以基于一个或多个变量创建,可以经过处理,也可以不处理。特征的数量仅受可用数据和创造力的限制。

然而,创建的特征只有在能为模型增加预测能力时才有价值。这就引出了工作流程的最后一步:评估

在评估阶段,你需要结合可视化与统计方法,来理解预测特征与响应变量之间的关系。例如,可以计算相关系数或绘制散点图矩阵。

% 示例:计算相关系数
correlationMatrix = corr([predictors, response]);

理解这些关系有助于你识别可能对模型有帮助的特征,并剔除无效的特征。同时,这也能启发你设计新的特征、改进现有特征,并在训练模型前发现并解决潜在问题。

现在,是时候开始动手实践了。接下来,你将获得一系列任务清单和资源,以帮助你构建自己的特征集。

本节课中,我们一起学习了特征工程的标准工作流程,包括数据划分、响应变量与预测特征的创建,以及通过评估筛选有效特征。掌握这些步骤,将为你在下一个模块中成功构建机器学习模型奠定坚实基础。

模块3:模型训练与结果分析

在本模块中,我们将学习如何训练预测模型,并最终分析结果。我们将使用之前已准备和分析好的纽约市出租车数据,来预测未来一小时内各区域的出租车需求量等级。


上一节我们完成了数据的探索、清洗、重构以及特征工程与评估。本节中,我们来看看如何训练预测模型。

具体而言,我们将对纽约市各区域未来一小时内的出租车需求量进行分类,等级分为三类。


首先,我们将平等对待每个类别。我们会尝试不同的模型类型,优化超参数,并测试不同的特征组合,目标是找到具有最高整体准确率的模型。

整体准确率的公式可以表示为:
准确率 = (正确预测的样本数) / (总样本数)


然而,在实际业务场景中,某些分类错误可能比其他错误代价更高。因此,接下来我们将处理一个更详细的场景,即根据现实世界的行为和业务关切,优先考虑减少某些特定的分类错误。

训练分类模型时,通常需要综合考虑多种性能指标及其之间的权衡。例如,如果降低某个类别(如“高需求”)的假阴性率比降低其他错误更重要,我们就需要在建模中着重优化这一点。

这可能会导致整体准确率下降,但能降低模型错误的总体成本。假阴性率的计算公式为:
假阴性率 = (实际为真但预测为假的样本数) / (实际为真的总样本数)


在寻找最佳模型训练选项的过程中,您可能会发现,为了达成总体目标,需要在工作流程的各个步骤之间进行多次迭代。

以下是模型开发中常见的迭代步骤:

  1. 选择模型类型:例如决策树、支持向量机或集成方法。
  2. 调整超参数:使用如网格搜索或随机搜索的方法优化模型参数。
  3. 评估特征重要性:分析哪些特征对预测贡献最大,可能进行特征增删。
  4. 验证性能:在独立的测试集上评估模型,使用准确率、召回率、F1分数等指标。


一旦完成建模,您需要创建一份正式的结果与分析报告,供您的数据科学同事审阅。


本节课中我们一起学习了模型训练的核心流程:从以整体准确率为目标的初步建模,到根据业务需求调整优化重点,并理解了模型开发是一个需要多次迭代的过程。最后,我们明确了以正式报告形式呈现分析结果的重要性。

祝您好运。

7:准备最终报告 📄

在本节课中,我们将学习如何准备一份结构清晰、重点突出的数据科学最终报告。我们将以MATLAB Live Script为基础,介绍如何将代码与结果分离,创建易于导航的文档,并导出为合适的格式。


可执行的Live Script非常适合与需要交互、编辑和运行代码的同事共享协作,但它并非总是呈现最终结果的理想格式。本数据科学报告的要求明确指出,需要以非可执行格式呈现最终结果。

在这种情况下,将代码与结果交织在一起,会使包含多个关键结果的报告难以阅读。

因此,你需要将重要结果放在报告主体部分优先展示,而将代码放在附录中供参考。

本节视频将以Course3项目为例,展示如何使用Live Script准备数据科学报告。你将学习如何将代码示例放入附录、在必要章节间创建链接,以及将图形以图片形式插入。

创建目录与章节结构

上一节我们明确了报告的结构原则,本节我们来看看如何具体搭建报告框架。

首先从添加目录和必要章节开始。

在空白脚本中添加目录后,目录将随着章节标题的添加而自动更新。在本例中,我们先添加顶级章节标题,并立即填写一些细节。

以下是各独立章节可能包含的要求:

  • 书面细节描述:对每个部分进行文字说明。
  • 需放入附录的参考代码:将执行的代码放在附录部分。

填充报告内容与创建链接

在搭建好框架后,接下来需要填充具体内容并建立内部链接。

Course3项目的模板包含了对数据的简要描述。你需要为自己的当前项目撰写类似的内容。

请注意,模板还包含了对用于数据导入、重构和初始特征工程的脚本的引用。

为了防止任何可能的脚本执行错误,这段代码需要作为非可运行的代码示例添加到附录中。

接下来,为了确保报告易于他人浏览,你需要在正文的相应部分添加指向附录代码的超链接

具体操作步骤如下:

  1. 高亮你想要设置为链接的文本。
  2. 点击“超链接”按钮。
  3. 选择“链接到文档中的位置”。
  4. 然后滚动到附录并点击相应的标题。

请确保为报告的每个章节添加所有必需的描述和超链接。

插入图形与模型细节

处理完文本和代码后,我们来看看如何将分析结果中的图形有效地整合到报告中。

那么,如何插入图形呢?

在报告中包含图形且无需代码运行的最简单方法是:在Live Editor中右键单击图形,然后选择“复制输出”。

然后将图片粘贴到报告的相应章节。

如果你使用 Classification Learner App 进行预测建模,可以通过将鼠标悬停在图形右上角并选择“复制为图像”来将图形复制到报告中。

不要忘记同时包含App中显示的模型详细信息

此外,如果你使用了该App,则需要导出模型训练函数,并将代码放入附录。

最终检查与导出

在完成所有内容的填充和格式调整后,最后一步是进行最终检查并导出报告。

在你仔细检查报告已包含所有必需内容后,使用“保存 > 导出为 PDF”将其导出为所需格式。

在提交前审阅PDF文件是一个好习惯。

祝你的报告顺利成功!


本节课中我们一起学习了如何准备一份专业的数据科学报告。关键步骤包括:使用目录构建清晰结构,将核心结果置于正文、详细代码置于附录,通过超链接增强可读性,以图片形式插入图形,并最终导出为PDF格式进行提交审阅。

8:数据科学中的讲故事 📖

在本节课中,我们将要学习如何将数据科学的结果有效地传达给他人,这一过程被称为“数据讲故事”。仅仅依靠数据和指标揭示信息,往往不足以让他人理解并采取行动。我们将重点探讨如何结合清晰的可视化和有意义的叙述,来构建一个引人入胜的故事。

可视化的重要性 📊

上一节我们介绍了数据讲故事的概念,本节中我们来看看其第一个核心组件:可视化。

通过数据、数字和指标揭示信息,并不足以将你的结果传达给他人。为了让人们能够基于数据科学的见解采取行动,他们必须首先理解这些发现的意义。向非技术受众传达结果,通常被称为数据讲故事,是一项重要的技能。优秀的数据讲故事结合了扎实的数据科学、清晰的可视化和有意义的叙述。

你已经深入练习了数据科学部分,现在让我们专注于另外两个组件,首先从可视化开始。

为了说明这个概念,我们使用探索性数据分析中的“Stor事件”数据集。在课程1的项目中,你分析了飓风哈维的数据,以确定派遣理赔员的区域。现在,假设你需要通过沟通分析来建议因飓风而提高保险费率。展示飓风哈维与其他事件的成本对比,是说明损害严重程度的好方法。

虽然像这样的图表确实显示了信息,但它也包含了事件的位置信息。这些额外的细节会模糊关键信息,并可能让你的受众不知所措。有效的可视化只展示受众理解你主要观点所必需的内容。在这种情况下,条形图或饼图对于比较飓风哈维与所有其他事件造成的损害更为有用。

好的可视化还包括标题和标签,以便你的受众能够快速识别所呈现的信息。目标是创建受众无需费力就能理解的图表。你可以通过使用前注意属性来实现这一点。前注意属性包括大小、颜色、形状和其他能增加对比度并引发无意识反应的特征。

实际上,你在这个专项课程中一直在使用前注意属性。当你开始创建自己的报告时,请确保使用能引入足够对比度的属性来创建你的视觉图表。

构建引人入胜的叙述 📝

上一节我们探讨了如何通过可视化清晰呈现数据,本节中我们来关注数据讲故事的第三个要素:构建引人入胜的叙述。

虽然没有单一的固定模式,但有几个方面需要包含。你的叙述应该清晰地陈述问题、当前状况、提出的解决方案或建议,以及结论和后续步骤。

你如何呈现每个主题将取决于你的受众。以飓风哈维的例子来说,业务团队是否已经知道需要提高保险费率?如果不知道,你需要描述当前状况,并说服你的受众认识到问题所在。

你还需要根据受众的技术背景来调整你的演示。例如,在推荐新费率时,技术受众可能希望看到可能结果的直方图,而对普通受众,你可能需要更简单地呈现结果。

在构建叙述时,寻找机会使故事简洁、引人入胜、具体和可信

以下是构建有效叙述的几个关键点:

  • 保持简洁:专注于受众最需要知道的内容。避免可能分散受众对你主要观点的额外细节。
  • 引人入胜:引人入胜的叙述能保持受众的注意力。引入惊喜或情感是实现这一点的两种方式。例如,强调飓风哈维在两周内造成的损害超过所有其他事件总和的两倍,可能会让业务团队感到惊讶并引起他们的注意。
  • 具体化:使用具体的例子使你的叙述更具体。作为数据科学家,你的建议基于完整的数据集,然而,突出具体的观察结果会使故事更贴近你的受众。
  • 确保可信:基于良好的数据科学得出结论,使用成熟的工具和资源来支持你的主张。并讨论你模型中的局限性或未知因素,例如你缺乏的特征或缺失的数据。

总结 🎯

本节课中我们一起学习了数据讲故事,即向受众清晰传达结果的能力。一个好的数据故事包含清晰且有目的的可视化、经过深思熟虑的叙述,当然,还有扎实的数据科学。具备这种能力,你可以让受众保持参与、获得信息,并激励他们采取行动。

9:课程总结 🎉

在本节课中,我们将回顾整个《实用数据科学与MATLAB》专项课程的核心内容与学习旅程,总结从数据探索到毕业项目所掌握的关键技能。


恭喜你完成了毕业项目。数据科学技术已在众多应用领域变得至关重要,包括自动驾驶系统、电力生产、医疗诊断、活动追踪等等。

跨学科领域,海量数据既是挑战,也是机遇。通过学习如何应用数据科学实践,你已做好准备,迎接挑战并抓住机遇,无论是在当下还是整个职业生涯中。


数据探索与分析

你从探索和分析数据开始,这通常颇具挑战性。在第一门课程中,你学习了如何导入、可视化和筛选数据,以便快速获得关键洞察。

你还学习了如何计算分组汇总统计量,并发现变量之间的相关性,这有助于你更好地理解数据。

然而,当数据包含大量噪声、缺失值或异常值时,理解数据会变得困难。


数据预处理与特征工程

现在,你可以运用在第二门课程中学到的技能,高效地预处理数据。你还学习了如何设计和评估特征。

有用的特征通过提高训练速度和模型准确性来助力机器学习。它们也能让你的机器学习结果更易于解释。


机器学习入门与应用

刚开始接触机器学习可能令人望而生畏,但凭借在第三门课程中学到的技能,你已经准备好迎接挑战。

你学习了如何将多种方法应用于回归和分类问题。

重要的是,你现在拥有一个可以应用于任何监督式机器学习项目的工作流程。


毕业项目实践

在大多数数据科学应用中,并不存在唯一正确的答案。你在毕业项目中运用了前三门课程所学的知识,处理了这样一个场景。

以下是你在项目中完成的关键步骤:

  • 探索并准备数据。
  • 评估特征。
  • 创建机器学习模型并评估结果。

最后,你创建了面向技术与非技术受众的定制化报告。这是一项关键技能,能确保你的发现可用于推动有意义的变革。


应用所学与展望未来

现在,是时候开始将本专项课程中学到的技能应用到你的工作中了。请记住,领域知识是数据科学的重要组成部分。

你所执行的分析不仅取决于数据,还取决于你试图回答的问题。你为机器学习模型使用和创建的特征,将取决于你试图预测的响应变量。你构建的模型类型不仅取决于数据,还取决于你的目标。

当你开始使用MATLAB处理自己的项目时,请牢记这一点。我们相信你已经具备了成功的技能。祝你好运!


在本节课中,我们一起回顾了整个数据科学工作流程:从数据导入、探索、预处理、特征工程,到构建与评估机器学习模型,最终完成毕业项目并生成报告。你已掌握了一套系统的方法,可以自信地运用MATLAB解决现实世界的数据科学问题。

posted @ 2026-03-26 08:57  布客飞龙I  阅读(45)  评论(0)    收藏  举报