正在加载

使用分类预测类别

Elastic Stack Serverless

分类是一种机器学习过程,用于预测数据集中数据点的类或类别。举一个简单的例子,考虑如何区分和分类下图中的形状为“圆形”和“三角形”

Classification process

实际上,分类问题更加复杂,例如对恶意和良性域进行分类,以检测出于安全原因的 DGA 活动,或根据客户通话数据预测客户流失。 分类用于预测离散的分类值。

创建分类任务时,必须指定哪个字段包含要预测的类别。 该字段称为因变量。 最多可以包含 100 个类别。 默认情况下,所有其他 支持的字段都包含在分析中,称为特征变量。您可以选择性地包含或排除字段。有关字段选择的更多信息,请参阅explain data frame analytics API

分类分析使用一种类似于极端梯度提升 (XGBoost) 的集成算法,该算法将多个弱模型组合成一个复合模型。它使用决策树来学习预测数据点属于某个特定类别的概率。 XGBoost 训练一系列决策树,每个决策树都从目前为止森林的错误中学习。在每次迭代中,添加到森林中的树都会提高组合决策森林的决策质量。 分类算法针对称为交叉熵损失的损失函数进行优化。

在需要预测离散的分类值的情况下,分类可能很有用。 如果您的用例需要预测此类值,则分类可能是您的合适选择。

在使用 Elastic Stack 机器学习功能之前,需要解决一些配置要求(例如安全权限)。 请参阅设置和安全性

分类是一种监督机器学习方法,这意味着您需要提供带标签的训练数据集。 此数据集必须具有特征变量和用于训练模型的因变量的值。 训练过程使用此信息来了解类别和特征变量之间的关系。 这种带标签的数据集也在模型评估中起着关键作用。

如果可能,请准备您的输入数据,使其具有更少的类别。 具有许多类别的分类分析比二元分类任务需要更长的时间才能运行。 类别数量与运行时间之间的关系大致是线性的。

您可能还需要转换您的数据以创建可用作分类源的数据框。

要了解有关如何准备数据的更多信息,请参阅监督学习概述的相关部分

数据框分析分析任务包含执行分析任务所需的配置信息和元数据。 您可以通过 Kibana 或使用创建数据框分析分析任务 API创建数据框分析分析任务。

选择分类作为分析类型,然后选择要预测的字段(因变量)。 您还可以包括和排除字段。

提示

您可以在数据框分析向导中查看可选字段的统计信息。 弹出窗口中显示的字段统计信息提供了更有意义的上下文,以帮助您选择相关字段。

为了提高性能,请考虑使用较小的 training_percent 值以更快地训练模型。 迭代进行是一个很好的策略:以较小的训练百分比运行分析,然后评估性能。 根据结果,您可以决定是否需要增加 training_percent 值。

您可以通过 Kibana 或使用启动数据框分析分析任务 API 启动任务。 分类任务具有以下阶段

  • reindexing:文档从源索引复制到目标索引。
  • loading_data:任务从目标索引中提取必要的数据。
  • feature_selection:该过程识别用于预测因变量的最相关的分析字段。
  • coarse_parameter_search:该过程识别未定义超参数的初始值。
  • fine_tuning_parameters:该过程识别未定义超参数的最终值。 请参阅超参数优化
  • final_training:进行模型训练。
  • writing_results:任务将结果与目标索引中的数据行匹配,合并它们,并将它们索引回目标索引。
  • inference:任务针对数据集的测试拆分验证训练后的模型。

最后一个阶段完成后,任务停止,结果可以进行评估。

注意

当您创建数据框分析分析任务时,如果模型太大而无法装入 JVM,则该过程的推理步骤可能会失败。 有关解决方法,请参阅此 GitHub 问题

使用数据框分析功能从数据集中获得见解是一个迭代过程。 在定义要解决的问题并选择可以帮助您解决问题的分析类型之后,您需要生成高质量的数据集并创建适当的数据框分析分析任务。 在获得满足您用例的结果之前,您可能需要尝试不同的配置、参数和转换数据的方式。 此过程的一个有价值的伴侣是评估数据框分析 API,它可以让您评估数据框分析性能。 它可以帮助您了解误差分布,并识别数据框分析模型性能良好或可信度较低的点。

要使用此 API 评估分析,您需要使用一个字段来注释您的索引,该字段包含分析结果,该字段用基本事实标记每个文档。 评估数据框分析 API 针对此手动提供的基本事实评估数据框分析的性能。

您可以通过使用评估数据框分析 APIclassification 评估类型或通过查看 Kibana 中的任务结果来衡量模型在训练数据集上的表现如何。 分类评估提供以下指标来评估模型性能

  • 多类混淆矩阵
  • 接收者操作特征曲线下面积 (AUC ROC)

以下指标可帮助您解释分析结果

  • 特征重要性
  • class_probability
  • class_score

多类混淆矩阵提供了分类分析性能的摘要。 它包含分析正确分类数据点及其真实类别的发生次数,以及错误分类的发生次数。

这是二元问题的混淆矩阵示例

Confusion matrix of a binary problem

这是一个二乘二矩阵,因为只有两个类别(truefalse)。 它显示了正确识别为每个类别成员的数据点的比例以及错误识别的比例。

随着类别数量的增加,混淆矩阵变得更加复杂

Confusion matrix of a multiclass problem

该矩阵左侧包含实际标签,顶部包含预测标签。对于每个类别,正确和不正确预测的比例都会被分解。这使您可以检查分类分析在进行预测时如何混淆不同的类别。

接收者操作特征 (ROC) 曲线是一个图,表示分类过程在不同预测概率阈值下的性能。它将特定类别的真正例率与所有其他类别合并的速率(“一对多”策略)在不同的阈值水平上进行比较,以创建曲线。

例如,有三个类别:ABC,并且计算 A 的 AUC ROC。在这种情况下,将正确分类的 A 的数量(真正例)与被错误分类为 ABC 的数量(假正例)进行比较。

从该图中,您可以计算曲线下面积 (AUC) 值,该值介于 0 和 1 之间。AUC 越高,模型在将 A 预测为 A 方面的性能越好(在本例中)。

注意

要使用此评估方法,创建数据帧分析分析作业时,必须将 num_top_classes 设置为 -1 或大于或等于类别总数的值。

特征重要性提供了关于分析结果的更多信息,并有助于以更微妙的方式解释结果。如果您想了解更多关于特征重要性的信息,请参阅 特征重要性

class_probability 是介于 0 和 1 之间的值,表示给定的数据点属于某个特定类别的可能性。数字越高,数据点属于指定类别的可能性越高。此信息存储在目标索引中每个文档的 top_classes 数组中。

class_scoreclass_probability 的一个函数,并且具有大于或等于零的值。它会考虑您的目标(在 class_assignment_objective 作业配置选项中定义):准确率召回率

如果您的目标是最大化准确率,则会对分数进行加权,以最大化训练数据集中正确预测的比例。

A confusion matrix with the correct predictions highlighted
提示

如果在您的训练数据中存在不平衡的类别分布,那么关注准确率可能会降低您的模型对代表性不足的类别中不正确预测的敏感度。

默认情况下,分类分析作业接受整体准确率的轻微降低,以换取对错误预测类别的更高敏感度。也就是说,他们的目标是最大化最小召回率。例如,在多类别混淆矩阵的上下文中,感兴趣的预测在每一行中

A confusion matrix with a row highlighted

对于每个类别,召回率计算为正确预测的数量除以该行中所有其他预测标签的总和。该值在混淆矩阵的每个单元格中表示为百分比。然后对类别分数进行加权,以支持导致训练数据中最高召回率值的预测。当您拥有高度不平衡的数据时,此目标通常比准确率表现更好。

要了解更多关于选择适合您目标的类别分配目标的信息,请参阅此 Jupyter notebook

您创建的模型作为 Elasticsearch 文档存储在内部索引中。换句话说,您的训练模型的特征已保存并准备好部署和用作函数。

  1. 要在管道中部署数据帧分析模型,请在主菜单中导航到 Machine Learning > 模型管理 > 已训练模型,或使用 Kibana 中的全局搜索字段

  2. 在列表中找到您想要部署的模型,然后在操作菜单中点击部署模型

    The trained models UI in {{kib}}
  3. 创建一个推断管道,以便能够通过该管道针对新数据使用该模型。添加名称和描述,或使用默认值。

    Creating an inference pipeline
  4. 配置管道处理器或使用默认设置。

    Configuring an inference processor
  5. 配置以处理提取失败或使用默认设置。

  6. (可选) 通过运行管道模拟来测试您的管道,以确认它产生预期的结果。

  7. 查看设置并点击创建管道

该模型已部署,并可以通过推断管道使用。

推断使您能够以持续的方式针对传入数据使用已训练的机器学习模型

例如,假设您有一项在线服务,并且您想预测客户是否可能流失。您有一个包含历史数据的索引——关于客户多年来在您业务中的行为的信息——以及一个基于此数据训练的分类模型。新信息进入连续变换的目标索引。通过推断,您可以使用您训练模型时使用的相同输入字段对新数据执行分类分析,并获得预测。

推断可以用作在 提取管道中指定的处理器。它使用训练好的模型来推断管道中提取的数据。该模型在提取节点上使用。推断通过使用该模型预处理数据并提供预测。在该过程之后,管道继续执行(如果管道中存在任何其他处理器),最后,新数据连同结果被索引到目标索引中。

查看推断处理器机器学习数据帧分析 API 文档以了解更多信息。

推断也可以用作管道聚合。您可以在聚合中引用训练好的模型,以推断父桶聚合的结果字段。推断聚合使用模型在结果上提供预测。此聚合使您能够在搜索时运行分类或回归分析。如果您想对一小部分数据执行分析,则此聚合使您无需在提取管道中设置处理器即可生成预测。

查看 推断桶聚合机器学习数据帧分析 API 文档以了解更多信息。

注意

如果您使用训练的模型别名在推断处理器或推断聚合中引用您的训练模型,则您可以用新的模型替换您的训练模型,而无需更新处理器或聚合。使用 创建或更新训练的模型别名 API 将您使用的别名重新分配给新的训练模型 ID。新的训练模型需要使用与旧的训练模型相同类型的数据帧分析。

让我们尝试使用示例航班数据来预测航班是否会延误。数据集包含诸如天气状况、承运人、飞行距离、始发地、目的地以及航班是否延误等信息。分类模型学习您数据中字段之间的关系,以预测因变量的值,在本例中,该变量是布尔值 FlightDelay 字段。

提示

如果您想在 Jupyter notebook 中查看此示例,请点击这里

示例航班数据集中的每个文档都包含单个航班的详细信息,因此数据已准备好进行分析;它已经存在于一个基于二维实体的数据结构中。通常,您通常需要先转换数据为以实体为中心的索引,然后才能对其进行分析。

为了进行分析,文档必须至少包含一个具有受支持数据类型(numericbooleantextkeywordip)的字段,并且不能包含具有多个项目的数组。如果您的源数据包含一些包含因变量的文档,以及一些不包含因变量的文档,则模型将在包含因变量的文档子集上进行训练。

提示

本示例中使用示例航班数据集是因为它易于访问。但是,这些数据是手动创建的,包含一些不一致之处。例如,航班可能既延误又取消。这很好地提醒我们,输入数据的质量会影响结果的质量。

要预测特定航班是否延误

  1. 创建一个数据框分析分析任务。您可以使用 Kibana 中 Machine Learning > Data Frame Analytics 选项卡上的向导,或者使用 创建数据框分析分析任务 API。

    Creating a {{dfanalytics-job}} in {{kib}}
    1. 选择 kibana_sample_data_flights 作为源索引。
    2. 选择 classification 作为任务类型。
    3. 选择 FlightDelay 作为因变量,这是我们要使用分类分析预测的字段。
    4. CancelledFlightDelayMinFlightDelayType 添加到排除字段列表中。建议排除包含错误数据或描述 dependent_variable 的字段。该向导包括一个散点图矩阵,使您可以探索数字字段之间的关系。每个点的颜色受该文档的因变量值的影响,如图例所示。您可以突出显示其中一个图表中的区域,相应的区域也会在其余图表中突出显示。您可以使用此矩阵来帮助您决定要包含或排除哪些字段。
    A scatterplot matrix for three fields in {{kib}}

    如果您希望这些图表代表来自更大样本量或来自文档随机选择的数据,您可以更改默认行为。但是,更大的样本量可能会降低矩阵的性能,而随机选择可能会由于更密集的查询而给集群带来更多负载。5. 选择 10 的训练百分比,这意味着它随机选择 10% 的源数据用于训练。虽然该值对于此示例来说很低,但对于许多大型数据集,使用小的训练样本可以大大减少运行时,而不会影响准确性。6. 如果您想尝试特征重要性,请在高级配置选项中指定一个值。在本例中,每个文档最多返回 10 个特征重要性值。此选项会影响分析速度,因此默认情况下会禁用它。7. 对任务使用默认的内存限制。如果任务需要的内存超过此量,则启动将失败。如果节点上的可用内存有限,则此设置可以防止任务执行。8. 添加任务 ID(例如 model-flight-delays-classification),并可选择添加任务描述。9. 添加将包含结果的目标索引的名称。在 Kibana 中,索引名称默认与任务 ID 匹配。它将包含源索引数据的副本,其中每个文档都用结果进行注释。如果索引不存在,将自动创建它。10. 对所有其他选项使用默认值。

配置任务后,配置详细信息将自动验证。如果检查成功,则可以启动任务。如果配置无效,则会显示一条警告消息。该消息包含一个改进配置以进行验证的建议。

  1. 在 Kibana 中启动任务,或使用启动数据框分析分析任务 API。

    该任务需要几分钟才能运行。运行时取决于本地硬件,还取决于分析的文档和字段的数量。字段和文档越多,任务运行的时间越长。分析完成后,它会自动停止。

  1. 检查任务统计信息以在 Kibana 中跟踪进度,或使用获取数据框分析分析任务统计信息 API
Statistics for a {{dfanalytics-job}} in {{kib}}

任务停止时,结果即可查看和评估。要了解有关任务阶段的更多信息,请参阅数据框分析分析任务的工作原理

现在您有了一个新的索引,其中包含源数据的副本,其中包含对因变量的预测。

当您在 Kibana 中查看分类结果时,它以表格格式显示目标索引的内容。它还提供有关分析详细信息、模型评估指标、总特征重要性值和散点图矩阵的信息。

Destination index table for a classification job in {{kib}}

该表显示了因变量 (FlightDelay) 的一列,其中包含您尝试预测的实际值。它还显示了预测值 (ml.FlightDelay_prediction) 的一列,这些值由分类分析生成。ml.is_training 列指示文档是否用于训练或测试数据集。您可以使用 TrainingTesting 筛选器选项来优化结果表的内容。您还可以启用直方图图表,以更好地了解值的分布。

如果您想了解模型对每个预测的确定程度,可以检查其概率和分数 (ml.prediction_probabilityml.prediction_score)。这些值越高,模型对数据点属于指定类的置信度就越高。如果您在 Kibana 的 Discover 应用中更仔细地检查目标索引,或者使用标准 Elasticsearch 搜索命令,您会看到分析预测了因变量所有可能类别的概率。top_classes 对象包含具有最高分数的预测类别。

提示

如果您有大量类别,则目标索引包含每个文档的大量预测概率。创建分类任务时,可以使用 num_top_classes 选项来修改此行为。

如果您选择计算特征重要性,则目标索引还包含 ml.feature_importance 对象。包含在分析中的每个字段(称为数据点的特征)都分配有一个特征重要性值。它既有大小又有方向(正或负),这表明每个字段如何影响特定预测。只有最重要的值(在本例中为前 10 个)存储在索引中。但是,经过训练的模型元数据还包含每个字段在所有训练数据中特征重要性值的平均大小。您可以在 Kibana 中查看此摘要信息

Total {{feat-imp}} values in {{kib}}

您还可以以决策图的形式查看每个单独预测的特征重要性值

A decision plot for {{feat-imp}} values in {{kib}}

在 Kibana 中,决策路径显示了每个特征对预测概率的相对影响。具有最显著正面或负面影响的特征会出现在决策图的顶部。因此,在此示例中,与飞行时间和距离相关的特征对该预测的概率值影响最大。这类信息可以帮助您了解模型如何得出其预测。它还可以指示在训练和调整模型时,数据集的哪些方面最具影响力或最不有用。

如果您不使用 Kibana,您可以使用get trained model API查看汇总的特征重要性值,并通过搜索目标索引查看各个值。

最后,Kibana 在结果中提供了一个散点图矩阵。它具有与您在作业向导中看到的矩阵相同的功能。其目的是帮助您可视化和探索数值字段和因变量之间的关系。

虽然您可以查看单个结果并将预测值 (ml.FlightDelay_prediction) 与实际值 (FlightDelay) 进行比较,但通常需要作为一个整体来评估分类模型的成功程度。

Kibana 提供了一个归一化混淆矩阵,其中包含分析将数据点与其真实类别正确分类的发生百分比,以及错误分类的发生百分比。

Evaluation of a classification job in {{kib}}
注意

由于示例数据在加载到 Kibana 中时可能会发生变化,即使您使用与示例相同的配置,分析结果也可能会有所不同。 因此,请将此信息作为解释您自己结果的指南。

如果要查看确切的出现次数,请选择矩阵中的一个象限。 您还可以使用 TrainingTesting 过滤器选项来优化矩阵的内容。 因此,您可以看到模型在先前未见过的数据上的表现如何。 您可以检查测试数据中有多少文档是true,其中有多少被正确识别(真阳性),以及有多少被错误地识别为false假阴性)。

同样,如果您选择矩阵中的其他象限,它会显示在测试数据中,实际值为false类的文档数量。 该矩阵显示了被正确识别为false真阴性)的文档数量和被错误预测为true假阳性)的文档数量。 当您对自己的数据执行分类分析时,可能需要多次迭代才能对结果感到满意并准备好部署模型。

Kibana 还提供接受者操作特征 (ROC) 曲线作为模型评估的一部分。 该图比较了每个类别的真阳性率(y 轴)与假阳性率(x 轴); 在此示例中,为truefalse。 从该图中,计算曲线下面积 (AUC) 值。 它是 0 到 1 之间的数字。AUC 越高,模型正确预测类别的效果越好。

Evaluation of a classification job in {{kib}} – ROC curve

您还可以使用data frame analytics evaluate API生成这些指标。 有关解释评估指标的更多信息,请参阅6. 评估和解释结果

如果您不想保留数据帧分析分析作业,您可以在 Kibana 中或使用delete data frame analytics analytics job API删除它。 当您在 Kibana 中删除数据帧分析分析作业时,您可以选择同时删除目标索引和数据视图。

© . All rights reserved.