Matlab-机器学习第二版-三-

91 阅读57分钟

Matlab 机器学习第二版(三)

原文:annas-archive.org/md5/35b100e1a62ae767cfb628ba7d257d7c

译者:飞龙

协议:CC BY-NC-SA 4.0

第九章:使用 MATLAB 进行时间序列分析和预测

时间序列数据是在一定时期内收集的一系列测量值。这些与特定变量相关的测量值在固定间隔发生。时间序列数据的一个基本特征是其顺序的重要性;观察值在时间线上的排列传达了有意义的模式。改变这种顺序可以完全改变数据的含义。序列数据是一个更广泛的概念,包括以序列方式呈现的任何数据,这包括时间序列数据。在本章中,我们将深入研究围绕序列数据的基本概念,阐明如何构建捕捉时间序列或任何序列数据中模式的模型。

在本章中,我们将涵盖以下主要主题:

  • 探索时间序列数据的基本概念

  • 从序列数据中提取统计数据

  • 实现一个用于预测股市数据的模型

  • 在 MATLAB 中处理不平衡的数据集

技术要求

在本章中,我们将介绍基本的机器学习概念。为了理解这些主题,需要具备代数和数学建模的基本知识。你还需要掌握 MATLAB 的实际操作技能。

要使用本章中的 MATLAB 代码,你需要以下文件(可在 GitHub 上找到,网址为github.com/PacktPublishing/MATLAB-for-Machine-Learning-second-edition):

  • Nile.csv

  • TSLA.csv

  • TeslaStockForecasting.m

探索时间序列数据的基本概念

时间序列代表了一系列按时间顺序记录的观察值,例如月收入、日股价、周利率、年利润等。时间序列分析的主要目标是考察现象随时间的历史演变,以预测其未来的轨迹。这种预测洞察力源于这样一个假设:过去观察到的重复模式将继续在未来显现。我们将探讨预测预测和不同的预测方法,提供对两者的详细描述。

理解预测预测

预测变量的轨迹对于制定任何事业的生产策略和计划至关重要。例如,在规划公司的生产策略时,仅仅了解产品或服务的需求是上升还是下降是不够的。预测产品需求、定价动态和原材料成本的未来趋势是至关重要的。这些因素共同对生产活动产生重大影响。

预测在整个决策过程中占据核心地位。当预测不精确或不足时,存在使从复杂的决策模型中得出的结论无效的实质性风险。“预测过程”一词涵盖了各种复杂活动,无论是明显的还是隐秘的,最终都归结为预测的创建。

术语预测预测经常被互换使用,但区分它们的含义是有益的。预测涉及将概率与未来事件相关联或定义置信区间以估计未来可能发生值的范围。相反,预测包括确定一个可测量量在未来的确切值。因此,通过使用传统的推断统计工具来推导相应的置信区间,将预测与使用这些工具做出的预测联系起来是直接的。所有预测模型的主要目标是确定预期值的估计,以及预测模型可能产生的潜在误差的估计。

预测范围是区分预测过程的关键因素。预测可以涉及短期未来,长达 12 个月,作为运营决策的基础。这可能包括预测未来 2 个月的产品需求。或者,预测可以延伸到中期,从 12 个月到 24 个月,支持与生产计划相关的决策。在第三种情况下,预测针对的是更远的未来,超过 24 个月。在这种情况下,它们被制定来支持有关公司发展计划的经理决策。在这三种情况下,每个都由短期、中期或长期预测范围特征化,寻求利用这些预测的决策者的目标差异很大。同样,对这些相应预测所需的精确度和详细程度也各不相同。

介绍预测方法

预测方法是指基于历史数据和模式预测未来值、趋势或事件的各种技术和方法。这些方法在包括经济学、金融、商业和气象学在内的众多领域中至关重要。预测方法主要取决于它们支持决策的特征和目的。诸如时间跨度的持续时间、历史数据的质和一致性,以及被预测产品的特定属性(如其在生命周期中的阶段)等因素在确定适当的预测方法中起着重要作用。

从本质上讲,预测方法可以分为两大类:定量方法定性方法

解释定量预测方法

当有足够的定量数据可用时,会采用定量方法,这使得基于历史数据对未来结果进行预测成为可能。通常,这些方法用于做出短期至中期决策。以下是一些定量预测方法的例子:

  • 时间序列分析:在这种方法中,要预测的现象被视为一个不透明的实体,重点不在于识别影响因素。这种方法的目标是识别现象演变中的过去模式,并将这些模式扩展到未来以进行预测。简单来说,预测基于现象随时间的历史行为,而不是与解释变量相关联。例如,这种方法常用于分析销售趋势、GDP 趋势和类似数据。

  • 回归分析:回归模型量化了一个或多个预测变量与响应变量之间的相关性。这些方法基于这样一个假设,即要预测的变量可以与一个或多个独立或解释变量相关联。这种方法适用于预测数值结果,并且在经济学、金融和社会科学中常用。例如,家庭对消费品的需求被认为受收入、家庭成员的年龄和其他相关变量的影响。

  • 指数平滑:指数平滑技术为先前观察分配指数递减的权重,优先考虑较近数据点的显著性。这有助于平滑噪声并识别时间序列数据中的趋势。

  • 机器学习:包括决策树、随机森林和神经网络在内的机器学习算法在预测任务中找到应用,尤其是在处理大量数据集或复杂关系时。它们可以捕捉非线性模式,并在各种预测应用中越来越被采用。

这些方法在以下条件下适用:

  • 关于现象先前模式的历史数据是可获得的

  • 可以量化这些历史信息

  • 可以合理地假设,表征过去趋势的属性将延续到未来,从而允许进行准确的预测

实质上,当有足够的可量化历史数据时,会采用定量方法。

描述定性预测方法

定性方法主要依赖于判断,这使得它们依赖于消费者和专家的观点和评估。当定量数据稀缺而定性信息充足时,这些方法就会发挥作用。以下是一些说明定性方法应用的实例:

  • 专家判断:定性预测通常依赖于领域专家的专业知识和意见。德尔菲法和专家小组是收集知识渊博的个人意见的技术示例。

  • 市场研究:定性研究方法,如调查、焦点小组和客户访谈,用于收集有关消费者偏好、行为和市场趋势的信息。这些数据对于预测未来的市场条件非常有价值。

  • 情景分析:定性预测可以包括创建关于可能未来事件的多个情景或叙述。决策者随后考虑这些情景以做出明智的决策。

  • 历史类比:这种方法涉及根据与过去事件或情况的相似性进行预测。在处理独特或新颖的情况时,这可能是有用的。

  • 专家系统:专家系统和由人工智能驱动的工具可以通过汇总和解释来自各种来源的数据来协助进行定性预测,从而提供洞察和预测。

预测中定量方法和定性方法的选择取决于多种因素,包括数据的性质、历史信息的可用性、特定的预测目标以及涉及的主观程度。在许多情况下,结合使用定量和定性方法可以提高预测的准确性和稳健性,尤其是在复杂的决策环境中。

时间序列分析

时间序列代表了一系列与现象相关的观察结果,这些观察结果是在连续的时间点或间隔上记录的。这些间隔通常是均匀的,尽管不总是这样。时间序列数据的实例包括商品价格趋势、股票市场指数、BTP/BUND 利差和失业率等多样化的元素。

与经常假设独立观察结果来自单个随机变量的经典统计学不同,时间序列分析假设有 n 个观察结果来自众多相互依赖的随机变量。因此,时间序列分析涉及一个旨在解读观察数据背后的潜在生成过程的程序,而不是将每个观察结果视为独立且同分布的。

根据收集到的数据,时间序列数据可以分为两大类:

  • 连续时间序列:数据在特定时期内连续记录,没有任何间隔或中断。这种类型的时间序列在传感器数据等应用中很常见,其中测量是在非常短的时间间隔内进行的,通常是在实时。例如,每秒记录的温度读数、每分钟更新的股票价格或连续间隔的心率监测。

  • 离散时间序列:数据在特定的、离散的时间间隔内记录,这些间隔不一定均匀。这些间隔可以是每日、每周、每月、每年或任何其他预定的周期。离散时间序列数据常用于经济、金融和社会科学中,以分析随时间变化的趋势和模式。例如,包括月度销售额、年度 GDP 增长率或周度网站流量统计。

选择连续时间序列和离散时间序列取决于收集数据的性质和分析的具体目标。每种类型的时间序列都有其自己的统计技术和工具,用于建模、预测和提取有意义的见解。

时间序列数据也可以根据数据生成过程的潜在性质分为两大类:

  • 确定性时间序列:这种类型的特点是数据点之间存在清晰且可预测的模式或关系。确定性时间序列中的数据值遵循特定的数学函数或规则。确定性模式可以用数学方程式或公式表示,可能包括周期性或季节性变化、趋势或特定的数学关系。确定性时间序列通常表现出很少或没有随机性,使其高度可预测。这类时间序列的例子包括表示一年内每日温度变化的正弦波、股价的线性趋势,其中价格随着时间的推移持续增加或减少,以及受已知季节性模式(如假日销售)影响的月度销售额。

  • 随机时间序列:这种类型的特点是随机性,数据点不受特定确定性规则的支配。相反,它们受随机或概率因素的影响。随机时间序列表现出固有的随机性,使得确定性地预测未来值变得具有挑战性。它们通常涉及不确定性、噪声和随机性等元素,这些元素不能完全由确定性模型解释。统计技术,如自回归积分移动平均ARIMA)模型或状态空间模型,通常用于分析和预测随机时间序列。这类时间序列的例子包括受多种不可预测因素影响的股价,其每日波动无法精确预测,每日天气条件,其中降雨量或温度等变量可能随机变化,以及受用户行为和外部因素影响的每日网站流量,导致随机波动。

在实践中,许多现实世界的时序数据包含确定性和随机性成分的组合。有效地分析和建模时序数据通常需要识别和分离这些成分,以获得洞察力并做出准确的预测或预测。当潜在模式定义良好且稳定时,确定性模型是有用的,而当随机性在数据中扮演重要角色时,则采用随机模型。

事实上,当处理同时表现出确定性和随机性成分的时序数据时,通常将序列表示为这两个贡献的总和。这种方法有助于更全面地理解数据,并促进建模和分析。数学上,它可以表示如下:

Y t = f(t) + w(t)

这里,我们有以下内容:

  • Y**t:这代表时间t观察到的时序数据

  • f(t):这代表时间t的确定性成分或贡献

  • w(t):这代表时间t的随机(随机)成分或贡献

通过将时序分解为其确定性和随机部分,分析师和研究人员可以进行以下操作:

  • 分析趋势:确定性成分通常包括趋势、季节性和其他可以单独分析的有序模式,以了解潜在的动态。

  • 模型随机行为:随机成分捕捉数据中的随机波动和噪声。例如,ARIMA广义自回归条件异方差性GARCH)等模型可以应用于该成分进行预测或风险评估。

这种分解方法增强了做出预测、识别异常和深入了解影响时序数据因素的能力。

使用时间表示为t = 1 …. T,我们表示序列,yt。时间作为控制事件序列的关键参数,不容忽视。因此,理解观察时间维度的位置变得至关重要。通常,这种信息以(t, yt)对的形式表示在笛卡尔图上,创建一个连续的线图,传达连续检测现象的印象。这种图形表示通常被称为时序图(图 9*.1*)。

要了解如何绘制序列图,我们可以使用本书 GitHub 仓库中的Nile.csv文件。此文件提供了从 1871 年到 1970 年阿斯旺尼罗河年流量的数据,以 108 立方米的单位测量。我们可以使用以下代码将此数据集导入 MATLAB:

Nile = readtable('Nile.csv');

要绘制时序图,我们可以使用以下命令:

plot(Nile.time,Nile.Nile)

我们使用了点格式,其中timeNile是所选两个特征的名称。以下时序图将被绘制:

图 9.1 – 阿斯旺尼罗河年流量测量

图 9.1 – 阿斯旺尼罗河年流量测量

图 9**.1所示,数据在 1898 年左右似乎有一个显著的变化点,表明在该时期河流流量特征发生了显著的变化或转变。

时间序列图可以立即揭示趋势、重复模式和其他随时间演变的系统性行为。在前面的图表中,我们可以看到年度数据表现出持续下降的趋势,跨越相当长的时间框架。值得注意的是,由于数据是按月记录的,因此存在重复的锯齿形模式,这表明季节性。值得注意的是,在预期降雨的月份,高峰值出现得非常一致。

时间序列的单变量分析旨在解码序列背后的动态过程,并预测现象未来的发生。在此分析中,我们专注于数据对(t, yt),其中t = 1, ……,T。这里的关键概念是,过去和现在的数据都包含对未来现象发展趋势进行预测的有价值信息。

然而,我们必须认识到,在某些情况下,单变量分析可能过于限制。通常,我们拥有与所考虑现象相关的信息,这些信息应适当整合以增强模型的预测能力。尽管如此,单变量分析仍然是一个有价值的基线,使我们能够验证更复杂的建模方法。

在时间序列图中,可以识别出关于时间进展的四种不同模式:

  • 水平模式:在这种情况下,序列围绕一个常数值波动,这通常是序列的平均值。这样的序列被称为平均上稳定。这种模式在质量控制中很常见,其中过程始终保持在平均值周围。

  • 季节性模式:当序列受到诸如月度、半年或季度等重复季节性因素的影响时,就会出现季节性模式。如冰淇淋、软饮料和电力消耗等产品通常表现出季节性模式。这些受季节性影响的时间序列也被称为周期性序列,因为季节性循环在固定间隔内重复。在年度数据的情况下,季节性可能不明显。

  • 周期性模式:周期性模式的特点是序列中存在不规则的增加和减少,这些变化并不遵循固定的周期。这区别于季节性波动。此外,周期性振荡通常比季节性变化具有更大的振幅。在经济序列中,周期性模式是由投机现象引起的经济扩张和收缩所驱动的。

  • 趋势:趋势通过序列中持续的、长期的增长或下降来识别。例如,全球人口序列体现了增长趋势,而每月啤酒销售序列可能不显示任何可辨别的趋势,而是具有稳定的水平背景模式。

许多时间序列都表现出这些模式的组合,正是这种复杂性为预测任务增添了高度的兴趣。预测方法必须具备辨别和复制序列各种成分的能力。这涉及到过去模式将持续并继续在未来表现出其特征特征的假设。

时间序列分析的经典方法涉及将序列的确定性部分分解成一系列信号成分,这些成分传达了序列的结构信息,同时过滤掉了可忽略的噪声。在实践中,我们的目标是识别时间序列趋势中的一些先前提到的模式。

在时间序列分析中,使用三个基本成分来建模和理解数据中的潜在模式:趋势、季节和残差成分。这些成分有助于将时间序列分解为其组成部分,使其更容易分析和准确预测数据:

  • 趋势成分:它代表了时间序列中的长期、系统性和通常平滑的运动或方向。它反映了数据在较长时间内的潜在、持续的变动或增长(增长趋势)或下降(下降趋势)。趋势成分旨在捕捉时间序列的整体行为,对于理解其基本轨迹至关重要。

  • 季节成分:它解释了时间序列中遵循固定和已知周期的重复模式或波动。这些模式以固定的时间间隔重复,如每日、每月、每季度或每年。季节性通常与外部因素有关,如天气、假日或商业周期,并且随着时间的推移具有可预测的重复性。

  • 残差成分:这个成分,也称为误差或噪声,代表了时间序列数据中的随机波动或未解释的变异性。它包括趋势和季节成分未考虑的所有信息。分析残差成分有助于识别数据中的不规则性、异常值或意外事件。

从数学上讲,一个时间序列(Y**t)可以表示为这三个成分的总和。将时间序列分解为这些成分是时间序列分析的基本步骤。一旦分离,分析师可以单独对每个成分进行建模,应用适当的统计技术,并做出更准确的预测。这种分解有助于理解数据的潜在动态,并为决策和预测提供有价值的见解。

让我们看看时间序列建模的不同方法以及如何从这些类型的数据中提取知识。

从顺序数据中提取统计数据

时间序列数据代表在一定时期内收集的一系列测量值。这些测量值与一个特定变量相关联,并且以固定的时间间隔获得。时间序列数据的一个基本特征是其固有的顺序,沿着时间线的观察排列传达了重要的信息。改变序列可以完全改变数据的含义。在更广泛的范围内,顺序数据包括任何按顺序呈现的数据,包括时间序列数据。

我们的主要目标是开发能够捕捉时间序列数据或任何顺序数据中潜在模式的模型。这些模型在描述时间序列模式的基本方面起着关键作用。它们使我们能够探索过去数据如何影响未来,检查数据集之间的相关性,进行未来预测,或根据特定指标控制变量。为了直观地表示时间序列数据,我们通常使用折线图或柱状图。时间序列数据分析在各个领域得到广泛应用,包括金融、信号处理、天气预报、轨迹预测、地震预测以及任何处理时间数据的领域。

在时间序列和顺序数据分析领域,我们构建的模型必须考虑数据顺序并提取相邻数据点之间的关系。现在,让我们探索一些用于分析时间序列和顺序数据的 MATLAB 代码示例。

在 MATLAB 中将数据集转换为时间序列格式

时间序列代表在连续时刻或时间间隔收集的现象观察序列,通常是均匀间隔或一致持续时间,尽管不一定如此。认识到时间在时间序列分析中起着基本作用至关重要。首先,我们需要提高处理描述特定现象长期观察的数据的熟练度。我们的第一步将涉及学习如何将观察序列转换为时间序列数据,然后对其进行可视化。

在 MATLAB 中,为了充分处理时间序列数据,我们可以使用timetable对象。时间表是一种专门为处理时间序列数据设计的表格形式。类似于常规表格,时间表按列存储数据变量,允许存储各种数据类型和大小,只要它们具有相同的行数。除了这种灵活性之外,时间表还提供针对时间相关操作的特殊函数,使跨一个或多个时间表对带时间戳的数据进行对齐、组合和计算成为可能。

时间表中的行时间由 datetime 或 duration 值组成,这些值作为单个行的标签。您可以通过行时间和变量来访问和操作时间表。要访问时间表中的特定元素,您可以使用圆括号*()检索子表或花括号{}*提取其内容。此外,您可以使用各自的名称引用变量和行时间向量。为了识别和注释时间表中的事件,您可以将其与事件表关联起来。事件表包含事件时间的记录、相应的事件标签以及与事件相关的其他详细信息。

首先,我们将看看如何从这样的数据中创建时间表。假设我们已经在时间表中存储了关于河流流量在不同时间测量的数据。除了存档之外,时间表还提供了与指定时间同步数据的功能。此外,我们还可以记录时间,以便添加更多关于测量条件和要测量的其他变量的信息。因此,我们可以将时间与工作区中存在的变量关联起来。变量中包含的值成为对象行的时刻。所有其他输入参数成为时间相关的变量。让我们学习如何格式化时间表数据:

  1. 首先,我们必须创建包含变量的向量,从时间向量开始:

    TimeData = datetime({'01.01.1871';'01.01.1872';'01.01.1873';
    '01.01.1874';'01.01.1875'});
    TempData = [22.1;21.1;23.2;21.9;22.5];
    RiverFlow = [1120;1160;963;1210;1160];
    

    首先,我们有测量时间,然后是此时此地测量的温度值,最后是单位为 108 立方米的河流流量值。为了设置时间格式,我们使用了datetime()函数:datetime 数组包含与每个记录时间点相关的年、月、日、小时、分钟和秒组件信息,遵循前瞻性 ISO 日历系统。此外,datetime 数组提供了灵活的输出和输入文本格式,支持存储精确到纳秒的分数秒,并具有处理时区、夏令时和闰秒等考虑的属性。

  2. 使用的数据经过校正并添加到时间向量中,格式与数据类型兼容。现在,我们可以使用timetable()函数来创建对象:

    NileRiverFlow = timetable(TimeData, TempData, RiverFlow);
    
  3. 在 MATLAB 工作区中创建了一个新的时间表对象。我们可以如下检查对象的类型:

    class(NileRiverFlow)
    ans =
        'timetable'
    
  4. 为了理解timetable()函数如何处理数据,我们将按照如下方式打印创建的对象:

    NileRiverFlow
    NileRiverFlow =
      5×2 timetable
         TimeData      TempData    RiverFlow
        ___________    ________    _________
        01-Jan-1871      22.1        1120
        01-Jan-1872      21.1        1160
        01-Jan-1873      23.2         963
        01-Jan-1874      21.9        1210
        01-Jan-1875      22.5        1160
    
  5. 时间线也可以基于某些参数的特定值构建。例如,我们可以使用 MATLAB 工作区中已存在的RiverFlow变量,将其每个值与在特定时间线上定义的特定时间值关联起来。例如,我们可以定义时间步如下:

    NileRiverFlow2 = timetable(RiverFlow,'TimeStep',years(1),
    'StartTime',years(1870));
    

我们将TimeStep设置为一年,将StartTime设置为 1870 年。通过这样做,RiverFlow的一个值与从 1870 年开始的一年增量关联到一个新的一年。

理解时间序列切片

切割和切块是两个在数据集上下文中使用的表达,表示将大量数据集分割成更小的部分或从不同角度考察以获得更深入见解的过程。这些术语从烹饪术语中借鉴而来,描述了厨师必须熟练执行的两种基本刀工技术。切割涉及切割,而切块则涉及将食物切成细小的均匀部分,通常连续进行。在数据分析中,切片和切块的概念通常包括将大型数据集系统地分解成更易于管理的部分以提取更多信息。

在 MATLAB 中,时间表是一种特殊的表格形式,它将特定的时间与每一行关联起来。您可以通过各种方法有效地提取其数据的时间相关子集,例如识别指定范围内的时刻或匹配重复的时间间隔。

在学习了如何从工作区中的变量创建时间表对象之后,我们可以学习如何将外部文件导入 MATLAB 作为时间表对象:

  1. 我们将使用在探索时间序列数据的基本概念部分使用的.csv文件。我指的是Nile.csv文件;我们可以使用以下命令导入此文件:

    NileRiverFlowData = readtimetable('Nile.csv');
    

    现在,让我们学习如何访问这种特定类型的数据。您可以使用点符号来检索时间表的行时间。此外,您可以通过单独使用点符号来访问特定变量,或者使用其名称来访问时间表中的所有数据,就像我们刚才做的那样。

  2. 要显示时间序列对象的头两行,我们可以使用以下命令:

    NileRiverFlowData(1:2,:)
    

    以下数据被打印出来:

    NileRiverFlowData(1:2,:)
    ans =
      2×1 timetable
           time       Nile
        __________    ____
        01.01.1871    1120
        01.01.1872    1160
    
  3. 要仅访问一个变量的数据,我们可以使用点符号,如下所示:

    NileRiverFlowData.Nile(1:2)
    
  4. 使用NileRiverFlowData.Variables语法检索整个时间表数据作为矩阵。此语法依赖于时间表的第二维名称,并且与通过花括号索引访问所有内容功能相同:

    NileData = NileRiverFlowData{:,:};
    

    然而,需要注意的是,生成的矩阵没有包含行时间,因为行时间向量被视为时间表中的元数据,而不是作为变量处理。在时间表数据无法有效地连接到矩阵的情况下,将生成错误消息。

  5. 要定位特定范围内的数据,您可以使用timerange函数,该函数为索引建立基于时间的子脚本。例如,您可以设置一个从 1880 年 1 月 1 日开始,到 1920 年 1 月 1 日结束的范围。需要注意的是,默认情况下,timerange函数定义了一个半开区间,包括左端点但排除右端点:

    TimeRange = timerange('01.01.1880','01.01.1920');
    
  6. 现在,我们可以从这个范围中切割出数据集的一部分,如下所示:

    DataTimeRange = NileRiverFlowData(TimeRange,:);
    

新数据集包含从 1880 年 1 月 1 日开始到 1919 年 1 月 1 日结束的数据。

在 MATLAB 中重采样时间序列数据

让我们看看如何在 MATLAB 中重采样时间序列数据。这项任务涉及更改数据的频率或时间间隔,同时保留关键信息。这可以用于各种目的,例如将数据聚合到更粗的时间尺度,将数据插值到更细的时间尺度,或将来自不同来源的数据与公共时间网格对齐。MATLAB 提供了多种函数和方法来重采样时间序列数据。以下是一个基本示例,说明如何进行操作。

我们首先使用 retime() 函数,如下所示:

WeeklyData = retime(NileRiverFlowData,'weekly','spline');

此函数在处理与重复或不规则时间条目相关的问题的同时,对时间表内的数据进行重采样或合并。retime() 函数通过结合初始数据中的变量生成时间表,并强制行时间保持一致的时间步长。此函数根据指定方法在初始变量内对数据进行重采样或合并。retime() 可以应用于从不同时间戳的初始值插值数据值,将数据聚合到时间间隔内,消除时间表中具有重复时间戳的行,并通过施加由新 时间步长 定义的有规律行时间,将不规则时间表转换为规则时间表。

在此示例中,我们通过添加从月度开始的每周数据来重采样数据集,但重采样数据的方法有很多种。我们根据相邻行进行数据值插值。输入时间表必须按顺序排序且行时间唯一是至关重要的。有四种不同的插值类型可用:

  • linear:线性插值

  • spline:分段三次样条插值

  • pchip:形状保持的分段三次插值

  • makima:修改后的 Akima 三次样条插值

使用相同的函数(retime())可以聚合时间序列数据。retime() 函数提供了聚合选项,包括平均值。例如,我们可以对给定数据按月计算平均值:

MonthlyData = retime(NileRiverFlowData,'monthly','mean');

以这种方式,我们使用平均值作为聚合标准,对先前重采样的每周数据进行聚合。

移动平均

移动平均是分析时间序列数据常用的方法。它涉及计算在特定窗口或时间间隔内移动的时间序列中的数据点的平均值。这有助于平滑波动并突出数据中的潜在趋势。移动平均有不同类型,例如简单移动平均SMA)和指数移动平均EMA),每种都有其特点和用例。

简单移动平均(SMA)是分析时间序列数据的基本且广泛使用的方法。它是一种统计计算,有助于平滑数据中的波动,以识别趋势或模式。以下是计算 SMA 的方法:

  1. 选择一个特定的周期或窗口。

  2. 对于每个数据点,计算该时间窗口内数据点的平均值。这涉及到在所选周期内累加值,然后除以该窗口内数据点的数量。

  3. 将窗口向前移动一个时间步长并再次计算平均值。重复此过程,直到每个数据点。

结果是一系列平均值,代表所选周期内数据趋势。SMA 常用于各种目的,包括识别趋势、平滑时间序列数据中的噪声以及进行预测。例如,如果您想计算 10 天的 SMA 来分析每日股价,您将计算最后 10 天的收盘价,以得到每天的移动平均值。这个移动平均可以帮助您识别这 10 天内股价趋势的一般方向。

在 MATLAB 中,您可以使用movmean()函数计算时间序列的 SMA,该函数可在 Statistics and Machine Learning Toolbox 中找到。让我们通过一个实际示例来学习如何使用movmean()函数:

  1. 我们将首先定义 SMA 的窗口大小:

    windowSize = 5;
    

    我们定义了一个五年的窗口来计算移动平均。

  2. 现在,我们可以计算移动平均:

    SMA = movmean(NileRiverFlowData.Nile,windowSize);
    

    movmean()函数为 k 点邻域生成一个局部平均值数组。每个平均值是通过在数组的相邻元素上滑动长度为k的窗口来计算的,A。如果k是奇数,则窗口围绕当前位置的元素中心。对于k的偶数值,窗口围绕当前位置和前一个元素中心。当数组端点元素不足以填充窗口时,窗口大小会自动调整。在这种情况下,平均是根据窗口内适合的元素计算的。结果数组,表示为M,与数组A保持相同的维度。当A是一维向量时,movmean()沿着向量的长度进行处理。对于多维数组,movmean()沿着A的第一个维度操作,而不考虑大小为 1。

EMA 是移动平均的一种变体,它更重视最近的数据点。与 SMA 相比,这种特性使其对短期价格波动更敏感。要计算 EMA,请遵循以下步骤:

  1. 选择一个特定的周期,通常表示为N

  2. 计算乘数,通常被称为“平滑因子”或“加权乘数”。这通常计算为2 / (N + 1)

  3. 从第一个数据点的 EMA 开始,这通常是前N个数据点的 SMA。

对于后续数据点,使用以下公式计算 EMA:

EMA(current) = (Price(current) − EMA(previous)) * Multiplier + EMA(previous)

在这里,我们有以下内容:

  • EMA(current) 是当前数据点的指数移动平均

  • Price(current) 是当前时间资产的定价

  • EMA(previous) 是前一个数据点的指数移动平均

  • Multiplier 是在步骤 2中计算的平滑因子

EMA 给最近的数据点分配更多的权重,因此它对价格变化的反应比 SMA 更快。它通常用于技术分析,以识别金融市场(如股票、货币和商品)中的趋势和潜在的反转点。交易员和分析员经常使用不同的 EMA 周期来分析短期和长期趋势。

例如,MATLAB 提供了movavg()等函数来计算各种类型的移动平均,包括 EMA。您可以使用此函数在 MATLAB 中计算 EMA。请记住,movavg()函数需要使用金融工具箱。

我们首先定义移动平均的类型,然后定义窗口大小并计算 EMA:

type = 'exponential'
windowSize = 5;
EMA = movavg(NileRiverFlowData.Nile,type,windowSize)

EMA 也会在特定的时间窗口内计算平均值,但它会给最近的数据点分配更多的权重。它对较旧的数据点给予指数递减的权重。EMA 对数据中的最近变化反应更敏感。它对价格变化反应迅速,这使得它适合短期趋势分析和捕捉价格反转。

指数平滑

指数平滑是一种时间序列预测方法,它基于过去的观察来预测未来的数据点。它特别适用于具有趋势或季节性成分的数据。指数平滑给过去的数据点分配指数递减的权重,最近的观察值获得最高的权重。EMA 和指数平滑都是用于时间序列分析以捕捉趋势和模式的技术。然而,它们在公式和应用上有所不同。EMA 是指数平滑的一个子类型,通过在计算中赋予最近的数据点更大的权重来更加重视它们。EMA 的数学表达式明确包括一个平滑参数(alpha),提供了一种简单的方法来调整最近与较老观察值的影响。相反,指数平滑是一个更广泛的概念,包括各种平滑技术,其中 EMA 是一个具体的实例。虽然 EMA 需要初始值进行计算,但通常指数平滑需要初始值,这个初始值会显著影响整个平滑过程。

指数平滑有几种变体,包括以下几种:

  • 简单指数平滑法(SES):这种方法用于没有趋势或季节性的单变量时间序列数据。它使用单个平滑参数(alpha)为过去的观察值分配权重。下一期的预测是最近一次观察值和前一次预测的加权平均值。

  • 霍尔特线性指数平滑法:这种方法用于具有线性趋势但没有季节性的数据。它通过引入两个平滑参数,alpha 用于水平,beta 用于趋势,扩展了 SES。它分别计算水平和趋势,并使用它们进行预测。

  • 霍尔特-温特斯指数平滑法:这种方法用于具有趋势和季节性的数据。它通过添加一个用于季节成分的第三个平滑参数 gamma,扩展了霍尔特的线性指数平滑法。它模拟并预测水平、趋势和季节成分。

指数平滑的基本思想是对过去的观察值赋予指数递减的权重,给予近期数据更多的重要性,并使方法能够适应数据模式的变化。指数平滑在时间序列预测应用中得到了广泛的应用,如销售预测、需求预测和金融市场预测。

双重平滑和三重平滑是时间序列分析的高级技术,建立在指数平滑的基础上。双重平滑通过引入一个额外的平滑级别来处理趋势,同时引入趋势平滑参数和数据平滑参数。这种方法增强了模型捕捉和有效预测趋势的能力。三重平滑,或称霍尔特-温特斯方法,通过引入季节性成分更进一步。它包括数据平滑、趋势平滑和季节性平滑的参数,使其特别适用于具有一致模式的时间序列数据。这些技术提供了捕捉和预测复杂趋势和季节性变化的细微工具。

在 MATLAB 中,您可以使用与时间序列分析和预测相关的函数和库来实现各种类型的指数平滑。这些函数通常提供估计平滑参数和基于您的数据进行预测的工具。让我们更详细地看看:

  1. 我们首先定义平滑参数(alpha):

    alpha = 0.3;
    
  2. 我们可以根据需要调整alpha0 < alpha <= 1)。之后,我们必须使用第一个数据点初始化预测:

    forecast = NileRiverFlowData.Nile(1);
    
  3. 最后,我们必须计算 SES 预测:

    for I = 2:length(NileRiverFlowData.Nile)
        forecast(i) = alpha * NileRiverFlowData.Nile (i) + (1–- alpha) * forecast(i–- 1);
    end
    

    现在,我们可以显示预测结果:

    disp(forecast);
    

alpha参数控制平滑水平,较低的值使预测对近期数据更敏感,而较高的值使预测更平滑。

在本节中,我们分析了从时间序列中提取信息的某些统计方法。现在,让我们看看一个实际案例,其中我们使用循环网络预测一家公司股票的表现。

实现预测股市的模型

预测股市走势是一项复杂且具有挑战性的工作。它涉及分析各种因素和数据点,以预测股价的未来走势。基本面分析师会考察公司的财务状况,包括其收入、盈利、债务水平和增长前景。他们还会考虑可能影响整体市场的宏观经济因素,如利率、通货膨胀和政府政策。技术分析师研究历史价格和成交量数据,寻找股票图表中的模式和趋势。他们使用移动平均线、支撑和阻力水平以及各种技术指标来做出预测。识别当前市场趋势和理解市场周期可以为潜在的未来走势提供洞察。牛市、熊市和横盘市场会对股价产生不同的影响。预测本质上是不确定的,风险管理至关重要。分散投资组合、设置止损订单和使用适当的位置规模可以帮助管理预测相关的风险。

一些交易者和投资者使用机器学习和 人工智能AI)算法来分析大量数据,并识别市场中的潜在模式或趋势。股市预测的范围可以从短期(几天或几周)到长期(几年)。选择将取决于投资策略和目标。重要的是要记住,过去的股市表现并不能保证未来的结果。市场条件可能会迅速且不可预测地变化。股市预测涉及财务分析、技术分析、情绪分析和考虑各种外部因素的组合。虽然一些投资者和交易者可能会将预测作为其决策过程的一部分,但必须谨慎对待,并保持投资组合的多元化以有效管理风险。

在本节中,我们将深入探讨应用 L****ong short-term memoryLSTM)模型来预测一家知名公司:特斯拉公司(Tesla Inc.)的未来股价。这是一家由埃隆·马斯克(Elon Musk)、JB Straubel、Martin Eberhard、Marc Tarpenning 和 Ian Wright 于 2003 年创立的美国 电动汽车EV)和清洁能源公司。总部位于加利福尼亚州的帕洛阿尔托。

为了评估特斯拉的股价表现,我们将利用从 2010 年 11 月 6 日到 2023 年 10 月 5 日的股票价格数据,这些数据来自纳斯达克 GS 股票报价。如果需要,也可以调整时间范围,超出默认间隔。

数据是从 Yahoo! Finance 网站获取的:finance.yahoo.com/quote/TSLA

图 9*.2* 展示了 Yahoo! Finance 网站的截图:

图 9.2 – Yahoo! Finance 网站

图 9.2 – Yahoo! Finance 网站

此 CSV 文件包含以下属性:

  • 日期:报价日期

  • Open: 开盘价

  • High: 最高价

  • Low: 最低价

  • Close: 调整了拆股后的收盘价

  • Adj Close: 调整了红利和拆股后的收盘价

  • Volume: 交易量

CSV 文件中的信息被标记为TSLA.csv。首先,让我们调查将此数据导入 MATLAB 工作空间的过程:

  1. 我们将使用以下命令以时间表格式导入数据:

    TeslaData = readtimetable('TSLA.csv');
    

    如往常一样,我们应该在包含TSLA.csv文件的文件夹中,或者将此文件夹添加到 MATLAB 路径中。

  2. 在开始使用 LSTM 方法进行数据预测之前,我们将从探索性分析开始,以了解数据分布并提取初步知识。为了从导入的数据集中获得初步洞察,我们可以使用summary()函数:

    summary(TeslaData)
    

    打印出以下结果:

    summary(TeslaData)
    RowTimes:
        Date: 157×1 datetime
            Values:
                Min         2010-11-01
                Median      2017-05-01
                Max         2023-10-06
    Variables:
        Open: 157×1 double
            Values:
                Min        1.4627
                Median      16.87
                Max         386.9
        High: 157×1 double
            Values:
                Min        1.6993
                Median       18.8
                Max         414.5
        Low: 157×1 double
            Values:
                Min        1.4033
                Median     15.798
                Max         326.2
        Close: 157×1 double
            Values:
                Min        1.5927
                Median     16.795
                Max        381.59
        AdjClose: 157×1 double
            Values:
                Min        1.5927
                Median     16.795
                Max        381.59
        Volume: 157×1 double
            Values:
                Min       1.1783e+08
                Median    1.8456e+09
                Max       7.0888e+09
    

    返回了数据的摘要,其中包含数据集中所有变量的统计数据。例如,我们可以读取记录数(157)以及所有变量的最小值、中位数和最大值。根据初步分析结果,很明显,特斯拉的股价在过去 13 年中经历了显著的变化。具体来说,最小值是1.5927,而最大值达到1.5927,而最大值达到381.59。

  3. 在查看数据集内容后,我们的下一步是进行初步的视觉探索性分析,其中我们将生成股票价格随年的图形表示:

    plot(TeslaData.Date, TeslaData.Close)
    xlabel('Time (years)')
    ylabel('Stock price ($)')
    

    下面的图表将被绘制(图 9.3.3):

图 9.3 – 特斯拉公司 2010 年至 2023 年的股价

图 9.3 – 特斯拉公司 2010 年至 2023 年的股价

检查前面的图表显示,随着时间的推移,价格有显著的增长。从 2020 年开始,这种增长呈现出指数趋势。让我们深入了解特斯拉股票随时间记录的波动情况。

  1. 通过考察现象的时间序列图以及在不同时间点之间进行强度比较,探索现象的演变变得很有趣。这涉及到计算从一个时期到另一个时期的强度变化。此外,分析连续时期之间现象变化趋势也可以提供有价值的见解。

    我们将时间序列表示为Y1,...,Yt,...,Yn。如时间序列分析部分所述,时间序列反映了变量的实验观察的按时间顺序记录。这个变量可以包括各种元素,如价格趋势、股票市场指数、价差和失业率。本质上,它是一个时间顺序数据点的序列,我们试图从中提取洞察力来描述观察到的现象并预测未来的值。

    为了测量两个不同时间点之间的变化(称为tt + 1),我们可以计算以下比率:

    Y t+1 − Y t _ Y t

    这个指数通常被称为“百分比变化”,代表一个百分比比率。它具体表示现象Y在时间t + 1相对于先前时间t的百分比变化率。利用百分比变化方法可以更准确地描绘数据在指定时间段内的演变情况。

    这种方法不仅应用于监控个别证券和主要市场指数的价格,还用于比较各种货币的价值。在准备包含比较财务报表的资产负债表时,通常会在不同时间点包括特定资产价格,并附上那些时期内的相应百分比变化。

  2. 要在 MATLAB 中计算百分比变化,我们可以使用以下代码:

    PctCh=100*diff(TeslaData.Close(:,1))./TeslaData.Close(1:end-1,1);
    

    diff() 函数计算数组沿第一维度的连续元素之间的差异,其中该维度的尺寸不等于 1。

  3. 我们可以将得到的结果绘制成条形图,以查看差异在时间上的分布情况:

    bar(TeslaData.Date(1:end-1,1),PctCh)
    xlabel('Time (years)')
    ylabel('Percentage changes ($)')
    

    图 9*.4*显示了多年百分比变化的条形图:

图 9.4 – 多年百分比变化

图 9.4 – 多年百分比变化

股票市场的百分比变化在提供有价值的见解和执行各种功能方面起着至关重要的作用。例如,百分比变化使投资者和分析师能够衡量特定时期内个别股票、投资组合或整个市场指数的表现。这有助于评估投资的价值是增长还是下降。理解百分比变化有助于投资者评估与特定股票或资产相关的波动性和风险。通常认为百分比波动较大的股票是风险较高的投资。

  1. 在计算百分比变化之后,我们可以继续到回报概念;回报是指投资者从股票投资中实现的利润或损失。回报通常以百分比表示,并代表投资在特定时期内的价值变化。

  2. 在 MATLAB 中计算股票价格回报涉及计算特定时期内价格的变化百分比。我们刚刚将股票价格数据加载到 MATLAB 中作为一个矩阵。我们检查了数据是否按时间顺序组织。之后,我们计算了从一期到下一期的股票价格百分比变化。现在,我们可以计算各种类型的回报,如价格回报(资本收益)或总回报(包括收入)。对于价格回报,只需简单地将百分比变化相加,如下所示:

    PriceReturn = sum(PctCh);
    

    得到了以下结果:

    fprintf('Price Return: %.2f%%\n', PriceReturn);
    Price Return: 698.80%
    

    这是从特斯拉股票市场中获得的一个很好的回报,对于那些在过去三年持有股票的人来说是非常出色的。

  3. 我们的目标是利用此数据集中的数据,根据 .csv 文件中提供的信息预测特斯拉的股价。为了训练网络,我们需要输入和输出数据。输入由数据集中的数据定义。因此,我们必须生成输出。我们将通过假设我们的目标是根据时间 t 的信息预测时间 t + 1 的特斯拉股价来实现这一点。因此,我们将建立以下公式:

    输入 = TeslaData . Close(t)

    输出 = TeslaData . Close(t + 1)

    这是一个序列到序列的回归问题,例如深度学习方法,其目标是预测一个连续值的序列作为输出,给定一个输入数据的序列。它常用于时间序列预测、自然语言处理和其他输出为数值序列的问题。在此上下文中,模型学习将输入序列映射到输出序列,输入和输出序列的长度可以不同。

  4. 循环网络具有记忆,这种记忆通过定义时间步长来保留。时间步长决定了在训练期间计算权重更新梯度时,考虑过去多少步。在此上下文中,我们设定 TimeStep = 1。让我们根据这个假设准备数据:

    XData=TeslaData.Close(1:end-1);
    YData=TeslaData.Close(2:end);
    

    在此代码中,XData 代表输入变量,相当于时间 t 的数据,而 YData 表示后续时期的输出值,即时间 t + 1 的数据。

    为了解决这类问题,我们可以使用 LSTM 网络。LSTM 是一种旨在解决训练传统 RNN 时可能出现的梯度消失问题的 循环神经网络(RNN)架构。LSTM 模型在处理和预测数据序列方面特别有效。它们围绕记忆细胞的概念构建,这些细胞可以在长序列中存储信息。这些记忆细胞具有学习和记住模式的能力,使它们非常适合涉及序列数据的任务。这些任务包括时间序列分析、自然语言处理和语音识别。

    理想滞后值的选择应基于自相关图和领域知识。为了评估 LSTM 模型的性能,应考虑长序列(更多滞后)。即使对于滞后值为 1 的自回归模型也能表现良好。

    LSTM 模型有三个基本的门,它们控制着网络内部的信息流动:

    • 遗忘门:这负责决定从先前的细胞状态中应该遗忘还是保留哪些信息

    • 输入门:这决定了哪些新信息应该存储在细胞状态中

    • 输出门:这调节从细胞状态输出的信息

    单元状态在 LSTM 的顶部水平运行,充当传送带,允许信息从一个时间步流向另一个时间步。门控帮助调节信息流入和流出单元状态。

  5. 我们首先设置一些参数:

    TrainLength = length(TeslaData.Close)-1;
    numHiddenUnits = 200;
    
  6. 之后,我们必须构建深度网络的结构:

    layers = [ ...
        sequenceInputLayer(TrainLength)
        lstmLayer(numHiddenUnits,'OutputMode','sequence')
        fullyConnectedLayer(50)
        dropoutLayer(0.5)
        fullyConnectedLayer(TrainLength)
        regressionLayer];
    

    使用了六层:

    • sequenceInputLayer:序列输入层接收序列数据,在将其馈送到神经网络之前执行数据归一化。

    • lstmLayer:作为 RNN 的一部分,LSTM 层专门用于捕捉时间序列和序列数据中的长期依赖关系。该层促进加性交互,有助于在训练过程中在较长的序列上增强梯度流。传递了两个参数:隐藏单元的数量和作为序列的输出模式。提供了一个参数:隐藏单元的数量,也称为隐藏大小,表示为正整数。该参数决定了层在时间步长内保留的信息量,封装在隐藏状态中。隐藏状态可以包含所有先前时间步长的数据,无论序列长度如何。隐藏单元数量的过度增加可能导致训练数据过拟合。此外,输出模式指定为两个值之一:sequence,它产生整个序列作为输出,和last,它为序列的最后一个时间步长生成输出。

    • fullyConnectedLayer:全连接层将输入与权重矩阵相乘,然后结合一个偏置向量。

    • dropoutLayer:这在训练过程中用于正则化。它通过在每个正向和反向传递过程中随机将一部分输入单元设置为 0 来帮助防止过拟合。这鼓励网络学习更稳健和通用的特征。

    • fullyConnectedLayer:网络中的最后一个全连接层通常用于根据前一层学习到的特征进行预测。

    • regressionLayer:这是一个用于深度学习回归任务的层。回归任务涉及预测连续数值,与涉及预测类别或类别的分类任务不同。regressionLayer专门设计用于回归问题,并且在神经网络中常用于诸如预测股价、房价、温度预测以及各种其他数值预测等任务。regressionLayer负责在训练期间计算神经网络生成的预测值与实际目标值之间的损失。它使用损失函数来衡量预测值与真实值之间的差异。在回归任务中常用的损失函数包括均方误差MSE)、平均绝对误差MAE)和 Huber 损失等。

  7. 之后,我们必须指定训练选项:

    maxEpochs = 600;
    miniBatchSize = 20;
    options = trainingOptions('adam', ...
        'MaxEpochs',maxEpochs, ...
        'MiniBatchSize',miniBatchSize, ...
        'InitialLearnRate',0.01, ...
        'GradientThreshold',1, ...
        'Shuffle','never', ...
        'Plots','training-progress',...
        'Verbose',0);
    

    作为优化算法,我们设置了 Adam 优化器,这是一种在训练深度神经网络中广泛使用的优化算法。它以其能够高效处理非平稳目标、高维参数空间和噪声梯度信息的能力而闻名。Adam 结合了 RMSprop 优化器和基于动量的方法的优点。我们还设置了训练轮数:一个轮次是整个训练数据集的一次完整遍历。训练可能会根据验证性能提前停止,以避免过拟合。我们为优化器设置了一个适当的学习率。你可能需要尝试不同的学习率,以找到最适合你问题的那个。

  8. 现在,我们可以训练网络:

    net = trainNetwork(XData,YData,layers,options);
    

    以下结果被打印出来(图 9*.5*):

图 9.5 – LSTM 训练过程

图 9.5 – LSTM 训练过程

  1. 现在,我们可以使用这个网络来预测股票的表现。每个值将从上一个值开始预测,时间步长为 1:

    YPred = predict(net,XData,'MiniBatchSize',1);
    
  2. predict()函数通过使用一个训练良好的深度学习神经网络来预测结果。为了评估预测的性能,我们可以使用均方根误差RMSE),其计算方法如下:

    RMSE = sqrt(mean((YData-YPred).²));
    

    RMSE 是统计学和机器学习中广泛使用的度量标准,用于量化预测值和实际值之间误差或差异的平均幅度。它计算预测值和真实值之间平方差的平均值的开方。RMSE 作为评估预测模型准确性或预测质量的一种手段。

    以下值被返回:

    RMSE =
       13.9792
    
  3. 为了欣赏基于 LSTMs 的模型的预测能力,让我们绘制特斯拉股票的表现图,并将其与我们模型的预测进行比较:

    plot(TeslaData.Date(2:end), YData,TeslaData.Date(2:end), YPred,'--')
    xlabel('Time (years)')
    ylabel('Stock price ($)')
    legend('ActualData', 'PredictedData')
    

    以下图形被打印出来(图 9*.6*):

图 9.6 – 实际值与预测值

图 9.6 – 实际值与预测值

我们可以在情况没有发生重大变化的时间段中欣赏预测的优良性。相反,在证券波动最大的时间段中,我们注意到一定的偏差,这表明为了做出正确的预测,有必要考虑更多的信息。

现在,让我们看看当我们必须处理不平衡数据时我们能做什么。

在 MATLAB 中处理不平衡数据集

在机器学习中处理不平衡数据集是一个常见的挑战,尤其是在分类任务中,其中一个类别显著多于其他类别。处理不平衡数据集至关重要,因为在这种数据上训练的模型可能会表现出对多数类别的偏差,并且在预测少数类别时表现不佳。

理解过采样

过采样是一种通过增加少数类实例的数量来处理数据集中类别不平衡的方法。其目的是平衡类别分布,防止机器学习模型偏向多数类。当少数类的数据有限时,过采样特别有用。过采样有多种方法,包括以下几种:

  • 随机过采样:在随机过采样中,你随机选择并复制少数类的实例,直到类别分布平衡。这种方法简单直接,但可能会引入重复数据点而导致过拟合。

  • 合成少数过采样技术SMOTE):SMOTE 是一种流行的过采样方法,为少数类创建合成样本。它通过选择一个少数类实例及其k个最近邻来实现。然后,它沿着连接所选实例及其邻居的线段生成合成数据点。SMOTE 有助于防止过拟合,并且可能比随机过采样更有效。

  • 自适应合成采样ADASYN):ADASYN 是 SMOTE 的扩展,旨在为在分类中更具挑战性的少数类实例生成额外的合成样本。它考虑数据的分布,并为不同的实例分配不同的权重。

  • 边界-SMOTE:边界-SMOTE 是 SMOTE 的一种变体,它专门针对少数类和多数类之间的边界附近的实例。它为这些边界实例生成合成样本,以提高分类性能。

  • 少数合成过采样技术MSMOTE):MSMOTE 是 SMOTE 的扩展,它考虑了少数类实例的密度。它根据数据点的局部密度生成合成样本。

  • 带噪声的随机过采样:这种技术涉及在随机过采样过程中向复制的实例添加少量随机噪声。这有助于减少过拟合。

  • 信息过采样:信息过采样方法考虑领域知识或数据的特定特征来指导合成样本的生成。

过采样方法的选择取决于你的数据集特征和你要解决的问题。尝试不同的技术,并使用适当的指标(例如,F1 分数、精确率-召回率曲线等)评估对模型性能的影响,通常对于确定特定用例中最有效的过采样策略是必要的。需要注意的是,过采样可能并不总是最佳解决方案,你还应该考虑其他技术,如欠采样、成本敏感学习以及集成方法,以有效地解决类别不平衡问题。

探索欠采样

欠采样是一种技术,通过减少多数类中的实例数量来解决数据集中的类别不平衡问题。目标是创建一个更平衡的类别分布,这有助于机器学习模型避免对多数类的偏差。当你在多数类中有大量数据且希望避免过采样少数类可能出现的潜在过拟合问题时,欠采样可以是一种有用的方法。在探索欠采样时,以下是一些需要考虑的关键点:

  • 随机欠采样:在随机欠采样中,你随机选择并从多数类中移除实例,直到类分布平衡。这种方法简单,但可能导致有价值的数据丢失。

  • 聚类质心欠采样:聚类质心欠采样涉及对多数类实例进行聚类,并从每个簇中选择一个代表质心来形成更小的数据集。这种方法在多数类中保留了多样性,并且不太可能移除有信息的数据。

  • Tomek 链接:Tomek 链接是来自不同类别的实例对,它们彼此靠近但被错误分类。移除 Tomek 链接的多数类实例可以帮助改善类别之间的边界。

  • 编辑最近邻ENN):ENN 识别并从多数类中移除与它们的邻居在类别标签上不一致的实例。ENN 可以帮助减少多数类中的噪声样本。

  • 单侧选择:单侧选择结合了 Tomek 链接和 ENN。它使用 Tomek 链接来识别问题实例,然后使用 ENN 来移除它们。

  • NearMiss 欠采样:这种方法根据距离度量选择与少数类实例最近的多数类实例。NearMiss 算法确保所选的多数类实例接近少数类,从而有助于改善类别分离。

  • 信息欠采样:信息欠采样方法考虑领域知识或数据的特定特征来指导从多数类中选择实例。

在探索欠采样时,考虑各种方面很重要。首先,选择最适合您数据集的欠采样方法。您选择的方法应取决于您数据的性质、您试图解决的问题以及可能对模型性能的影响。此外,欠采样可能会导致信息丢失,特别是如果大多数类别包含重要的数据点。在应用此技术时要谨慎,并考虑您是否可以获得更多少数类数据或探索其他方法,如过采样、成本敏感学习或集成方法。请记住,使用适当的指标评估您的模型性能,并尝试不同的方法以找到最适合您特定用例的最佳解决方案。例如,假设您有一个包含 10,000 笔信用卡交易的数据集,其中只有 100 笔是欺诈的。在这种情况下,您可能会对非欺诈交易进行欠采样,以创建一个更平衡的数据集。您可以选择随机选择,例如,500 笔非欺诈交易,从而得到一个包含 500 笔非欺诈和 100 笔欺诈交易的新数据集。

发现成本敏感学习

成本敏感学习是一种机器学习方法,它考虑了分类问题中不同类别错误分类的变动成本。在传统的机器学习中,所有错误分类都被同等对待。然而,在许多实际应用中,将一个类别错误分类可能比将另一个类别错误分类有更严重的后果或更高的相关成本。成本敏感学习的目标是优化模型以最小化这些特定成本。

成本敏感学习与处理类别不平衡相关,但又有区别。虽然类别不平衡关注类别的分布不均,但成本敏感学习考虑了错误分类的相关成本。成本敏感学习通常涉及使用成本矩阵,这些矩阵指定了不同类型错误分类的成本。这些矩阵为假阳性、假阴性、真阳性和真阴性分配了不同的成本。

在成本敏感学习中,分类的决策阈值可以调整以最小化预期成本。这意味着模型在预测时可能会更加保守或不太保守,这取决于成本矩阵。各种机器学习算法可以适应处理成本敏感学习。一些算法允许您指定特定类别的错误分类成本。例如,在决策树或集成方法中,您可以根据其成本为类别分配权重。

当处理成本敏感学习时,考虑反映模型成本效益的评估指标很重要,例如加权 F1 分数或成本敏感的精确度和召回率的版本。成本敏感学习通常应用于异常检测问题。在这种情况下,你希望检测罕见且可能代价高昂的事件,例如金融交易中的欺诈检测。

请记住,成本敏感学习涉及权衡。降低一种类型错误的成本可能会增加另一种类型错误的成本。在设计成本矩阵时需要仔细考虑和领域知识。在分类错误成本不均匀的情况下,成本敏感学习是一种有价值的方法,它可以帮助优化针对特定实际应用的机器学习模型。它是决策系统中不同错误后果可能显著不同的关键技术。

摘要

在本章中,我们探讨了数据分析与预测建模领域的一些关键概念。我们首先讨论了时间序列数据的基础,这指的是在一定时期内收集的数据,并包含顺序性。然后强调从这种顺序数据中提取统计信息是分析和理解数据中模式的重要步骤。

本章还强调了实现一个预测股票市场数据的模型的实施。这涉及到使用各种技术和算法来分析历史股票市场数据,识别模式和趋势,并对未来股价进行预测。

最后,本章讨论了在 MATLAB 中处理不平衡数据集的挑战。不平衡数据集指的是数据集中类别的分布严重倾斜的情况,这使得难以准确训练模型。我们讨论了在 MATLAB 编程环境中处理不平衡数据集的方法和策略。

总体而言,本章重点介绍了理解和分析时间序列数据的重要性,提取有意义的统计信息,实现股票市场数据的预测模型,以及解决 MATLAB 中不平衡数据集的挑战。

在下一章中,我们将了解推荐系统的基本概念,如何在数据集中识别相似用户,以及如何使用 MATLAB 实现推荐系统的实际案例。最后,我们将了解模型压缩、剪枝和量化,以便在边缘设备上进行高效的推理。

第十章:MATLAB 推荐系统工具

推荐系统是一种旨在预测特定用户偏好的模型。当应用于电影领域时,它转变为电影推荐引擎。这个过程涉及通过预测用户的潜在评分来过滤数据库中的项目,并促进用户与数据集中最合适内容的连接。这具有重要意义,因为在庞大的目录中,用户可能无法发现所有相关内容。有效的推荐可以增强内容消费,并且像 Netflix 这样的主要平台高度依赖它们来维持用户参与度。在本章中,我们将学习推荐系统的基础概念以及如何使用 MATLAB 构建网络入侵检测系统NIDS)。

在本章中,我们将涵盖以下主要主题:

  • 介绍推荐系统的基本概念

  • 在数据中寻找相似用户

  • 使用 MATLAB 创建用于网络入侵检测的推荐系统

  • 部署机器学习模型

技术要求

在本章中,我们将介绍基本的机器学习概念。为了理解这些主题,需要具备代数和数学建模的基本知识。您还需要具备 MATLAB 的实际操作能力。

要使用本章中的 MATLAB 代码,您需要以下文件(可在 GitHub 上找到,网址为github.com/PacktPublishing/MATLAB-for-Machine-Learning-second-edition):

  • CreditCardData.xlsx

  • CreditCardFraudDet.m

  • NDISdata.csv

  • NDISEnsemble.m

介绍推荐系统的基本概念

推荐系统是一种旨在根据用户的偏好、历史行为或其他相关因素向用户建议物品或内容的信息过滤系统。这些系统在各种在线平台上被广泛使用,以帮助用户发现产品、服务、内容等。推荐系统涉及两个主要实体:用户物品。用户是生成推荐的个体,而物品是要推荐的产物、内容或服务。这些物品可以包括电影、书籍、产品、新闻文章等。

推荐系统依赖于捕捉用户和物品之间交互的数据。这种交互数据可以包括用户评分、购买历史、点击、查看、点赞以及任何其他形式的用户与物品的互动。

有不同类型的推荐系统:

  • 协同过滤CF):CF 方法基于其他用户的偏好和行为进行推荐。

  • 基于内容的过滤:这种方法根据物品的属性和用户的历 史偏好向用户推荐物品。它侧重于物品的内容和描述。

  • 混合推荐系统:这些系统整合了各种推荐技术,以提供更准确和多样化的推荐。

理解 CF

CF 是一种流行的技术,在推荐系统中使用,根据用户的交互和行为以及类似用户的行 为,为用户做出个性化推荐。CF 假设过去以相似方式与物品交互的用户在未来将会有相似 的偏好。

此外,CF 主要有两种类型:

  • 基于用户的:这种类型的 CF 根据与目标用户相似的用户偏好和行为向用户推荐物品。计算目标用户与系统中所有其他用户之间的相似度得分。常见的相似度指标包括余弦相似度或皮尔逊相关系数。识别出一组与目标用户最相似的邻居用户。推荐目标用户的邻居已经交互过但目标用户尚未交互过的物品。

  • 基于物品的:这种类型的 CF 根据用户过去交互过的物品的相似性向用户推荐物品。它根据用户交互计算系统中所有物品对之间的相似度。常见的相似度指标包括余弦相似度和 Jaccard 指数。对于目标用户,它可以识别出他们已经交互过的物品。它可以推荐与用户交互过的物品相似的物品。

CF 矩阵通常很稀疏,因为用户只与可用物品的一小部分进行交互。通过在数据中找到潜在因素,如矩阵分解等技术可以帮助解决这一问题。随着用户和物品数量的增加,用户-用户或物品-物品相似度的计算变得更加昂贵。为了可扩展性,需要进行优化。CF 在为新用户或几乎没有交互历史的物品做出推荐时可能会遇到困难。通常使用基于内容的推荐或混合模型等技术来解决这个问题。

CF 通常依赖于用户行为数据,这引发了隐私问题。可以使用差分隐私等隐私保护方法来保护用户信息。使用各种指标来评估 CF 算法的性能,包括 平均绝对误差MAE)、均方根误差RMSE)以及基于排名的指标,如精确率和召回率。

CF 已被广泛应用于各种领域的推荐系统,包括电子商务、电影和音乐推荐、社交网络等。虽然它能够有效地捕捉用户偏好,但它确实存在一些局限性,例如冷启动问题和需要足够的用户交互量。将 CF 与其他推荐技术相结合的混合方法可以克服一些这些局限性。

基于内容的过滤解释

基于内容的过滤是一种推荐技术,在推荐系统中用于根据物品的特征和用户偏好为用户提供个性化推荐。与依赖于用户-物品交互的协同过滤(CF)不同,基于内容的过滤专注于物品的内容,并试图将其与用户档案相匹配。

系统中的每个物品都由一组特征或属性描述。这些特征可以根据领域广泛变化,可能包括如流派、关键词、演员、导演(对于电影)、作者(对于书籍)等。对于基于文本的内容,可以使用自然语言处理技术提取关键词或主题。系统为每个用户维护一个用户档案或偏好向量,它反映了他们对不同特征或属性的偏好。这个用户档案是基于用户互动过的物品或明确评分构建的。

为了为用户生成推荐,系统计算用户档案与物品特征之间的相似度得分。相似度得分通常使用余弦相似度、词频-逆文档频率TF-IDF)或其他距离度量技术来计算。具有最高相似度得分的物品被推荐给用户。这些是符合用户历史偏好和兴趣的物品。

基于内容的过滤在提供个性化推荐方面非常有效,因为它根据物品特征考虑了个人用户的偏好。它不依赖于用户间或物品间的比较,因此适合新用户或互动较少的用户。推荐的质量很大程度上取决于物品描述和特征的准确性和丰富性。请注意,确保高质量的元数据至关重要。

虽然基于内容的过滤擅长推荐用户之前互动过的物品,但与 CF 相比,它可能不会在推荐中引入太多的偶然性或新颖性。如果关于其特征有足够的信息,它还可以帮助解决新物品的冷启动问题。许多推荐系统将基于内容的过滤与 CF 或其他推荐技术相结合,以提高推荐质量并解决每种方法的局限性。

基于内容的过滤在新闻推荐、音乐推荐和电子商务等各个领域被广泛使用,用于建议产品。当正确实施时,它可以根据个人用户的偏好和需求提供有价值的推荐。

混合推荐系统

混合推荐系统是结合多种推荐技术以提供更准确和多样化推荐的推荐系统。这些系统旨在利用不同推荐方法的优势,如 CF、基于内容的过滤等,同时减轻它们的弱点。混合推荐系统在多种应用中普遍使用,以提高推荐质量并解决个别方法的局限性。

在加权混合系统中,不同的推荐技术被分配权重,这些权重决定了它们对最终推荐的影响。例如,如果历史用户交互更为关键,可能会给 CF 分配更高的权重,而对于项目特征的内容过滤则分配较低的权重。通过结合每种技术的得分并按其重要性加权,生成推荐。

在切换混合系统中,推荐方法根据某些条件或用户特征动态选择。例如,如果一个用户有大量的交互历史,可能会使用 CF,但如果他们是一个历史记录很少的新用户,可能会采用基于内容的过滤。在此方法中,不同推荐技术生成的特征或得分被组合,以创建用于项目或用户的统一特征向量。然后,使用任何单一推荐方法利用这个组合特征向量生成推荐。

级联混合系统使用一个推荐技术的输出作为另一个推荐技术的输入。例如,基于内容的过滤可能被用来生成一组初始推荐。这些推荐可以通过 CF 进一步优化以提高准确性。

在元级混合系统中,不同的推荐方法独立应用,并且它们的输出通过元学习器或元分类器进行组合。元学习器将个别推荐方法的输出作为输入,并提供最终的推荐。可以使用决策树、神经网络或集成方法如堆叠等机器学习算法作为元学习器。

在数据分析和使用户画像的领域,寻找相似用户的过程具有重大意义。让我们深入了解用于在数据集中识别和分类具有相似模式和行为的用户的技巧和方法。

在数据中寻找相似用户

欺诈一直以各种形式普遍存在,但新技术的出现,如虚拟智能VI),扩大了欺诈活动的途径。在当今世界,使用信用卡和借记卡进行购买已成为标准,因此,与这些支付方式相关的欺诈正在增加。这种欺诈的后果不仅影响商家和银行,他们通常承担着财务负担,而且影响范围更广。

当客户成为欺诈的受害者时,他们可能会发现自己被银行征收更高的利率,因为他们可能被归类为高风险客户。此外,欺诈事件可能会损害商家的声誉和形象。如果客户在交易过程中遭遇欺诈,这可能会侵蚀他们对卖家的信任,可能促使他们在未来的购买中寻求竞争对手的替代品。

给定一组信用卡交易数据,欺诈识别是识别新交易是否属于欺诈交易或合法交易的过程。这样的系统不仅应该能够检测欺诈交易,而且应该以成本效益的方式完成。

通过不同的方法对交易进行分类分析,以下建议了两种具体的方法:

  • 用户级别分析

  • 单个交易分析

这两种方法代表了独特的策略,每种方法都有其自身的优势和局限性。每种方法都包含某些假设,这些假设的有效程度各不相同。无论如何,这两种方法都可以产生有价值的成果。在某些情况下,选择这些方法之间的差异取决于可用数据的性质,因为它可能不允许采用替代方法。

在单个交易级别分析交易是指一种方法,其中交易的分类是由其与数据集中所有其他交易的关系决定的。可以采用各种机器学习算法来完成这项任务。例如,考虑k-最近邻k-NN)算法,该算法根据交易与数据集中其他交易的相似性来分类交易。如果一个交易与已知的欺诈交易非常相似,那么它很可能被归类为欺诈交易,反之,则被视为合法交易。这种机制通过利用同一类对象之间的相似性来识别数据模式。

在最近邻算法中,通过检查训练集中的所有数据并将记录分配给与最近元素相同的类别来对记录进行分类。其基本假设是在多维空间中,如果两个记录“接近”,它们很可能属于同一类别。为了衡量这种接近性,重要的是要采用距离度量。一个例子是欧几里得距离,或者更广泛地说,Minkowski 度量,正如我们在第四章中介绍的,聚类分析和 降维

最近邻规则导致了一种称为Voronoi 划分的空间划分。训练集中的每个元素都划定了这样一个区域,其中模式将被分类到相同的类别。为了增强这种机制的鲁棒性,一种方法是通过考虑 k 个最近的记录来分类一个记录。然后,该记录可以被分配到在所选示例中具有最大代表性的类别。为了减少对 k 的选择的敏感性,每个记录可以根据其与要分类的元素的距离,通过一个加权方案对分类做出贡献。为了使此过程有效,属性必须具有一致的价值尺度,这通常需要在数据预处理阶段进行先前的归一化。让我们学习如何构建信用卡欺诈检测系统:

  1. 如同往常,我们将首先将数据导入 MATLAB 工作空间。为此,我们将使用信用卡欺诈检测数据集,该数据集包含匿名信用卡交易,被分类为欺诈或合法:

    CreditCardData = readtable('CreditCardData.xlsx');
    

    数据集仅由数值输入变量组成,这些变量来自 PCA 转换。在特征中,V1V28代表通过 PCA 获得的主成分。Class特征作为响应变量,在欺诈情况下值为1,否则为0。为了了解数据的分布情况,我们可以计算class列中的出现次数:

    NumOcc = groupcounts(CreditCardData.Class)
    NumOcc =
            3992
             492
    

    groupcounts()函数提供了表示为T的表或时间表的分组变量的独特组合。它还提供了每个组内的成员数和相应的数据百分比,范围从0100。组是根据包含在groupvars中的变量的行建立的,这些行具有相同的唯一值组合。结果表中的每个条目都对应于一个单独的组。

    数据集在其中一个二进制类别上是不平衡的,我们在评估结果时应考虑这一点。在机器学习中,当一个类别显著多于其他类别时,对不平衡数据进行分类是一个常见的挑战。主要类别(多数类别)通常占主导地位,这使得模型难以正确预测少数类别。

    为了检查数据的分布情况,我们可以绘制特征的箱线图:

    boxchart(CreditCardData{:,1:28})
    xlabel('features')
    ylabel('values')
    

    下面的图形将被输出(图 10*.1*):

图 10.1 – 特征的箱线图

图 10.1 – 特征的箱线图

图 10**.1的分析中,我们可以看到变量是偏斜的。我们还可以看到其中一些变量存在潜在的异常值。建议进行数据缩放。请记住,在训练机器学习模型之前对数据进行标准化或归一化是一种最佳实践。通过缩放,数据的单位被标准化,这使得比较来自不同来源或位置的数据变得更容易。

  1. 数据缩放,也称为数据归一化或标准化,是机器学习和数据分析中的预处理技术,涉及将数据转换到标准化的范围或分布。数据缩放的主要目的是使你的数据集中的不同特征或变量可比较,并帮助机器学习算法表现更好。

    在缩放和标准化之间进行选择取决于你的数据集的具体要求和计划使用的机器学习算法。一般来说,建议对特征应用数据缩放,以防止某些变量主导学习过程,尤其是在对特征尺度敏感的算法中,如 kNN 或支持向量机。

    数据缩放有助于提高优化算法的收敛性,使特征更易于解释,并且还可以提高某些机器学习模型的性能。然而,需要注意的是,并非所有算法都需要数据缩放,有些情况下数据的自然尺度是有意义的,不应被改变。是否缩放数据应谨慎考虑你的具体问题和数据集的特征。

    我们将执行范围在-11之间的标准化:

    DataScaled = rescale(CreditCardData{:,1:28},-1,1);
    

    范围在-11之间的标准化,也称为具有特定范围的 min-max 缩放,是一种数据缩放方法,将你的数据转换到-11的范围内。当你想要标准化数据同时保持负值可能性时,这种方法很有用。

    为了检查我们执行数据缩放后数据的分布情况,我们可以绘制特征的箱线图:

    boxchart(DataScaled)
    xlabel('features')
    ylabel('values')
    

    下面的图表显示的是(图 10.2):

图 10.2 – 缩放数据的箱线图

图 10.2 – 缩放数据的箱线图

现在,很明显数据已经被缩放,以便我们拥有相同的存在区间。

  1. 在基于机器学习的模型训练之前,进行数据拆分是必要的。数据拆分是指将数据集划分为用于训练、测试和验证的单独子集的过程。我们将执行训练-测试拆分,这涉及将数据集分为两部分,通常为 70-30 或 80-20 的拆分。较大的部分用于训练模型,而较小的一部分用于测试其性能:

    n = length(CreditCardData.Class);
    SplitData = cvpartition(n,'Holdout',0.3);
    TrainIndex = training(SplitData);
    TrainData = DataScaled(TrainIndex,:);
    TestIndex = test(SplitData);
    TestData = DataScaled(TestIndex,:);
    

    我们通过使用length()函数获取数据集中观察值的数量来启动这个过程。此函数返回数组X中最大维度的尺寸,在向量的上下文中,这个尺寸对应于元素的总数。随后,我们使用了cvpartition()函数来创建数据集的随机分区。这个分区是构建基本训练集和测试集的基础,这些集对于评估统计模型至关重要。为了从原始数据集中提取训练数据索引和测试数据索引,我们使用了trainingtest对象函数。然后,将这些索引应用于提取相应的数据子集。

  2. k-NN 是一种多用途算法,不仅用于分类和回归任务,还用于推荐系统。它可以适应构建基于 CF 的推荐系统。我们将使用fitcknn()函数,如下所示:

    WeightedKNNModel = fitcknn(...
        TrainData(:,1:28), ...
        TrainData(:,29), ...
        'Distance', 'cosine', ...
        'Exponent', [], ...
        'NumNeighbors', 10, ...
        'DistanceWeight', 'SquaredInverse');
    

    以下参数被传递:

    • TrainData(:,1:28)

    • TrainData(:,29)

    • 余弦(该表达式表示观察值之间夹角的余弦的补数,将它们视为向量):

      • Minkowski 距离指数

      • 要找到的最近邻数量:10

      • 距离加权函数:SquaredInverseWeight是距离的倒数)

    我们应用了加权 k-NN 算法,这是 k-NN 算法的一种变体,在预测或分类时为邻居分配不同的权重。在传统的 k-NN 中,每个邻居对最终决策的影响是相等的,但在加权 k-NN 中,每个邻居的影响会根据某些因素进行调整,通常是邻居与查询点之间的接近度或相似度。这允许进行更准确和上下文感知的预测。

    我们首先选择一个距离度量来衡量数据点之间的相似度或差异度。我们使用了cosine度量,也称为余弦相似度,这是一种用于确定高维空间中两个非零向量之间相似度的相似度度量。它在各个领域都得到广泛应用,包括信息检索、自然语言处理和推荐系统。cosine度量衡量两个向量之间的夹角的余弦值,它提供一个介于-1 和 1 之间的值,其中 1 表示向量是相同的,0 表示它们是正交的(完全不同),-1 表示它们是相反的。

    算法随后确定k的值,这代表在做出预测时考虑的最近邻的数量。k 的选择取决于你的数据集和你要尝试解决的问题的具体情况。你必须计算查询点(你想要分类或预测的点)与数据集中所有其他数据点之间的距离,然后根据它们与查询点的接近程度或相似性为每个邻居计算权重。常见的分配权重的方法包括逆距离,其中较近的邻居具有更高的权重,或者基于相似性的加权,其中更相似的邻居被赋予更高的权重。你也可以选择具有最高权重的 k 个邻居。这些邻居将对最终预测产生更大的影响。对于分类任务,根据所选邻居中的多数类别将类别标签分配给查询点,权重会影响投票过程。

    这里是使用加权 k-NN 的优点:

    • 加权 k-NN 可以提供更准确的预测,因为它考虑了每个邻居对最终决策的影响。

    • 它允许更好地处理不平衡数据集,其中某些邻居可能比其他邻居更有信息量。

    • 加权 k-NN 在邻居的信息量不均等时尤其有用。

    加权 k-NN 是一种灵活且广泛使用的机器学习技术,可以应用于各种问题,包括分类、回归和推荐系统。它允许你根据数据的具体特征和你要尝试解决的问题调整算法。

  3. 在训练模型后,我们必须评估其性能。我们将首先使用训练好的模型来预测数据标签:

    PredData = predict(WeightedKNNModel,TestData(:,1:28));
    

    在这里,我们使用了predict()函数,它提供了广义线性回归模型产生的预期响应值。

    现在,我们可以评估模型的准确性,这衡量了预测模型的预测与实际或观察到的值匹配的程度。它作为模型在准确预测结果方面性能的指标:

    accuracy = sum(PredData == TestData(:,29)) / length(TestData(:,29));
    fprintf('Accuracy: %.2f%%\n', accuracy * 100);
    Accuracy: 97.03%
    

    结果非常出色,证实了算法和训练参数的选择是正确的。

在网络安全不断演变的领域中,开发有效的网络入侵检测工具至关重要。下一节将探讨如何利用 MATLAB 创建针对增强网络入侵检测能力的先进推荐系统。

使用 MATLAB 创建网络入侵检测的推荐系统

NIDS 作为一种安全机制,用于识别和预防计算机网络中的未经授权的访问、恶意活动和潜在威胁。它涉及监控网络流量并分析它,以识别任何可疑或异常的行为。网络安全检测的主要目标是保护网络免受各种类型的攻击,例如拒绝服务DoS)攻击、恶意软件感染、数据泄露、未经授权的访问和其他网络威胁。

网络入侵检测主要有两种方法:

  • 基于签名的检测:这种方法涉及将网络流量模式与已知签名或已知攻击模式的数据库进行比较。如果找到匹配项,将生成警报通知网络管理员。

  • 基于异常的检测:这种方法侧重于识别偏离正常模式的异常或可疑的网络行为。它使用机器学习算法分析网络流量,并检测可能表明正在进行或即将发生的攻击的任何异常。

NIDS 可以在网络架构的不同级别实现,例如在边界、单个主机或特定网络段内。它们收集和分析网络数据包、日志和其他网络数据,以识别并向系统管理员发出潜在入侵的警报。

以下是一些在网络安全检测中常用的技术:

  • 数据包分析:用于检查单个网络数据包,以识别特定的攻击签名或异常

  • 协议分析:用于分析网络协议,以检测任何异常或未经授权的活动

  • 流量分析:用于监控网络流量模式,以识别任何突然的峰值或异常模式

  • 行为分析:用于分析用户或主机的行为,以检测任何异常或恶意活动

NIDS 在保护计算机网络免受未经授权的访问和潜在威胁方面发挥着至关重要的作用。它们有助于及时识别和应对安全事件,最大限度地减少潜在的损害或数据泄露。

NIDS 推荐系统

在本例中,我们将采用一种新的方法来识别和预防网络攻击:使用推荐系统进行网络入侵检测。传统的 NIDS 依赖于固定的规则和签名来检测已知的攻击模式。然而,攻击者不断进化他们的技术,这使得这些系统难以跟上。通过将推荐系统纳入网络入侵检测过程,可以利用机器学习和数据挖掘技术来增强检测能力。主要目标是利用历史网络流量数据构建一个模型,可以预测特定网络事件是正常还是恶意。

下面是使用推荐系统进行网络入侵检测的工作概述:

  • 数据收集:收集并存储网络流量数据以进行分析。这些数据包括各种网络参数,如 IP 地址、端口号、协议、数据包大小等。

  • 特征提取:从收集的数据中提取相关特征。这些特征可以包括流量量、连接持续时间、数据包头部和其他有助于了解网络行为的特征。

  • 数据预处理:收集到的数据经过预处理以消除噪声、处理缺失值并归一化特征。这一步骤确保数据适合分析。

  • 训练推荐系统:预处理后的数据用于训练推荐系统算法,例如协同过滤(CF)、矩阵分解或关联规则挖掘。此算法学习数据中的模式和关系。

  • 构建推荐模型:训练好的算法基于网络流量数据生成推荐模型。此模型可以识别正常网络行为并检测任何偏离。

  • 实时监控:然后使用推荐模型实时监控传入的网络流量。它分析网络事件并预测它们是否正常或可能恶意。

  • 警报生成:当推荐模型检测到潜在的恶意网络事件时,它会触发警报以通知网络管理员。警报可以包括有关检测到的攻击类型和推荐的对策的信息。

  • 持续学习:推荐模型可以通过结合新数据和调整其检测能力来随着时间的推移不断更新自己。这确保了系统能够有效对抗新兴威胁。

总体而言,使用推荐系统进行网络入侵检测提供了一种更动态和自适应的方法来识别网络攻击。它利用机器学习技术从历史数据中学习并智能预测网络的安全状态。这可以通过减少误报并检测新兴攻击模式来提高网络安全操作的正确性和效率。

在 MATLAB 中使用推荐系统进行 NIDS

在这个实际示例中,我们将使用集成方法构建采用推荐系统的 NIDS。集成方法是结合多个单个模型以形成一个更强大、更准确的预测器的技术。这些单个模型,也称为基础模型或弱模型,可以是任何类型,例如决策树、支持向量机或神经网络。通过结合这些基础模型的预测,集成方法旨在提高模型的整体性能和泛化能力。以下是一些流行的集成方法:

  • Bagging:Bagging,即自助聚合,涉及在不同的训练数据子集上训练多个基础模型,并带有替换。通过平均或投票各个模型的预测来做出最终的预测。

  • Boosting:Boosting 算法按顺序训练基础模型,每个后续模型更关注先前被错误分类的样本。通过加权投票或平均将多个模型的预测组合起来,以做出最终的预测。

  • 随机森林:随机森林是一种集成方法,它结合了袋装和决策树。通过多数投票将训练在特征随机子集上的多个决策树集成,以形成最终的预测。

  • 自适应提升AdaBoost):AdaBoost 是一种提升算法,它根据训练样本的分类错误分配权重。弱模型迭代训练,每个后续模型更关注被错误分类的样本。通过加权投票将多个模型的预测组合起来,以做出最终的预测。

  • 梯度提升:梯度提升是另一种提升算法,它按顺序训练弱模型,每个后续模型使用梯度下降最小化损失函数。通过加权平均将多个模型的预测组合起来,以做出最终的预测。

集成方法已被证明在各种领域(包括分类、回归和异常检测)中提高预测模型的性能和鲁棒性是有效的。它们在机器学习和数据挖掘应用中得到了广泛的使用。

如同往常,我们首先将数据集导入 MATLAB 环境。我们将使用 Kaggle 数据集仓库中可用的网络入侵检测数据集(www.kaggle.com/datasets/sampadab17/network-intrusion-detection)。该数据集包含在军事网络环境中的多种模拟入侵。目标是创建一个类似于美国空军局域网的现实环境,然后对其进行多次攻击。该环境中的每个连接代表一系列 TCP 数据包,数据在源 IP 地址和目标 IP 地址之间按照预定义的协议流动。每个连接都被分类为正常或攻击,并分配一个特定的攻击类型。连接记录包含大约 100 字节的数据。对于每个 TCP/IP 连接,从正常和攻击数据中收集了总共 41 个特征,包括定量和定性特征。数据集中的类别变量有两个类别——正常和异常:

  1. 我们首先将数据集导入 MATLAB 环境:

    NIDSTrainData = readtable('NDISdata.csv');
    summary(NIDSData)
    

    这个函数会打印出表格的摘要,显示变量的属性描述和一些统计数据,如数值特征的 min、median 和 max。

  2. 正如我们在“在数据中找到相似用户”部分所做的那样,我们必须将数据分成两个子集:训练集和测试集。我们将使用cvpartition()函数来完成这项工作,如下所示:

    n = length(NIDSData.class);
    SplitData = cvpartition(n,'Holdout',0.3);
    TrainIndex = training(SplitData);
    TrainData = NIDSData(TrainIndex,:);
    TestIndex = test(SplitData);
    TestData = NIDSData(TestIndex,:);
    

    我们首先使用length()函数来确定数据集中观察值的数量。这个函数给出了数组X中最大维度的尺寸,在向量的情况下,它代表元素的总数。接下来,我们利用cvpartition()函数将数据集随机分成训练集和测试集。这个分区是评估统计模型的基础。我们使用训练和测试对象函数提取了训练和测试数据的索引,然后使用这些索引获取相应的数据子集。

  3. 现在,是时候为 NDIS 训练算法了。为此,我们将使用基于集成方法的算法:

    predictors = TrainData(:,1:41);
    response = TrainData.class;
    

    我们首先设置了用于训练的数据,并将子集划分为预测变量和响应变量。这些术语在统计分析中用于描述自变量(预测变量)和因变量(响应变量)之间的关系。预测变量是用于预测、解释或说明响应变量变化的变量。它们可以是连续的或分类的,并且可能有各种级别或值。另一方面,响应变量是预测变量预测或解释的变量或结果。它也被称为因变量。在我们的案例中,它是网络入侵检测分类(异常、正常)的标签。

  4. 现在,我们可以训练模型了:

    NDISEnsModel = fitcensemble(...
        predictors, ...
        response, ...
        'Method', 'AdaBoostM1');
    

    作为一种分类方法,我们使用了AdaBoostM1AdaBoostM1,也称为自适应增强,是一种可以用于分类和回归问题的机器学习算法。它在处理复杂数据集和改进弱学习算法方面特别有效。AdaBoostM1背后的基本概念是将多个弱分类器合并成一个健壮的分类器。弱分类器是一个基本模型,其表现略好于随机猜测。AdaBoostM1通过在数据集的不同加权版本上迭代训练弱分类器来实现这一点。AdaBoostM1背后的主要思想是将多个弱分类器结合起来创建一个强分类器。弱分类器是一个简单的模型,其表现略好于随机猜测。AdaBoostM1通过在数据集的不同加权版本上迭代训练弱分类器来实现这一点。

    在每次迭代中,算法会给前一次迭代中错误分类的实例分配更高的权重。这迫使弱分类器优先考虑最具挑战性的实例,增强它们对困难案例的关注。然后,使用加权多数投票方案将这些加权弱分类器组合起来,以做出最终预测。在分类任务中,最终预测是通过根据弱分类器的加权多数投票分配类标签来获得的。在回归任务中,最终预测是通过平均弱分类器的加权预测来获得的。

    AdaBoostM1具有几个优点。它对过拟合具有鲁棒性,可以处理具有许多特征的集合。它还可以通过调整实例的权重来处理不平衡的数据集。此外,AdaBoostM1可以轻松并行化,使其适合分布式计算环境。然而,AdaBoostM1可能对噪声数据和异常值敏感,因为它会给错误分类的实例分配更高的权重。它还需要仔细选择弱分类器,因为过于复杂或过于弱的分类器可能不会产生良好的结果。总的来说,AdaBoostM1是一个强大的算法,已在许多应用中得到广泛应用,包括人脸检测、物体识别和金融预测。

    让我们看看训练好的模型:

    NDISEnsModel
    NDISEnsModel =
      ClassificationEnsemble
               PredictorNames: {1×41 cell}
                 ResponseName: 'Y'
        CategoricalPredictors: [2 3 4]
                   ClassNames: {'anomaly'  'normal'}
               ScoreTransform: 'none'
              NumObservations: 17635
                   NumTrained: 100
                       Method: 'AdaBoostM1'
                 LearnerNames: {'Tree'}
         ReasonForTermination: 'Terminated normally after completing the requested number of training cycles.'
                      FitInfo: [100×1 double]
           FitInfoDescription: {2×1 cell}
    

    模型的某些信息显示在上面的代码中。

  5. 在训练算法后,是时候评估其性能了:

    PredData = predict(NDISEnsModel,TestData(:,1:41));
    

    使用predict()函数获取由广义线性回归模型生成的预期响应值。通过评估模型的准确性,我们可以衡量预测模型的预测与实际观察值的一致性。这种评估作为准确预测结果的性能指标:

    accuracy = sum(strcmpi(PredData,TestData{:,42})) / height(TestData(:,42));
    fprintf('Accuracy: %.2f%%\n', accuracy * 100);
    Accuracy: 99.79%
    

    这些是令人惊叹的结果,证明了集成方法在分类网络入侵方面非常有效。

在数据科学之旅的最终前沿,部署机器学习模型标志着理论实力转化为现实影响的临界阶段。下一节将深入探讨部署机器学习模型的复杂性和最佳实践,确保它们无缝集成到运营环境中。

部署机器学习模型

部署机器学习模型是指将训练好的模型用于对新、未见数据做出预测的过程。这涉及到将训练好的模型集成到生产环境中,使其能够接收输入数据、执行预测并返回结果。训练好的模型需要组织并打包成适合部署的格式。这可能涉及到将模型导出为其他系统可以轻松加载和使用的文件格式。通常创建一个应用程序编程接口API)来公开机器学习模型的功能。该 API 作为其他系统或应用程序可以用来向模型发送数据和从模型接收预测的接口。

如果模型预计要处理许多并发请求,部署环境可能需要扩展以适应增加的负载。这可能涉及到设置服务器集群或使用基于云的基础设施。一旦模型被部署,重要的是要监控其性能和行为,以确保它继续提供准确的预测。监控可能包括跟踪响应时间、吞吐量或错误率等指标,以识别任何问题或性能下降。随着新数据的出现,机器学习模型通常需要更新或重新训练。因此,建立持续集成和交付流程对于轻松部署模型的新版本并确保其保持最新状态非常重要。

理解模型压缩

模型压缩是指在不显著影响性能的情况下减小机器学习模型大小的过程。在模型的大小或计算需求变得关键的情况下,需要模型压缩,例如在部署到资源受限的设备如智能手机或边缘设备上时。

模型压缩有几种技术:

  • 剪枝:剪枝涉及从模型中移除不必要的连接或参数。通常,基于某个阈值,剪除权重较小的连接,从而得到参数更少、更稀疏的模型。

  • 量化:量化是减少模型中权重和激活精度的过程。例如,可以使用 8 位整数来表示权重,而不是使用 32 位浮点值。这减少了内存需求并提高了计算效率。

  • 知识蒸馏:知识蒸馏涉及训练一个较小的“学生”模型来模仿较大的“教师”模型的预测。教师模型的知识被转移到学生模型,从而在保持性能的同时,以紧凑的形式表示原始模型。

  • 低秩逼近:低秩逼近技术旨在使用低秩矩阵或张量逼近模型的权重。这减少了表示模型所需的参数数量,从而减小了内存占用并加快了计算速度。

  • 紧凑架构:这涉及设计或使用紧凑架构,如 MobileNet 或 SqueezeNet,这些架构专门设计为轻量级和高效。

这些压缩技术使模型能够在资源有限的设备上部署或在具有严格延迟或内存约束的场景中使用。然而,考虑权衡是很重要的,因为模型压缩可能会导致准确性或推理速度的轻微性能下降。

发现模型剪枝技术

模型剪枝是一种机器学习技术,旨在通过消除不必要的或冗余的参数、连接或节点来减小训练模型的尺寸和复杂性。模型剪枝的目的是在不显著降低准确性的情况下提高模型的效率和计算性能。

模型剪枝有几种方法,包括以下几种:

  • 权重剪枝:在权重剪枝中,根据其幅度将模型中的单个权重设置为零或完全移除。这减少了参数数量,可以导致模型更稀疏。

  • 神经元剪枝:神经元剪枝涉及根据其对整体性能的贡献从模型中移除整个神经元。具有低激活或对输出影响最小的神经元被剪枝。

  • 滤波器剪枝:这种技术在卷积神经网络CNNs)中常用。滤波器是一组特征检测器,在卷积操作期间应用于图像。滤波器剪枝涉及移除对模型准确性贡献不大的不必要滤波器。

  • 结构化剪枝:结构化剪枝涉及移除整个层或模型块,而不是单个权重或神经元。这种方法通常会导致更高效的实现,因为移除整个层可以减少计算复杂性和内存需求。

模型剪枝可以在训练期间或作为训练后的优化步骤执行。它通常与其他技术(如正则化方法或量化)结合使用,以进一步提高剪枝模型的效率。剪枝可以在模型大小、速度和内存使用方面提供显著的好处,使其成为在资源受限设备或实时应用中部署模型的有用技术。

在 MATLAB 中,您可以使用各种技术和工具(如神经网络工具箱)执行模型剪枝。以下步骤概述了在 MATLAB 中进行模型剪枝的一般方法:

  1. 使用 MATLAB 中的神经网络工具箱加载或创建您的初始神经网络模型。

  2. 训练神经网络模型以在给定的任务或数据集上实现合理良好的性能。

  3. 使用您选择的剪枝算法或技术来识别和从训练模型中移除不必要的权重、连接或节点。常用的剪枝技术包括基于幅度的剪枝、基于敏感度的剪枝和权重衰减剪枝。

  4. 通过在验证或测试数据集上测试来评估剪枝模型的表现。确保剪枝过程不会显著降低模型的表现。

  5. 如果由于剪枝导致性能下降,则对剪枝模型进行微调或重新训练以恢复任何性能下降。调整学习率或其他训练参数以优化剪枝模型的表现。

  6. 重复步骤 3 到 5,直到达到所需的模型压缩或性能权衡水平。

记住,模型剪枝是一个动态和迭代的过程,需要仔细考虑模型大小、性能和计算需求之间的权衡。

如果需要,引入量化以在边缘设备上进行高效的推理

量化是一种用于模型压缩的技术,用于减少深度神经网络的内存占用和计算需求。它涉及将网络的权重和激活从浮点表示转换为较低精度的表示,如 8 位甚至更低。

量化会降低模型的精度,这可能导致模型精度的损失。然而,观察到许多神经网络对量化具有鲁棒性,并且仍然可以用降低精度的表示实现相似的性能。这对于具有大量参数的深度神经网络尤其如此。

在模型压缩中,量化有不同的方法:

  • 仅权重量化:在这种方法中,仅对神经网络的权重进行量化,而激活保持原始精度。这显著降低了内存需求,因为权重通常在神经网络中消耗大部分内存。

  • 全量化:在这种方法中,权重和激活都量化为较低的精度。这进一步降低了内存需求和计算复杂性,但与仅权重量化相比,可能导致模型精度更大的损失。

  • 动态量化:动态量化技术根据输入数据自适应地调整推理过程中的权重和激活的精度。这允许在精度使用上具有更大的灵活性,与静态量化相比,可能导致精度改进。

  • 量化感知训练:不是在训练后量化模型,而是量化感知训练在训练阶段本身结合量化过程。这确保了模型学会对量化具有鲁棒性,并在量化时实现更好的精度。

量化是一种在模型压缩中广泛使用的技巧,尤其在部署到资源受限的设备(如边缘设备或手机)上的深度神经网络时特别有用。它允许以减少内存需求和提高计算效率的方式高效部署模型,而不会牺牲模型精度。

知识蒸馏入门

知识蒸馏是一种在模型压缩中使用的技巧,它指的是减少机器学习模型的大小和复杂度,同时不会在性能上造成重大损失的过程。在知识蒸馏中,一个大的“教师”模型在数据集上训练,并用作参考来训练一个较小的“学生”模型。目标是转移知识,或学习到的表示,从教师模型到学生模型。

知识迁移是通过训练学生模型来模仿教师模型的输出实现的。通常,这涉及到在训练过程中使用教师模型的软目标或 logits,而不是使用硬标签。软目标是指教师模型为每个类别分配的概率,与 one-hot 编码的硬标签相比,可以提供更细致的信息。

在训练过程中,学生模型试图最小化其预测与教师模型提供的软目标之间的差异。这使得学生模型能够从教师提供的更丰富信息中学习,提高其对数据的理解并提高其性能。知识蒸馏可以实现显著的模型压缩,因为较小的学生模型可以捕获较大教师模型的知识,通常参数更少。此外,学生模型在推理时间和资源使用方面可以更高效,使其适合在资源受限的平台部署。

总结来说,知识蒸馏是一种在模型压缩中使用的技巧,用于将较大教师模型的知识转移到较小学生模型,从而在保持性能的同时压缩模型大小。

学习低秩近似

低秩近似是一种在模型压缩中使用的技巧,用于减小给定模型的大小。它涉及到通过低秩近似来近似高维权重矩阵或张量,这显著减少了表示模型所需的参数数量。在低秩近似中,对权重矩阵进行分解,将其分解为两个或更多较小的矩阵或张量。近似的秩决定了使用的较小矩阵或张量的数量。通过选择较低的秩,得到的近似将具有更少的参数,使其更紧凑和高效。

低秩近似可以应用于各种类型的模型,包括神经网络、深度学习模型和其他机器学习算法。它特别适用于减少大型模型的计算和内存需求。这使得它们可以在资源受限的设备上部署,例如移动电话或嵌入式系统。低秩近似的一种常见方法是奇异值分解SVD),它将矩阵分解为三个矩阵,分别代表左奇异向量、奇异值和右奇异向量。选择奇异值及其对应的奇异向量子集,可以创建低秩近似。

低秩近似的其他技术包括 Tucker 分解,它将张量分解为较小的张量,以及张量-训练分解,它将张量表示为一系列矩阵乘积。这些技术可以应用于深度学习模型中通常发现的更高阶张量。

总体而言,低秩近似是模型压缩的一种强大技术,能够在不牺牲太多性能的情况下减少模型大小。它允许在资源受限的设备上高效部署模型,并加快推理时间。

摘要

在本章中,我们学习了推荐系统的基本概念,从这些系统的定义开始,然后了解如何解决这个问题。我们分析了不同类型的推荐系统:协同过滤(CF)、基于内容的过滤和混合推荐系统。

接下来,我们看到了如何利用数据中的相似性来识别可能的信用卡欺诈使用。为此,我们基于最近邻算法训练了一个模型,但使用了一种修改后的传统 k-NN 算法,在预测或分类过程中给邻居分配不同的权重。

然后,我们看到了如何在 MATLAB 中实现基于集成方法的 NIDS。具体来说,我们采用 AdaBoost 算法来识别局域网网络中的入侵行为。

最后,我们介绍了关于模型压缩的机器学习模型部署技术。我们分析了最流行的模型压缩技术,包括剪枝、量化、知识蒸馏和低秩近似。

在下一章中,我们将学习异常检测和故障诊断系统的基本概念。我们将了解如何使用深度学习来识别异常行为,以及如何在 MATLAB 中实现故障诊断系统。最后,我们将探讨 dropout、L1 和 L2 正则化以及提前停止。

第十一章:MATLAB 中的异常检测

在物理系统生命周期的整个过程中,故障或故障的发生对其正常功能构成了潜在威胁。为了防止关键中断,在设施内实施异常检测系统变得至关重要。被称为 故障诊断系统 的这种机制旨在识别被监控系统中的潜在故障。故障检测的追求是维护干预中的关键和定义性阶段,需要系统性和确定性的方法来全面分析可能导致故障的所有可能原因。

在本章中,我们将学习异常检测系统的基础概念以及如何在 MATLAB 中实现异常检测系统。

我们将涵盖以下主要主题:

  • 介绍异常检测和故障诊断系统

  • 使用 机器学习ML)来识别异常功能

  • 使用 MATLAB 构建故障诊断系统

  • 理解高级正则化技术

技术要求

在本章中,我们将介绍基本的机器学习概念。为了理解这些主题,需要具备代数和数学建模的基本知识。同时,也需要熟悉 MATLAB 环境的操作。

要使用本章中的 MATLAB 代码,你需要以下文件(可在 GitHub 上找到:github.com/PacktPublishing/MATLAB-for-Machine-Learning-second-edition):

  • GearboxAccData.xlsx

  • AnomalyDetectGearBox.m

  • DroneFaultDiagnosis.xlsx

  • UAVFaultDiagnosis.m

介绍异常检测和故障诊断系统

异常检测和故障诊断系统是各个行业的关键组成部分,特别是在安全、可靠性和效率至关重要的领域,如制造、医疗保健、金融和网络安全。这些系统旨在识别数据、过程或系统中不寻常或意外的模式、行为或条件,这些可能表明存在故障、缺陷或异常。

深入探讨异常检测领域,本节提供了一个全面的概述,揭示了在识别各种系统和数据集中偏离常规的关键原理和方法。

异常检测概述

异常检测是数据分析与机器学习中用于识别数据集中显著偏离预期或正常行为的数据点或模式的技术。异常,也称为离群值,是不符合大多数数据的数据点,可能表明错误、欺诈、不寻常事件或其他重要信息。异常检测在不同领域有各种应用,如网络安全、工业 质量控制QC)、金融、医疗保健等。

我们可以开始了解不同类型的异常,以了解这个术语的含义,我们将列出一些异常类型:

  • 点异常: 这些是被认为是异常的单个数据点,例如信用卡数据集中的一次单一欺诈交易。

  • 上下文相关异常: 这些是上下文相关的异常。一个数据点本身可能不是异常,但在特定上下文或时间(例如,假日促销期间的网页流量突然增加)中可能是不寻常的。

  • 集体异常: 这些是通过集体检查一组数据点而识别出的异常。这些异常涉及数据点之间的模式或关系。

解决异常检测问题有几种方法,从简单的统计技术到复杂的 ML 算法。所选择的方法取决于数据的性质和您试图解决的特定问题。在此,我们列出最常用的方法:

  • 统计方法: 可以使用诸如 z 分数、百分位数和箱线图等统计技术,根据数据分布的均值或中位数偏差来识别异常。

  • 机器学习(ML): 监督、无监督和半监督的 ML 算法可用于异常检测。一些流行的方法包括隔离森林、单类支持向量机One-Class SVM)、自动编码器AEs)和 k-means 聚类。

  • 时间序列分析: 使用专门的技术来检测时间序列数据中的异常,例如自回归AR)模型、指数平滑和移动平均MAs)。

  • 密度估计: 使用诸如核密度估计KDE)和高斯混合模型GMMs)等方法来估计数据的概率密度函数,并将异常识别为低密度区域。

  • 深度学习(DL): 神经网络NNs),特别是深度自动编码器DAEs)和循环神经网络RNNs),用于在多维数据或序列中进行异常检测。

  • 集成方法: 结合多个异常检测模型可以提高整体性能和鲁棒性。

在解决异常检测问题时,我们必须面对一些挑战。例如,确定定义异常的适当阈值可能具有挑战性。异常罕见的不平衡数据集可能会使模型训练和评估变得棘手。处理高维数据和噪声数据集也可能具有挑战性。

异常检测是识别大型数据集中罕见但可能重要的事件或模式的有价值工具。所选择的方法取决于特定领域、数据特征以及需要检测的异常的性质。

故障诊断系统解释

诊断指的是一种将来自测量参数和收集机器数据的信息转化为对其当前或潜在故障的洞察的过程。这个过程包括分析和综合活动的结合,利用物理测量和机器特定的特性来推导有关机器状态及其未来趋势的有价值信息。这些信息对于评估短期和长期可靠性至关重要。

采用故障诊断技术在确保自动化和自主系统的高安全性和可靠性方面变得越来越重要。事实上,在过去的几年里,全球科学界在开发用于诊断各种系统故障的系统方法上投入了大量的努力。故障诊断系统的首要目标是持续监控系统在运行过程中的状态,以实现三个关键目标:检测故障的存在(故障检测)、确定这些故障的具体位置(故障隔离),以及理解这些故障随时间如何演变(故障识别)。

通常,故障诊断系统的输出提供了一组受故障类型影响的敏感变量,当系统发生故障时,这些变量会进行一些修改。随后,系统从这些故障发生中提取和处理信息,以执行检测、隔离和识别故障的任务。用于故障诊断的技术可以分为三个基本类别:

  • 基于模型的:这种方法依赖于精确的数学模型,能够实现高效的故障检测和诊断。这些模型被构建来描述所审查组件的实际退化过程。这涉及到用物理定律来描述操作条件如何影响资产的性能和寿命。关键变量包括各种热、机械、化学和电气参数。表达它们对机械设备健康的影响是一项具有挑战性的工作,需要那些创建此类解决方案的人具备高度的专业领域知识和建模技能。一旦模型建立,就变得至关重要要有传感器能够提供有关在分析和建模阶段确定的相关量的数据。这些数据作为模型的输入。这种方法的主要优势在于其描述性。它允许对每个输出背后的原因进行详细分析,因为它基于过程的物理表示。这反过来又使得验证和认证成为可能。然而,其准确性高度依赖于领域专家进行的分析和建模的质量。相反,其缺点包括复杂性高、实施成本高,以及对其系统的特异性高,限制了重用和扩展的可能性。

  • 基于知识的:这种方法也依赖于领域专家,旨在直接模拟这些专家的专业知识和行为。目标是使这些专家拥有的知识形式化,使其能够自动复制和应用。专家系统本质上是一种软件程序,它利用从各个领域的熟练人士收集的知识库。然后,这些系统使用推理和推理机制来模拟人类思维过程,为实际问题提供支持和解决方案。实现此类模型最常见的两种技术是规则机制和模糊逻辑。基于规则的途径因其实施简单和可解释性而受到重视。然而,它们可能在表达复杂条件时不足,并且在处理许多规则时可能遭受组合爆炸。另一方面,使用模糊逻辑允许通过更不精确和更不严格的输入来描述系统的状态,简化了形式化和模型描述过程,使其更加直观。与基于模型的方法一样,专家系统的有效性高度依赖于模型的质量和详细程度,从而产生高度特定的解决方案。

  • 基于数据的方法:基于数据的方法将统计和机器学习技术应用于从机器收集的数据,目标是辨别组件的状态。目标是获取关于机械的全面实时信息,通常通过传感器和生产维护活动日志,并将这些信息与单个组件的退化水平或系统的性能相关联。目前,这种方法在实用应用中最为普遍。这归因于它提供的几个优势,使其优于其他两种方法。数据驱动方法需要大量的数据量才能有效。然而,鉴于现代互联传感器的可访问性,通常很容易满足这一需求。与其他方法相比,它们具有一个显著的优势,即不需要深入的专业领域知识,从而减少了专家对模型最终性能的影响。虽然专家见解可以促进输入变量的选择,但它们的影响与其他方法相比较小。此外,机器学习和数据挖掘技术可以发现输入参数和系统状态之间的关系,即使专家事先也可能不知道。基于机器学习的算法可以用来构建预测模型,从而产生特定领域的知识。

开始探索机械与智能的交汇点,本节通过利用机器学习的力量,探讨了一种前沿的故障诊断方法。揭示算法和模型潜力,我们深入探讨了这些技术进步如何使复杂系统中的故障识别更加精确和高效。

使用机器学习进行故障诊断

机器学习算法通过接收到的输入数据自主地从数据中推导知识,消除了对明确开发者指令的需求。在这些模型中,机器独立地识别出实现预期结果所需的模式,这是人工智能AI)的一个标志。在学习过程中,这些算法的特征是系统被提供了一个训练数据集,使其能够估计输入和输出数据之间的关系。这些关系构成了系统推断的模型参数。

选择特定的机器学习模型在很大程度上取决于系统的预期目标。根据目标,问题的性质以不同的方式建模,可以识别出两种主要方法:诊断和预测。诊断系统旨在在故障发生时定位和识别故障。这涉及到对系统的持续监控,当检测到偏离预期行为时发出警报,指定受异常影响的组件,并对异常类型进行分类。

与之相反,预测性维护旨在预测故障是否即将发生或估计其发生的概率。作为一种主动分析,预测性维护可以在干预措施方面显著降低成本,但它代表了一个更复杂的实现目标。另一个可行的选择是对同一系统同时应用诊断和预测解决方案。这种组合提供了两个宝贵的优势:在预测性分析不足的情况下,诊断可以提供支持。这种情况是不可避免的,因为一些故障并不遵循可预测的模式,即使某些故障可以以高精度预测,它们也可能不是在每个实例中都能被识别的。从诊断应用中获得的信息可以作为预测系统补充输入,从而创建更复杂和精确的模型。

根据数据类型,可以使用以下两种方法来解决故障诊断问题:

  • 回归:回归可以作为预测挑战的建模技术。这涉及到在连续时间单位中估计组件的剩余使用寿命。在这种情况下,训练数据集应仅包含经历过故障的组件的数据,从而便于从故障事件开始向前时间标记输入。这种方法仍然遵循监督学习SL)框架,其中输入数据与在此上下文中的连续输出值相关联。

  • 二元分类:最简单的方法是将故障检测视为一个二元分类问题,其中每个代表系统状态的输入必须被分类为两个互斥值之一。在诊断问题解决的情况下,这涉及到确定机器是否正在正确运行或错误运行,将所有可能的状态分类为这两个类别。这个过程与 SL 相一致,因为输入数据与代表模型输出的标签配对。在这种情况下,系统学习识别输入数据与相应标签之间的关系。在预测性分析的情况下,任务转向评估机器是否可能在指定的时间框架内发生故障。这两种含义之间的区别仅在于对标签的不同解释。这意味着相同的模型可以用来解决这两个问题。区别在于在模型训练阶段如何对数据集进行标记。

  • 多类分类:多类分类是对二分类的扩展,引入了更广泛的可用标签供选择。尽管如此,每个输入仍然只关联一个标签。在诊断场景中,扩展采用了一种简单的方法,包括确定机器是否正常运行。在后一种情况下,它涉及到从各种可能性中确定特定的异常状态。在考虑预测性应用时,问题转向确定机器潜在故障前的时间间隔。在这里,标签表示接近故障事件的各个不同间隔。

对于复杂机械故障的精确诊断,通过收集数据、采用先进的信号处理算法进行数据分析,并随后提取适当特征以高效地识别和分类故障,这是至关重要的。数据可以通过各种方法获取,主要是通过测量描述机器在运行期间状态的物理属性。这些测量是通过将物理属性转换为电值的专用传感器获得的,通常被称为传感器数据。

值得注意的是,参数的选择在很大程度上取决于正在审查的特定系统,例如噪声、振动、压力、温度和湿度。通常,在现代自动化工业系统中,必要的诊断数据是 readily available。在数据不可用的情况下,添加额外的传感器成为建立有效的故障识别策略的第一步。此外,数据还可以通过将机器的静态运行条件与特定时间点联系起来来收集,包括材料代码、机器生产速度或正在生产的产品的类型等因素。这类数据被归类为统计数据。

最后,数据可能包括与机器及其组件相关的重大事件和行动的历史,这通常被称为日志数据。这可能包括故障、维修、更换和其他相关活动的记录。

在探讨了故障诊断的基础概念之后,现在是时候实际解决一个模拟问题了。

使用机器学习来识别异常功能

齿轮箱,也称为齿轮机构或传动装置,是一种机械装置,旨在将机械功率从一个组件传递到另一个组件,同时改变转速、扭矩和旋转方向。齿轮箱由一组不同大小和配置的齿轮组成,它们啮合以提供基于所需输出的特定机械优势。

在汽车背景下,齿轮箱,通常被称为变速箱或换挡装置,是控制发动机输出功率和车辆速度的一个关键组件,起着核心作用。齿轮箱中的异常检测涉及识别齿轮组件及其相关系统的异常或不规则行为。在汽车齿轮中检测异常对于确保车辆的安全、可靠性和整体性能至关重要。

为了及时识别齿轮箱中的异常,我们可以使用测量温度、压力、速度和流体水平的传感器来持续收集数据。这些传感器提供了有关齿轮箱状态的宝贵信息。原始传感器数据通常包含噪声和异常值。应用数据预处理技术,如过滤和数据清洗,以确保数据的质量和可靠性。从预处理数据中提取相关特征。这些特征可能包括齿轮啮合模式、旋转速度和温度波动。异常检测通常从建立齿轮箱正常行为的基线模型开始。这是通过分析历史数据来了解典型的工作条件和性能来完成的。

应用了各种异常检测技术来识别与既定正常行为之间的偏差。一些常见的技术包括以下内容:

  • 统计方法:这些方法标记出与平均值显著偏离或遵循不同分布的数据点

  • 机器学习算法:这些模型可以学习识别数据中的模式并检测异常

  • 时间序列分析:对于随时间收集的齿轮箱数据,可以使用时间序列方法,如自回归积分移动平均ARIMA)或长短期记忆LSTM)神经网络来检测异常

异常检测基于预定义的阈值或通过对数据的统计分析。这些阈值在模型训练阶段确定,并且可能随着时间的推移进行调整以优化检测。当检测到异常时,系统可以为车辆操作员或服务技术人员生成警报。这些警报可能包括有关特定异常、其潜在影响以及维护或修理的建议行动。

异常检测是一个持续的过程。齿轮箱的状态持续被监控,数据实时分析以确保及时检测到任何新出现的问题。在汽车齿轮箱中进行异常检测对于预测性维护至关重要,可以预防意外故障,并优化车辆的使用寿命和性能。它是现代汽车诊断和维护系统的一个关键组成部分,尤其是在商业和工业环境中,车辆可靠性至关重要。

在异常检测领域,本节重点介绍逻辑回归作为一种强大的工具的应用。通过深入了解这个统计模型的复杂性,我们发现它在识别数据集中的异常方面的有效性,并通过实际应用揭示了其细微差别。

使用逻辑回归进行异常检测

在这个例子中,我们将使用加速度计捕获的数据,这些加速度计记录了在两种不同的运行条件下齿轮箱的振动:一种表示健康状态,另一种表示损坏状态。为了确保全面覆盖,传感器被放置在相反方向以捕获任何操作差异。这些数据集将作为训练各种旨在分类齿轮箱运行条件的算法的基础。

让我们深入描述一下算法:

  1. 我们首先将数据集导入 MATLAB 环境。该数据集提供了两个传感器记录的振动测量值,以及与之相关的发动机运行分类:0表示损坏状态,而1表示健康状态:

    data = readtable('GearboxAccData.xlsx');
    
  2. 导入了具有20000行和3列的表格。

  3. 为了对数据进行初步的视觉检查,让我们利用图表来协助。例如,我们可以创建盒形图来展示两个传感器检测到的数据分布:

    subplot(1,2,1)
    boxchart(data.state,data.Vib1)
    xlabel('state')
    ylabel('Vib1')
    subplot(1,2,2)
    boxchart(data.state,data.Vib2)
    xlabel('state')
    ylabel('Vib2')
    

    图 11*.1*中看到的图表将被绘制:

图 11.1 – 数据的盒形图

图 11.1 – 数据的盒形图

盒形图作为一种视觉表示,用于通过基本的分散度和位置度量来描述样本的分布。在仔细审查图 11**.1后,可以明显看出两个传感器的数据分布不同。传感器Vib1似乎在故障和正常条件下的振动值之间表现出更大的差异。这意味着故障可能出现在这个传感器的位置。

  1. 在对可用的数据进行视觉分析后,我们需要将数据分割,以便我们可以用它来训练一个异常检测模型。数据分割是构建和评估机器学习模型过程中的一个基本步骤。它涉及将您的数据集分成多个子集,通常包括一个训练集、一个验证集和一个测试集。这些子集在机器学习工作流程中各有特定用途。我们将数据分成两个子集:一个训练集和一个测试集。训练集是您数据中最大的一部分,用于训练机器学习模型。它是模型从中学习并使用来更新其参数的数据集。测试集用于评估最终训练模型的性能。它提供了一个无偏估计,说明模型在未见数据上的表现如何。测试集在模型开发或训练期间不应使用,以避免数据泄露。让我们看看如何进行数据分割:

    n = length(data.state);
    SplitData = cvpartition(n,'Holdout',0.3);
    TrainIndex = training(SplitData);
    TrainData = data(TrainIndex,:);
    TestIndex = test(SplitData);
    TestData = data(TestIndex,:);
    

    我们首先使用length()函数提取了数据集中存在的观测数量:此函数提供了X数组中最广泛维度的尺寸。当处理向量时,这个尺寸对应于元素的总数。之后,我们使用cvpartition()函数为数据集建立了一个随机分区。我们可以利用这个分区来创建训练集和测试集,这对于验证统计模型至关重要。我们使用了两个对象函数,trainingtest,从初始数据集中提取训练数据索引和测试数据索引。然后,我们将这些索引应用于提取数据。

  2. 现在,我们可以构建逻辑回归模型。逻辑回归是一种用于二元分类的统计方法,但它也可以扩展到多类分类。它是一种回归分析方法,用于建模二元结果的概率,通常表示为01。逻辑回归在医学、社会科学、经济学和机器学习等各个领域得到广泛应用。逻辑回归用于预测观测属于两个类别或类别之一的可能性。它不适用于多于两个类别的問題;在这种情况下,使用多项逻辑回归或其他技术。逻辑回归模型使用sigmoid(逻辑)函数将输入特征映射到01之间的概率。逻辑回归是二元分类任务中强大且可解释的方法。它是机器学习和统计学的基础技术,在需要理解输入特征与二元结果概率之间的关系时特别有用。让我们开始训练模型:

    LogRegModel = fitglm(TrainData{:,1:2},TrainData{:,3},
    'Distribution','binomial','link', 'logit')
    

    我们使用fitglm()函数创建逻辑回归模型:此函数提供了一个拟合到表格或数据集数组中变量的广义线性模型。默认情况下,它将最后一个变量指定为响应变量。我们设置了响应变量的二项分布和logit作为链接函数。链接函数*f(μ) = log(μ/(1–μ))与逻辑回归相关联。它将预测变量的线性组合转换为一个概率范围(01)。在这个公式中,(\mu)*代表因变量为1的概率。对数变换将事件发生的概率映射到线性空间中,便于在二元结果背景下建模。由于逻辑函数的范围是(0, 1), 对数优势比跨越整个实数线。这个链接函数在逻辑回归中至关重要,有助于估计概率和预测二元结果。

    分布指的是描述模型中响应变量(因变量)变异性的概率分布。换句话说,它指定了模型对响应变量假设的似然函数的形式。分布的选择基于响应变量的性质和模型的假设。链接函数定义了线性预测量和响应变量期望值之间的关系。我们将线性预测量建模为预测系数的线性组合。链接函数将这个线性预测量转换为响应变量的期望值。

    从训练过程中返回了以下模型:

    LogRegModel =
    Generalized linear regression model:
        logit(y) ~ 1 + x1 + x2
        Distribution = Binomial
    Estimated Coefficients:
              Estimate        SE         tStat      pValue
            __________    _________    ________    _______
    (Intercept)0.00028422   0.016903   0.016814    0.98658
    x1         0.00041526  0.0028803    0.14417    0.88537
    x2         0.00086682  0.004003     0.21654    0.82857
    14000 observations, 13997 error degrees of freedom
    Dispersion: 1
    Chi²-statistic vs. constant model: 0.0608, p-value = 0.97
    
  3. 训练模型后,我们可以使用它来识别异常,从算法以前从未见过的数据开始。为此,我们将使用测试数据集:

    PredY = predict(LogRegModel, TestData{:,1:2});
    

    我们使用了predict()函数;这个函数提供了由广义线性回归模型生成的预测响应值。之后,我们还需要根据阈值获得二元预测:

    threshold = 0.5;
    PredBin = PredY >= threshold;
    
  4. 以这种方式,所有>=阈值的值都被转换为 1,所有>阈值的值都被转换为 0。

  5. 现在我们可以计算模型的准确度。这个术语指的是预测模型的预测与实际或观察值的一致程度。它是衡量模型在做出正确预测方面表现好坏的一个指标:

    accuracy = sum(PredBin == TestData{:,3}) / length(TestData{:,3});
    fprintf('Accuracy: %.2f%%\n', accuracy * 100);
    
  6. 以下结果被打印出来:

    Accuracy: 48.82%
    
  7. 当然不是一个很高的准确度值,这告诉我们一半的预测是错误的。需要一个非线性模型来处理数据中的非线性。逻辑回归作为一个线性模型,无法捕捉因变量和自变量之间的非线性关系。当然,我们可以通过采用另一个算法来提高准确度,正如我们将在下一节中看到的。

让我们继续使用随机森林算法提高准确度。

使用随机森林算法提高准确度

随机森林是一种强大的集成学习算法,用于分类和回归任务。它是Bootstrap AggregatingBagging)算法的扩展,在训练过程中构建多个决策树,并将它们的预测结合起来以提高准确性和减少过拟合。随机森林首先从原始数据集中创建多个随机样本(带替换)。每个这样的样本被称为bootstrap 样本

对于每个 bootstrap 样本,构建一个决策树。这些树通常被称为基础学习器弱学习器。决策树具有以下特征:

  • 随机特征选择:在树的每个节点,考虑一个随机特征子集进行分割,以减少树之间的相关性

  • 有限深度:树通常生长到一定的深度以防止过拟合

  • 无剪枝:随机森林算法通常不剪枝树

对于分类任务,随机森林算法中的每一棵树都会对其预测的类别进行投票。获得最多投票的类别是最终预测。对于回归任务,随机森林算法中的每一棵树都会预测一个数值。最终预测是这些单个树预测的平均值。多数投票(用于分类)或平均(用于回归)导致集成决策。

随机森林包括一种机制来估计模型的准确性,而无需单独的测试集。这被称为袋外误差OOB)。对于每个数据点,它使用仅使用在训练期间未使用此点的树来估计错误率。随机森林可以提供每个特征在数据集中重要性的估计。这是通过测量当某个特定特征的值随机打乱时预测准确性的下降来完成的。

以下列表提供了使用随机森林的关键特性和优势:

  • 随机森林以其强大的泛化性能和对过拟合的抵抗力而闻名

  • 它可以处理分类数据和数值数据

  • 随机特征选择和集成特性使其对噪声数据和异常值具有鲁棒性

  • 随机森林可用于特征选择,因为它提供了特征重要性排名

  • 它无需对超参数进行大量调整即可“即插即用”

  • 它可以用于分类和回归任务

总体而言,随机森林是一种流行且有效的机器学习算法,广泛应用于各种应用,从图像分类和文本分析到金融建模和医疗保健。

为了实现一个用于检测齿轮箱数据异常的自动化系统,我们将使用在使用逻辑回归进行异常检测部分已经使用过的相同数据。请参考以下步骤:

  1. 随机森林涉及自助法,其中我们从数据集中创建多个随机样本(有替换)。我们可以这样做来创建数据的不同子集。我们首先定义以下参数:

    numTrees = 100;
    numSamples = size(TrainData, 1);
    sampleSize = round(0.6 * numSamples);  % Adjust as needed
    
  2. 我们定义了森林中的树的数量(numTrees)、我们将用于训练的观测数(numSamples)和样本大小(sampleSize)。

  3. 我们将传递forest来初始化森林,将数据设置为cell结构:

    forest = cell(numTrees, 1);
    

    现在,我们将使用一个for循环来重复执行一段代码特定次数或遍历一个序列。这将是首先创建一个有替换的随机样本,然后在该样本上训练决策树的必要条件:

    for i = 1:numTrees
        sampleIndices = randi(numSamples, sampleSize, 1);
        X_sample = TrainData{:,1:2}(sampleIndices, :);
        y_sample = TrainData{:,3}(sampleIndices);
        tree = fitctree(X_sample, y_sample);
        forest{i} = tree;
    end
    

    fitctree()函数训练一个用于多类分类的二叉决策树。它使用表中的输入变量和输出响应返回一个训练好的二叉分类决策树。二叉树在分支节点处使用表中的列值形成分割。

    该过程涉及随机选择样本以模拟自助抽样,但随机森林分类器通常为每个决策树选择\( \sqrt{p} \)个特征。在两个特征的情况下,每个决策树在for循环中引入时理想情况下将使用单个特征。因此,在这个场景中,预计不会出现显著的性能提升。

  4. 现在,我们可以使用该模型来测试模型性能:

    numTestSamples = size(TestData, 1);
    RPredY = zeros(numTestSamples, numTrees);
    
  5. 我们计算了测试数据中的观测数,并使用零矩阵初始化预测。

  6. 我们现在可以进行预测:

    for i = 1:numTrees
        tree = forest{i};
        RPredY(:, i) = predict(tree, TestData{:,1:2});
    end
    

    再次使用predict()函数对算法从未见过的数据集进行预测。

  7. 最后,我们将使用准确率来计算模型的性能:

    FinalRPredY = mode(RPredY, 2);
    accuracy = sum(FinalRPredY == TestData{:,3}) / length(TestData{:,3});
    
  8. 我们使用了mode()函数,该函数评估数组中的最频繁值。此函数提供指定维度的元素的模式。在我们的情况下,此函数返回一个列向量,其中包含每行的最常见值。

  9. 返回以下准确率:

    accuracy
    accuracy =
        0.5765
    

    我们获得了所需的改进。

在下一节中,我们将看到如何使用无人机UAV)的声发射数据来实现故障诊断系统的实现。

使用 MATLAB 构建故障诊断系统

技术进步催生了高度智能的飞机,这些飞机可以自主管理飞行操作。这些飞机属于被称为 UAVs 的类别,这意味着它们可以在没有人类飞行员的情况下飞行。UAVs 提供了许多优势,包括与传统有人驾驶飞机相比显著降低的运营成本,能够在不适合人类存在的环境中操作,以及进行及时空中监视的能力,例如在自然灾害期间。

最初主要用于军事目的,UAVs 被用于单调且漫长的监视和侦察任务,以及那些对人类飞行员安全构成风险的脏任务。它们还在人类生命处于危险的危险任务中发挥了关键作用。然而,今天,它们被认为是现代航空的未来。UAV 技术的巨大潜力,其在军事行动中的成功,以及微纳米技术的进步,促使工业界和大学开发出越来越现代化和可靠的 UAV 系统。这些系统可以广泛应用于民用和军事任务。

无人机(UAV)在全球范围内的广泛应用已经凸显出一些未知的问题。虽然使用这些设备的便利性显而易见,但它们也引入了一系列与这项技术相关的挑战和潜在危险。其中引起关注的问题之一是无人机飞行的安全性——如果无人机坠毁会发生什么后果?因此,一个用于识别无人机螺旋桨缺陷的自动系统代表了一个可以保证我们达到可接受安全水平的工具。

在这个例子中,我们将开发一个从声发射测量中诊断无人机螺旋桨故障的算法:

  1. 我们开始将数据集导入 MATLAB 工作空间:

    UAVData = readtable('DroneFaultDiagnosis.xlsx');
    
  2. 有 847 个观测值,32 个特征,31 个预测变量和 1 个二元响应。我们可以使用箱线图来探索数据:

    boxplot(UAVData{:,1:31})
    xlabel('Features')
    ylabel('Leq (dBA)')
    

    下面的图表将显示:

图 11.2 – 预测变量的箱线图

图 11.2 – 预测变量的箱线图

我们可以看到,在图表左侧的低频部分(图 11*.2*)显示了数据中的更多变异性。这告诉我们,低频将使我们能够识别无人机螺旋桨的损坏。由于它们独特的声学特征,低频对于识别无人机螺旋桨的损坏非常有价值。当螺旋桨损坏时,它通常会产生独特的低频振动或声音,这些在较高频率范围内不易察觉。这些低频信号可以表明结构问题,如裂缝、不平衡或变形,这些问题在较高频率范围内可能不那么明显。通过关注低频,您可以提高对与螺旋桨损坏相关的微妙但至关重要的振动的敏感性,为无人机提供更有效的早期检测和预防性维护手段。

  1. 现在,我们必须为模型划分数据:

    n= height(UAVData)
    RandSplitInd=randperm(n);
    DivNum=round(0.7*n);
    TrainData=UAVData(RandSplitInd(1:DivNum),:);
    TestData=UAVData(RandSplitInd(DivNum+1:end),:);
    

    我们首先使用height()函数提取数据的观测值数量,该函数返回表行数。然后,我们使用randperm();这个函数生成一个表示从 1 到n的整数随机排列的行向量,确保没有重复的元素。之后,我们决定将数据分为 70%用于训练集,剩余的 30%用于测试集。最后,我们使用获得的索引将数据集划分为两个子集以训练和测试模型。

  2. 为了检测无人机螺旋桨的故障,我们将使用 SVMs 进行二元分类。SVMs 代表一类监督机器学习SML)模型,应用于分类和回归分析等任务。它们是强大且多功能的算法,在各种应用中表现出色,包括图像分类、文本分类和异常值检测。SVMs 主要设计用于二元分类问题,其目标是将数据点分离成两个不同的类别。分类器找到一个最佳的超平面来分离数据,最大化类之间的边距。边距是超平面和每个类最近的点之间的距离。SVMs 的目标是最大化这个边距,因为更大的边距意味着对未见数据的更好泛化和更强的鲁棒性。

  3. 支持向量分类SVC)和支持向量回归SVR)都是 SVMs 的类型。SVC 用于分类任务,旨在将数据分离成不同的类别,而 SVR 用于回归,预测连续的结果。在两种情况下,SVMs 通过找到最大化不同类别之间边距或拟合回归数据点的最优超平面来工作。它们在处理高维空间中的复杂关系时非常有效,并且是各种机器学习应用中的宝贵工具。

  4. 支持向量是距离决策边界(超平面)最近的数据点。这些点在定义边距和超平面的位置上至关重要。SVMs(支持向量机)的名字就来源于这些支持向量。在二维空间中,超平面是一条将数据分为两类直线的平面。在更高维度的空间中,它是一个超平面。目标是找到最大化边距的同时正确分类尽可能多的数据点的超平面。SVMs 可以通过将输入数据转换到更高维的空间来实现对非线性问题的应用,在这个空间中可以进行线性分离。各种核函数,如多项式核、径向基函数RBF)核和 Sigmoid 核,被用来实现这一点。SVMs 因其能够提供鲁棒性强、泛化能力强的模型而闻名,尤其是在处理高维数据时。SVMs 在机器学习(ML)中得到了广泛应用,并在各种应用中显示出其有效性。虽然它们在许多场景中表现出色,但选择合适的核函数和调整超参数对于它们的成功至关重要。让我们应用 SVM 模型来识别无人机叶片的故障。

    SVMModel = fitcsvm(TrainData{:,1:31}, TrainData{:,32}, 'KernelFunction', 'linear', 'BoxConstraint', 1);
    
  5. fitcsvm()函数训练一个用于分类的 SVM 模型,它可以用于单类或双类(二元)问题,在低维或中维度的预测数据集上。

    以下参数被传递:

    • TrainData{:,1:31}: 模型的训练数据表示为一个表格,其中每一行代表一个观察值,每一列代表一个预测变量。不支持多列变量和非字符单元数组。

    • TrainData{:,32}: 响应变量的名称应提供为字符向量或字符串标量。

    • KernelFunction, linear: 使用 KernelFunction 后跟核函数名称的配对指定用于计算 Gram 矩阵元素的核函数的选择,该名称作为逗号分隔的对提供。以下核函数可用:gaussian, linear,polynomial

    • BoxConstraint, 1: 此参数控制正则化强度。它决定了 SVM 模型愿意容忍多少错误以实现类之间更宽的间隔。较大的 BoxConstraint 值允许对误分类有更大的容忍度,而较小的值则强制对训练数据进行更严格的拟合。

  6. 现在,我们可以使用 SVM 模型对无人机(UAV)的声发射进行故障诊断。我们将使用测试数据集,其中包含算法尚未见过的数据:

    PredY = predict(SVMModel, TestData{:,1:31});
    accuracy = sum(PredY == TestData{:,32}) / length(PredY);
    
  7. 首先,我们使用 predict() 函数检测无人机螺旋桨的故障,然后我们计算了模型的准确率。

    以下结果被返回:

    accuracy
    accuracy =
        0.9055
    

    91% 的准确率是一个非常好的结果。这是证据表明 SVM 是预测无人机螺旋桨可能故障的好选择。

在本章的下一部分,我们将介绍一些防止过拟合并提高算法性能的方法。

理解高级正则化技术

高级正则化技术是机器学习和统计建模中使用的防止过拟合并提高模型泛化性能的方法。当模型过于紧密地拟合训练数据时,会发生过拟合,捕捉噪声和不相关模式,这会导致在未见数据上的性能不佳。正则化技术通过在训练期间对模型参数施加约束或惩罚来鼓励更简单、更通用的模型。

理解 Dropout

Dropout 是一种在神经网络(NNs)中使用的正则化技术,尤其是在深度神经网络DNNs)中,用于防止过拟合。过拟合发生在神经网络学会过于紧密地拟合训练数据时,捕捉噪声并记住特定示例,而不是从数据中泛化。Dropout 是一种简单而有效的方法,可以提高模型泛化性能。

在训练阶段,在每次正向和反向传递时,dropout 会随机“丢弃”(停用)神经网络中的一部分神经元(单元)。这意味着在正向传递期间,某些神经元的输出以一定的概率被设置为零,从而有效地将它们排除在计算之外。dropout 概率是一个超参数,决定了神经元被丢弃的概率。一个常见的值约为 0.5,这意味着每个神经元在训练期间有 50%的概率被丢弃。

dropout 过程在训练期间引入了可变性,因为在每次正向和反向传递中,激活的神经元集合都不同,网络实际上在不同的子网络上进行训练。这种可变性迫使网络学习更鲁棒的特征,并防止它过度依赖任何神经元或特征。在推理或测试阶段(当你使用训练好的模型进行预测时),dropout 通常被关闭。然而,每个神经元的输出都会乘以一个因子1/(1 - p),其中p是训练期间使用的 dropout 概率。这种缩放有助于保持神经元激活的期望值,确保模型的行为与训练期间学习的一致。

dropout 的关键好处如下:

  • 正则化:dropout 通过防止神经网络过度拟合训练数据而充当正则化技术。在多个子网络上的训练鼓励网络更好地泛化到未见过的数据。

  • 减少共适应:dropout 阻止神经元过度依赖其相邻的神经元。这有助于防止神经元的共适应,即某些神经元变得专门化以预测其他神经元的输出。因此,dropout 可以导致更独立和更有信息量的特征。

  • 集成效应:dropout 过程类似于训练具有不同架构的多个模型,这类似于模型的集成。这种集成效应可以提高模型性能。

在实践中,dropout 在深度学习中得到了广泛应用,尤其是在处理大型和复杂的神经网络时特别有效。它是一种简单而强大的技术,用于提高模型泛化能力和减少过拟合,使其成为训练鲁棒深度学习模型的基本工具。

探索模型正则化的复杂性,下一节深入探讨了 L1 和 L2 正则化的不同领域。揭示这些技术的细微差别,我们探讨了它们如何有助于增强机器学习模型的鲁棒性和泛化能力。

探索 L1 和 L2 正则化

L1 和 L2 正则化是机器学习和统计建模中常用的两种技术,通过向损失函数添加惩罚项来防止过拟合。它们鼓励模型具有更小的权重,在 L1 的情况下,可以导致特征选择。

让我们介绍两种典型方法:

  • L1 正则化(Lasso):L1 正则化,也称为 Lasso 正则化,在损失函数中引入了一个与模型系数(权重)的绝对值成正比的惩罚项。从数学上讲,它可以表示如下:

    L1 正则化下的损失 = 原始损失 + λ * Σ|w_i|

    在这里,λ(lambda)是一个控制正则化强度的超参数。

    L1正则化会将模型的一些权重缩小到正好为零。因此,它通过有效地从模型中移除不太重要的特征来执行特征选择。L1正则化在你怀疑只有你的一些特征与预测相关时特别有用。它通过消除不相关的特征,帮助你创建更简单、更可解释的模型。

  • L2 正则化(岭回归):L2 正则化,也称为岭回归正则化,在损失函数中添加了一个与模型系数(权重)的平方成正比的惩罚项。从数学上讲,它可以表示如下:

    L2 正则化下的损失 = 原始损失 + λ * Σ(w_i²)

    再次强调,λ是控制正则化强度的超参数。

    L2正则化鼓励所有模型权重都保持较小,但很少将它们缩小到正好为零。它防止任何特征具有压倒性的大权重,并使模型更加稳定和数值上良好条件化。L2正则化通常用于防止多重共线性(特征之间的高度相关性)并减少异常值的影响。当你认为所有特征都相关但不应过度影响时,它很适用。

在以下列表中,我们总结了L1L2正则化之间的关键区别:

  • L1通过将一些权重设置为正好为零来鼓励稀疏性,导致特征选择,而L2主要缩小权重但很少完全消除它们。

  • L1适用于你怀疑只有部分特征相关的情形,而L2则更适用于你想要防止多重共线性并确保所有特征对模型都有贡献的情形。

  • L1L2正则化的组合被称为弹性网络,它在特征选择L1)和特征分组L2)之间取得平衡。

L1L2正则化之间的选择取决于具体问题、数据的性质以及你对特征之间潜在关系的理解。在某些情况下,结合L1L2正则化可能通过在稀疏性和稳定性之间提供平衡,从而提供最佳结果。

引入早停机制

提前停止是机器学习中常用的正则化技术,尤其是在训练深度神经网络(DNNs)时,用于防止过拟合并优化模型性能。它涉及在训练过程中监控模型在验证数据集上的性能,并在满足一定标准时停止训练。

在训练过程中,您的数据集通常分为两部分:训练数据集和验证数据集。训练数据集用于更新模型的参数,而验证数据集用于监控模型的性能。为了实现提前停止,您需要定义一个性能标准。常见的标准包括验证损失或验证准确率,具体取决于特定的机器学习任务(例如,回归或分类)。您的目标是使验证损失最小化或使验证准确率最大化。

随着模型的训练,您会定期通过计算验证损失或准确率来评估模型在验证数据集上的性能。

您通常会在固定的时间间隔或训练周期数之后监控验证性能。您设置一个阈值,或基于验证性能的规则,以决定何时停止训练。这可能包括跟踪验证损失是否在下降或验证准确率是否已达到平台期。最常见的情况是,当验证性能开始下降或停滞时停止训练。换句话说,您寻找验证损失开始增加或验证准确率开始下降的点。当满足提前停止条件时,训练停止。通常认为训练停止时的模型参数是最终模型。

使用提前停止的好处有哪些?有几个:

  • 防止过拟合:提前停止可以防止模型过度拟合训练数据,因为它在模型开始拟合数据中的噪声时终止训练过程。

  • 节省训练时间:它可以通过在达到最优或近似最优性能后停止不必要的训练来显著减少训练时间。

  • 提高泛化能力:由于模型不会过度拟合训练数据,因此它的性能更有可能很好地泛化到新的、未见过的数据。

然而,在使用提前停止时必须谨慎:选择正确的超参数,如提前停止阈值或验证检查的频率,至关重要。错误的选择可能导致训练过早停止或过度训练。同时,使用一个模型在训练期间未见过的单独验证数据集也很重要。如果训练和验证使用相同的数据,则可能发生数据泄露。

提前停止是训练机器学习模型的一个宝贵工具,但应该在使用时仔细考虑问题和数据的特定情况。它有助于实现更好的模型泛化,并降低过拟合的风险。

摘要

在本章中,我们展示了如何在 MATLAB 中实现一个自动故障诊断系统。我们首先介绍了异常检测和故障诊断的基本概念。然后,我们展示了如何在 MATLAB 中实现一个识别异常操作的系统。我们使用来自变速箱的振动数据,基于逻辑回归训练了一个模型。随后,我们使用了相同的数据,但这次使用基于随机森林的模型来提高预测模型的表现。

在下一节中,我们实现了一个基于声发射识别无人机螺旋桨故障的模型。我们使用了一个基于 SVM 的分类模型。

在最后一节中,我们介绍了用于提高模型性能的正则化算法中最受欢迎的方法。

总之,这本书为初学者和经验丰富的从业者提供了一个全面的指南和无价的资源,他们正在探索机器学习动态发展的领域。这本书不仅为读者提供了关键概念和方法的基础,还赋予了他们使用 MATLAB 实现和部署机器学习模型的实际技能。随着我们踏上不断发展的技术进步之旅,这本书犹如灯塔,照亮了理解和掌握机器学习复杂领域的道路。无论你是学生、研究人员还是行业专业人士,从这些页面中获得的知识无疑将推动你在事业中充分利用机器学习的全部潜力。愿这本书成为创新的催化剂和发现的灵感,激励读者为激动人心且变革性的机器学习领域做出贡献。