使用分类进行类别预测

编辑

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

Classification process

在现实中,分类问题更加复杂,例如,为了安全起见,对恶意和良性域进行分类以检测 DGA 活动,或根据客户通话数据预测客户流失。分类用于预测离散的、分类的值。

当您创建分类作业时,必须指定哪个字段包含您要预测的类别。此字段称为因变量。它最多可以包含 100 个类别。默认情况下,所有其他支持的字段都包含在分析中,称为特征变量。您可以选择包含或排除字段。有关字段选择的更多信息,请参阅解释数据框分析 API

分类算法

编辑

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

1. 定义问题

编辑

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

2. 设置环境

编辑

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

3. 准备和转换数据

编辑

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

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

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

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

4. 创建作业

编辑

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

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

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

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

5. 启动作业

编辑

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

  • 重新索引:将文档从源索引复制到目标索引。
  • 加载数据:作业从目标索引中提取必要的数据。
  • 特征选择:该过程识别用于预测因变量的最相关的分析字段。
  • 粗略参数搜索:该过程识别未定义超参数的初始值。
  • 微调参数:该过程识别未定义超参数的最终值。请参阅超参数优化
  • 最终训练:进行模型训练。
  • 写入结果:作业将结果与目标索引中的数据行匹配、合并并将它们索引回目标索引。
  • 推理:作业根据数据集的测试拆分验证训练后的模型。

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

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

6. 评估和解释结果

编辑

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

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

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

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

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

  • 特征重要性
  • class_probability
  • class_score

多类混淆矩阵

编辑

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

这是一个二进制问题的混淆矩阵示例

Confusion matrix of a binary problem

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

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

Confusion matrix of a multiclass problem

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

接收者操作特征曲线下面积 (AUC ROC)

编辑

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

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

从该图中,您可以计算曲线下面积 (AUC) 值,该值是介于 0 和 1 之间的数字。AUC 越高,模型在这种情况下将 A 预测为 A 的能力就越好。

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

特征重要性

编辑

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

class_probability

编辑

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

class_score

编辑

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

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

A confusion matrix with the correct predictions highlighted

如果您的训练数据中存在不平衡的类别分布,则专注于准确率会降低模型对代表性不足的类别中错误预测的敏感性。

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

A confusion matrix with a row highlighted

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

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

7. 部署模型

编辑

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

  1. 要在管道中部署数据框分析模型,请导航至 Kibana 中的 机器学习 > 模型管理 > 训练模型
  2. 在列表中找到您要部署的模型,然后在操作菜单中单击部署模型

    The trained models UI in Kibana
  3. 创建一个推理管道,以便能够通过管道将模型应用于新数据。添加名称和描述,或使用默认值。

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

    Configuring an inference processor
  5. 配置以处理摄取失败,或使用默认设置。
  6. (可选)通过运行管道模拟来测试您的管道,以确认它产生预期的结果。
  7. 查看设置并单击创建管道

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

推理

编辑

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

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

推理处理器
编辑

推理可以用作在摄取管道中指定的处理器。它使用训练的模型对管道中正在摄取的数据进行推理。该模型在摄取节点上使用。推理通过使用模型预处理数据并提供预测。处理完成后,管道继续执行(如果管道中还有其他处理器),最后将新数据和结果一起索引到目标索引中。

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

推理聚合
编辑

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

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

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

在示例航班数据集中执行分类分析

编辑

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

如果您想在 Jupyter notebook 中查看此示例,请单击此处

准备您的数据

编辑

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

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

示例源文档
{
  "_index": "kibana_sample_data_flights",
  "_type": "_doc",
  "_id": "S-JS1W0BJ7wufFIaPAHe",
  "_version": 1,
  "_seq_no": 3356,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "FlightNum": "N32FE9T",
    "DestCountry": "JP",
    "OriginWeather": "Thunder & Lightning",
    "OriginCityName": "Adelaide",
    "AvgTicketPrice": 499.08518599798685,
    "DistanceMiles": 4802.864932998549,
    "FlightDelay": false,
    "DestWeather": "Sunny",
    "Dest": "Chubu Centrair International Airport",
    "FlightDelayType": "No Delay",
    "OriginCountry": "AU",
    "dayOfWeek": 3,
    "DistanceKilometers": 7729.461862731618,
    "timestamp": "2019-10-17T11:12:29",
    "DestLocation": {
      "lat": "34.85839844",
      "lon": "136.8049927"
    },
    "DestAirportID": "NGO",
    "Carrier": "ES-Air",
    "Cancelled": false,
    "FlightTimeMin": 454.6742272195069,
    "Origin": "Adelaide International Airport",
    "OriginLocation": {
      "lat": "-34.945",
      "lon": "138.531006"
    },
    "DestRegion": "SE-BD",
    "OriginAirportID": "ADL",
    "OriginRegion": "SE-BD",
    "DestCityName": "Tokoname",
    "FlightTimeHour": 7.577903786991782,
    "FlightDelayMin": 0
  }
}

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

创建分类模型

编辑

要预测特定航班是否延误

  1. 创建一个数据框分析作业。

    您可以使用 Kibana 中机器学习 > 数据框分析选项卡上的向导,或创建数据框分析作业 API。

    Creating a data frame analytics job in Kibana
    1. 选择 kibana_sample_data_flights 作为源索引。
    2. 选择 classification 作为作业类型。
    3. 选择 FlightDelay 作为因变量,这是我们想要通过分类分析预测的字段。
    4. CancelledFlightDelayMinFlightDelayType 添加到排除字段列表中。建议排除包含错误数据或描述 dependent_variable 的字段。

      该向导包括一个散点图矩阵,使您可以探索数字字段之间的关系。每个点的颜色受该文档的因变量值的影响,如图例所示。您可以突出显示一个图表中的区域,并且相应区域也会在其余图表中突出显示。您可以使用此矩阵来帮助您决定要包括或排除哪些字段。

      A scatterplot matrix for three fields in Kibana

      如果您希望这些图表表示来自更大样本量或来自随机选择的文档的数据,则可以更改默认行为。但是,更大的样本量可能会降低矩阵的性能,而随机选择可能会由于更密集的查询而给集群带来更大的负载。

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

      API 示例
      PUT _ml/data_frame/analytics/model-flight-delays-classification
      {
        "source": {
          "index": [
            "kibana_sample_data_flights"
          ]
        },
        "dest": {
          "index": "model-flight-delays-classification",
          "results_field": "ml" 
        },
        "analysis": {
          "classification": {
            "dependent_variable": "FlightDelay",
            "training_percent": 10,
            "num_top_feature_importance_values": 10 
          }
        },
        "analyzed_fields": {
          "includes": [],
          "excludes": [
            "Cancelled",
            "FlightDelayMin",
            "FlightDelayType"
          ]
        }
      }

      dest 索引中包含分析结果的字段名称。

      要禁用特征重要性计算,请省略此选项。

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

  2. 在 Kibana 中启动作业,或使用启动数据框分析作业 API。

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

    API 示例
    POST _ml/data_frame/analytics/model-flight-delays-classification/_start
  3. 检查作业统计信息以在 Kibana 中跟踪进度,或使用获取数据框分析作业统计信息 API

    Statistics for a data frame analytics job in Kibana

    当作业停止时,结果已准备好查看和评估。要了解有关作业阶段的更多信息,请参阅数据框分析作业的工作原理

    API 示例
    GET _ml/data_frame/analytics/model-flight-delays-classification/_stats

    API 调用返回以下响应

    {
      "count" : 1,
      "data_frame_analytics" : [
        {
          "id" : "model-flight-delays-classification",
          "state" : "stopped",
          "progress" : [
            {
              "phase" : "reindexing",
              "progress_percent" : 100
            },
            {
              "phase" : "loading_data",
              "progress_percent" : 100
            },
            {
              "phase" : "feature_selection",
              "progress_percent" : 100
            },
            {
              "phase" : "coarse_parameter_search",
              "progress_percent" : 100
            },
            {
              "phase" : "fine_tuning_parameters",
              "progress_percent" : 100
            },
            {
              "phase" : "final_training",
              "progress_percent" : 100
            },
            {
              "phase" : "writing_results",
              "progress_percent" : 100
            },
            {
              "phase" : "inference",
              "progress_percent" : 100
            }
          ],
          "data_counts" : {
            "training_docs_count" : 1305,
            "test_docs_count" : 11754,
            "skipped_docs_count" : 0
          },
          "memory_usage" : {
            "timestamp" : 1597182490577,
            "peak_usage_bytes" : 316613,
            "status" : "ok"
          },
          "analysis_stats" : {
            "classification_stats" : {
              "timestamp" : 1601405047110,
              "iteration" : 18,
              "hyperparameters" : {
                "class_assignment_objective" : "maximize_minimum_recall",
                "alpha" : 0.7633136599817167,
                "downsample_factor" : 0.9473152348018332,
                "eta" : 0.02331774683318904,
                "eta_growth_rate_per_tree" : 1.0143154178910303,
                "feature_bag_fraction" : 0.5504020748926737,
                "gamma" : 0.26389161802240446,
                "lambda" : 0.6309726978583623,
                "max_attempts_to_add_tree" : 3,
                "max_optimization_rounds_per_hyperparameter" : 2,
                "max_trees" : 894,
                "num_folds" : 5,
                "num_splits_per_feature" : 75,
                "soft_tree_depth_limit" : 4.672705943455812,
                "soft_tree_depth_tolerance" : 0.13448633124842999
                },
                "timing_stats" : {
                  "elapsed_time" : 76459,
                  "iteration_time" : 1861
                },
                "validation_loss" : {
                  "loss_type" : "binomial_logistic"
                }
              }
          }
        }
      ]
    }

查看分类结果

编辑

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

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

Destination index table for a classification job in Kibana

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

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

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

API 示例
GET model-flight-delays-classification/_search

下面的代码片段显示了目标索引中一个文档的概率和得分详细信息

          ...
          "FlightDelay" : false,
          ...
          "ml" : {
            "FlightDelay_prediction" : false,
            "top_classes" : [ 
              {
                "class_name" : false,
                "class_probability" : 0.9427605087816684,
                "class_score" : 0.3462468700158476
              },
              {
                "class_name" : true,
                "class_probability" : 0.057239491218331606,
                "class_score" : 0.057239491218331606
              }
            ],
            "prediction_probability" : 0.9427605087816684,
            "prediction_score" : 0.3462468700158476,
            ...

一个值数组,指定每个类别的预测概率和得分。

得分最高的类别是预测结果。在此示例中,falseclass_score 为 0.35,而 trueclass_score 仅为 0.06,因此预测结果将为 false。有关这些值的更多详细信息,请参阅 class_score

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

Total feature importance values in Kibana

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

A decision plot for feature importance values in Kibana

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

如果您不使用 Kibana,则可以通过使用 获取训练模型 API 查看汇总的特征重要性值,并通过搜索目标索引查看单个值。

API 示例
GET _ml/trained_models/model-flight-delays-classification*?include=total_feature_importance

下面的代码片段显示了训练模型元数据中总的特征重要性和相应的基线的示例

{
  "count" : 1,
  "trained_model_configs" : [
    {
      "model_id" : "model-flight-delays-classification-1601405047985",
      ...
      "metadata" : {
        ...
        "feature_importance_baseline" : { 
          "classes" : [
            {
              "class_name" : true,
              "baseline" : -1.5869016940485443
            },
            {
              "class_name" : false,
              "baseline" : 1.5869016940485443
            }
          ]
        },
        "total_feature_importance" : [
          {
            "feature_name" : "dayOfWeek",
            "classes" : [
              {
                "class_name" : false,
                "importance" : {
                  "mean_magnitude" : 0.037513174351966404, 
                  "min" : -0.20132653028125566, 
                  "max" : 0.20132653028125566 
                }
              },
              {
                "class_name" : true,
                "importance" : {
                  "mean_magnitude" : 0.037513174351966404,
                  "min" : -0.20132653028125566,
                  "max" : 0.20132653028125566
                }
              }
            ]
          },
          {
            "feature_name" : "OriginWeather",
            "classes" : [
              {
                "class_name" : false,
                "importance" : {
                  "mean_magnitude" : 0.05486662317369895,
                  "min" : -0.3337477336556598,
                  "max" : 0.3337477336556598
                }
              },
              {
                "class_name" : true,
                "importance" : {
                  "mean_magnitude" : 0.05486662317369895,
                  "min" : -0.3337477336556598,
                  "max" : 0.3337477336556598
                }
              }
            ]
          },
          ...

此对象包含在 Kibana 中用于计算特征重要性决策路径的基线。

此值是在预测类别为 false 时,所有训练数据中 dayOfWeek 字段的绝对特征重要性值的平均值。

此值是在预测类别为 false 时,此字段在所有训练数据中的最小特征重要性值。

此值是在预测类别为 false 时,此字段在所有训练数据中的最大特征重要性值。

要查看每个预测的最高特征重要性值,请搜索目标索引。例如

GET model-flight-delays-classification/_search

下面的代码片段显示了搜索结果中一个文档的特征重要性详细信息的示例

          ...
          "FlightDelay" : false,
          ...
          "ml" : {
            "FlightDelay_prediction" : false,
            ...
            "prediction_probability" : 0.9427605087816684,
            "prediction_score" : 0.3462468700158476,
            "feature_importance" : [
              {
                "feature_name" : "DistanceMiles",
                "classes" : [
                  {
                    "class_name" : false,
                    "importance" : -1.4766536146534828
                  },
                  {
                    "class_name" : true,
                    "importance" : 1.4766536146534828
                  }
                ]
              },
              {
                "feature_name" : "FlightTimeMin",
                "classes" : [
                  {
                    "class_name" : false,
                    "importance" : 1.0919201754729184
                  },
                  {
                    "class_name" : true,
                    "importance" : -1.0919201754729184
                  }
                ]
              },
              ...

此数据点中每个类别的特征重要性值的总和近似于其优势的对数。

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

评估分类结果

编辑

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

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

Evaluation of a classification job in Kibana

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

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

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

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

Evaluation of a classification job in Kibana – ROC curve

您还可以使用 数据帧分析评估 API 生成这些指标。有关解释评估指标的更多信息,请参阅 6. 评估和解释结果

API 示例

首先,我们想知道训练误差,它表示模型在训练数据集上的表现如何。

POST _ml/data_frame/_evaluate
{
 "index": "model-flight-delays-classification",
   "query": {
    "term": {
      "ml.is_training": {
        "value": true  
      }
    }
  },
 "evaluation": {
   "classification": {
     "actual_field": "FlightDelay",
     "predicted_field": "ml.FlightDelay_prediction",
     "metrics": {
       "multiclass_confusion_matrix" : {}
     }
   }
 }
}

我们通过仅评估训练数据来计算训练误差。

接下来,我们计算泛化误差,它表示模型在先前未见过的数据上的表现如何

POST _ml/data_frame/_evaluate
{
 "index": "model-flight-delays-classification",
   "query": {
    "term": {
      "ml.is_training": {
        "value": false  
      }
    }
  },
 "evaluation": {
   "classification": {
     "actual_field": "FlightDelay",
     "predicted_field": "ml.FlightDelay_prediction",
     "metrics": {
       "multiclass_confusion_matrix" : {}
     }
   }
 }
}

我们仅评估不属于训练数据的文档。

返回的混淆矩阵向我们展示了有多少数据点被正确分类(其中 actual_classpredicted_class 匹配),以及有多少数据点被错误分类(actual_classpredicted_class 不匹配)

{
  "classification" : {
    "multiclass_confusion_matrix" : {
      "confusion_matrix" : [
        {
          "actual_class" : "false", 
          "actual_class_doc_count" : 8802, 
          "predicted_classes" : [
            {
              "predicted_class" : "false", 
              "count" : 7262 
            },
            {
              "predicted_class" : "true",
              "count" : 1540
            }
          ],
          "other_predicted_class_doc_count" : 0
        },
        {
          "actual_class" : "true",
          "actual_class_doc_count" : 2952,
          "predicted_classes" : [
            {
              "predicted_class" : "false",
              "count" : 794
            },
            {
              "predicted_class" : "true",
              "count" : 2158
            }
          ],
          "other_predicted_class_doc_count" : 0
        }
      ],
      "other_actual_class_count" : 0
    }
  }
}

实际类别的名称。在此示例中,有两个实际类别:truefalse

数据集中属于实际类别的文档数量。

预测类别的名称。

属于实际类别并标记为预测类别的文档数量。

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

进一步阅读

编辑