使用回归预测数值
Elastic Stack 无服务器
回归分析是一种监督机器学习过程,用于估计数据中不同字段之间的关系,然后根据这些关系对数值数据进行进一步预测。例如,您可以根据历史数据预测 Web 请求的响应时间或服务器与客户端交换的大致数据量。
执行回归分析时,您必须确定要用于创建模型的字段子集,以预测其他字段。 *特征变量*是用于创建模型的字段。 *因变量*是您要预测的字段。
回归使用类似于极限梯度提升 (XGBoost) 的集成学习技术,该技术将决策树与梯度提升方法相结合。 XGBoost 训练一系列决策树,并且每个决策树都从目前为止森林的错误中学习。在每次迭代中,添加到森林的树都会提高组合决策森林的决策质量。默认情况下,回归算法会优化名为均方误差损失的损失函数。
有三种类型的特征变量可用于这些算法:数值型、类别型或布尔型。 不支持数组。
在需要预测连续量的情况下,回归会很有用。 回归分析可以预测的值是数值。 如果您的用例需要预测连续的数值,那么回归可能是适合您的选择。
在使用 Elastic Stack 机器学习功能之前,必须解决一些配置要求(例如安全权限)。 请参阅设置和安全性。
回归是一种监督机器学习方法,这意味着您需要提供带标签的训练数据集。此数据集必须具有特征变量和用于训练模型的因变量的值。此信息在训练期间用于识别数据各种特征之间的关系以及预测值。此带标签的数据集还在模型评估中起着关键作用。
您可能还需要转换您的数据以创建数据帧,该数据帧可用作回归的源。
要了解有关如何准备数据的更多信息,请参阅监督学习概述的相关部分。
数据帧分析作业包含执行分析任务所需的配置信息和元数据。 您可以通过 Kibana 或使用创建数据帧分析作业 API来创建数据帧分析作业。
选择回归作为作业的分析类型,然后选择要预测的字段(因变量)。 您还可以包含和排除分析中的字段。
您可以在数据帧分析向导中查看可选字段的统计信息。 在弹出窗口中显示的字段统计信息提供了更有意义的上下文,以帮助您选择相关字段。
您可以通过 Kibana 或使用启动数据帧分析作业 API 来启动作业。 回归作业具有以下阶段
reindexing
:文档从源索引复制到目标索引。loading_data
:作业从目标索引中提取必要的数据。feature_selection
:该过程识别用于预测因变量的最相关的分析字段。coarse_parameter_search
:该过程识别未定义超参数的初始值。fine_tuning_parameters
:该过程识别未定义超参数的最终值。 请参阅超参数优化。final_training
:发生模型训练。writing_results
:作业将结果与目标索引中的数据行匹配,合并它们,然后将它们索引回目标索引。inference
:作业根据数据集的测试拆分验证训练后的模型。
完成最后一个阶段后,作业停止并且结果可以进行评估。
创建数据帧分析分析作业时,如果模型太大而无法装入 JVM,则该过程的推理步骤可能会失败。 有关解决方法,请参阅此 GitHub 问题。
使用数据帧分析功能从数据集中获得见解是一个迭代过程。 在定义要解决的问题并选择可以帮助您解决该问题的分析类型后,您需要生成高质量的数据集并创建适当的数据帧分析作业。 在获得满足您的用例的结果之前,您可能需要尝试不同的配置、参数和转换数据的方式。 此过程的一个有价值的补充是评估数据帧分析 API,它使您可以评估数据帧分析性能。 它可以帮助您了解误差分布,并识别数据帧分析模型表现良好或不太可信的点。
要使用此 API 评估分析,您需要使用一个字段注释包含分析结果的索引,该字段使用基本事实标记每个文档。 评估数据帧分析 API 会根据此手动提供的基本事实评估数据帧分析的性能。
您可以使用评估数据帧分析 API的regression
评估类型来衡量模型在训练数据上的表现如何。 评估在训练数据集中为您提供的均方误差 (MSE)值是*训练误差*。 迭代地训练和评估模型意味着找到产生尽可能低的训练误差的模型参数组合。
另一个关键的测量是您的模型在未见数据上的表现如何。 为了评估训练后的模型在从未见过的数据上的表现如何,您必须留出一部分训练集用于测试(测试数据)。 训练模型后,您可以让它预测它从未见过的数据点的值,并将预测值与实际值进行比较。 此测试提供了对称为*模型泛化误差*的量的估计。
回归评估类型提供以下指标来评估模型性能
- 均方误差 (MSE)
- 均方对数误差 (MSLE)
- 伪 Huber 损失
- R 平方 (R2)
MSE 是真实值和预测值之间差异的平均平方和。 (平均(预测值-实际值)2)。
MSLE 是均方误差的一种变体。 它可用于目标值为正数并且分布有长尾的情况,例如价格或人口数据。 请查阅回归分析的损失函数页面,以了解有关损失函数的更多信息。
Pseudo-Huber 损失指标的行为类似于平均绝对误差 (MAE),适用于大于预定义值(默认为 1
)的误差;类似于均方误差 (MSE),适用于小于预定义值的误差。此损失函数使用 delta
参数来定义 MAE 和 MSE 之间的过渡点。请参阅回归分析的损失函数页面,以了解有关损失函数的更多信息。
R 平方 (R2) 代表拟合优度,衡量预测能够解释的数据变化量。R2 的值小于或等于 1,其中 1 表示预测值和真实值相等。当所有预测都设置为真实值的平均值时,R2 的值为 0。R2 的值为 0.5 表示预测值比其平均值更接近真实值 1 - 0.5 (1/2) (约 30%)。
特征重要性提供有关分析结果的更多信息,并有助于以更微妙的方式解释结果。如果您想了解有关特征重要性的更多信息,请点击此处。
您创建的模型存储为内部索引中的 Elasticsearch 文档。换句话说,您训练的模型的特征已保存,可以部署并用作函数。推断功能使您能够在摄取管道的预处理器中或搜索查询的管道聚合中使用您的模型,以对您的数据进行预测。
要在管道中部署数据框分析模型,请在主菜单中导航到机器学习 > 模型管理 > 训练模型,或者使用 Kibana 中的全局搜索字段。
在列表中找到要部署的模型,然后在操作菜单中单击部署模型。
创建一个推断管道,以便能够通过该管道对新数据使用该模型。添加名称和描述,或使用默认值。
配置管道处理器或使用默认设置。
配置以处理摄取失败或使用默认设置。
(可选)通过运行管道模拟来测试您的管道,以确认它产生预期的结果。
查看设置,然后单击创建管道。
该模型已部署,可以通过推断管道使用。
推断使您能够以连续的方式对传入数据使用训练的机器学习模型。
例如,假设您有一项在线服务,并且您想预测客户是否可能流失。您有一个包含历史数据的索引 – 客户在您业务中的多年行为信息 – 以及一个基于此数据训练的分类模型。新信息进入连续转换的目标索引。通过推断,您可以使用与您训练模型时相同的输入字段对新数据执行分类分析,并获得预测。
推断可以用作摄取管道中指定的处理器。它使用训练的模型来推断管道中正在摄取的数据。该模型在摄取节点上使用。推断通过使用模型来预处理数据并提供预测。在该过程之后,管道继续执行(如果管道中还有其他处理器),最后,新数据与结果一起被索引到目标索引中。
查看推断处理器和机器学习数据框分析 API 文档以了解更多信息。
推断也可以用作管道聚合。您可以在聚合中引用训练的模型,以推断父存储桶聚合的结果字段。推断聚合使用模型对结果进行推断,以提供预测。此聚合使您能够在搜索时运行分类或回归分析。如果您想对少量数据执行分析,则此聚合使您能够生成预测,而无需在摄取管道中设置处理器。
查看推断存储桶聚合和机器学习数据框分析 API 文档以了解更多信息。
如果您使用训练的模型别名来引用推断处理器或推断聚合中的训练的模型,则可以在不需要更新处理器或聚合的情况下用新模型替换您的训练的模型。通过使用创建或更新训练的模型别名 API,将您使用的别名重新分配给新的训练的模型 ID。新的训练的模型需要使用与旧模型相同类型的数据框分析。
让我们尝试使用示例航班数据来预测航班延误。该数据集包含诸如天气状况、航班目的地和始发地、飞行距离、航空公司以及每次航班延误的分钟数等信息。当您创建一个回归作业时,它会学习数据中字段之间的关系以预测因变量的值,在本例中,因变量是数字 FlightDelayMins
字段。有关这些概念的概述,请参阅使用回归预测数值和监督学习简介。
数据集中的每个文档都包含单个航班的详细信息,因此该数据已准备好进行分析;它已经存在于二维实体数据结构中。通常,在分析之前,您经常需要转换数据到以实体为中心的索引中。
要进行分析,文档必须至少包含一个具有支持的数据类型(numeric
、boolean
、text
、keyword
或 ip
)的字段,并且不得包含具有多个项目的数组。如果您的源数据由一些包含因变量的文档和一些不包含因变量的文档组成,则该模型将在包含因变量的文档子集上进行训练。
示例源文档
{
"_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
}
}
本示例中使用示例航班数据,因为它易于访问。但是,该数据包含一些不一致之处。例如,航班可能既延误又取消。这很好地提醒我们,输入数据的质量会影响结果的质量。
要预测每次航班延误的分钟数
- 验证您的环境是否已正确设置为使用机器学习功能。Elastic Stack 安全功能需要一个有权创建和管理数据框分析分析作业的用户。请参阅设置和安全。
- 创建一个数据框分析分析作业。您可以使用 Kibana 中机器学习 > 数据框分析选项卡上的向导,或者使用创建数据框分析分析作业 API。
- 选择
kibana_sample_data_flights
作为源索引。 - 选择
regression
作为作业类型。 - (可选)通过添加一个查询来删除错误的数据,从而提高分析的质量。在本例中,我们省略了距离小于或等于 0 公里的航班。
- 选择
FlightDelayMin
作为因变量,这是我们要预测的字段。 - 将
Cancelled
、FlightDelay
和FlightDelayType
添加到排除字段的列表中。 这些字段将从分析中排除。 建议排除包含错误数据或描述dependent_variable
的字段。 向导包含一个散点图矩阵,使您可以探索数字字段之间的关系。 每个点的颜色受该文档的因变量值的影响,如图例所示。 您可以突出显示其中一个图表中的区域,并且相应的区域也会在其余图表中突出显示。 您可以使用此矩阵来帮助您决定要包含或排除哪些字段进行分析。
90
的训练百分比,这意味着它随机选择 90% 的源数据进行训练。 7. 如果您想试验特征重要性,请在高级配置选项中指定一个值。 在此示例中,我们选择为每个文档返回最多 5 个特征重要性值。 此选项会影响分析的速度,因此默认情况下已禁用。 8. 使用至少 50 MB 的模型内存限制。 如果作业需要的内存超过此数量,则作业将无法启动。 如果节点上的可用内存有限,则此设置可以防止作业执行。 9. 添加作业 ID(例如model-flight-delay-regression
),并可选择添加作业描述。 10. 添加将包含分析结果的目标索引的名称。 在 Kibana 中,索引名称默认与作业 ID 匹配。 它将包含源索引数据的副本,其中每个文档都用结果进行注释。 如果索引不存在,它将自动创建。 - 选择
API 示例
PUT _ml/data_frame/analytics/model-flight-delays-regression
{
"source": {
"index": [
"kibana_sample_data_flights"
],
"query": {
"range": {
"DistanceKilometers": {
"gt": 0
}
}
}
},
"dest": {
"index": "model-flight-delays-regression"
},
"analysis": {
"regression": {
"dependent_variable": "FlightDelayMin",
"training_percent": 90,
"num_top_feature_importance_values": 5,
"randomize_seed": 1000
}
},
"model_memory_limit": "50mb",
"analyzed_fields": {
"includes": [],
"excludes": [
"Cancelled",
"FlightDelay",
"FlightDelayType"
]
}
}
配置作业后,配置详细信息会自动验证。 如果检查成功,您可以继续并启动作业。 如果配置无效,则会显示警告消息。 该消息包含改进配置以进行验证的建议。
- 在 Kibana 中启动作业或使用 启动数据帧分析分析作业 API。
该作业需要几分钟才能运行。 运行时间取决于本地硬件,还取决于分析的文档和字段的数量。 字段和文档越多,作业运行的时间越长。 分析完成后,它会自动停止。
API 示例
POST _ml/data_frame/analytics/model-flight-delays-regression/_start
- 检查作业统计信息以在 Kibana 中跟踪进度或使用 获取数据帧分析分析作业统计信息 API。

作业停止后,结果即可查看和评估。 要了解有关作业阶段的更多信息,请参阅 数据帧分析分析作业的工作原理。
API 示例
GET _ml/data_frame/analytics/model-flight-delays-regression/_stats
API 调用返回以下响应
{
"count" : 1,
"data_frame_analytics" : [
{
"id" : "model-flight-delays-regression",
"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" : 11210,
"test_docs_count" : 1246,
"skipped_docs_count" : 0
},
"memory_usage" : {
"timestamp" : 1599773614155,
"peak_usage_bytes" : 50156565,
"status" : "ok"
},
"analysis_stats" : {
"regression_stats" : {
"timestamp" : 1599773614155,
"iteration" : 18,
"hyperparameters" : {
"alpha" : 19042.721566629778,
"downsample_factor" : 0.911884068909842,
"eta" : 0.02331774683318904,
"eta_growth_rate_per_tree" : 1.0143154178910303,
"feature_bag_fraction" : 0.5504020748926737,
"gamma" : 53.373570122718846,
"lambda" : 2.94058933878574,
"max_attempts_to_add_tree" : 3,
"max_optimization_rounds_per_hyperparameter" : 2,
"max_trees" : 894,
"num_folds" : 4,
"num_splits_per_feature" : 75,
"soft_tree_depth_limit" : 2.945317520946171,
"soft_tree_depth_tolerance" : 0.13448633124842999
},
"timing_stats" : {
"elapsed_time" : 302959,
"iteration_time" : 13075
},
"validation_loss" : {
"loss_type" : "mse"
}
}
}
}
]
}
现在您有了一个新的索引,其中包含源数据的副本,并包含因变量的预测。
在 Kibana 中查看结果时,它以表格格式显示目标索引的内容。 它还提供有关分析详细信息、模型评估指标、总特征重要性值和散点图矩阵的信息。 让我们首先看一下结果表

在本例中,该表显示了因变量 (FlightDelayMin
) 的列,其中包含我们试图预测的实际值。 它还显示了预测值 (ml.FlightDelayMin_prediction
) 的列以及指示文档是否在训练集中使用的列 (ml.is_training
)。 您可以过滤表格以仅显示测试或训练数据,并且可以选择表格中显示的字段。 您还可以启用直方图图表,以更好地了解数据中值的分布。
如果您选择计算特征重要性,则目标索引还包含 ml.feature_importance
对象。 回归分析中包含的每个字段(称为数据点的特征)都会被分配一个特征重要性值。 此值既有大小又有方向(正或负),这表明每个字段如何影响特定预测。 只有最重要的值(在本例中为前 5 个)存储在索引中。 但是,经过训练的模型元数据还包含所有训练数据中每个字段的特征重要性值的平均大小。 您可以在 Kibana 中查看此摘要信息

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

决策路径从基线开始,该基线是训练数据集中所有数据点的预测平均值。 从那里,特征重要性值被添加到决策路径,直到它到达其最终预测。 具有最显着正或负面影响的特征出现在顶部。 因此,在本例中,与飞行距离相关的特征对该特定预测的航班延误影响最大。 这种类型的信息可以帮助您了解模型如何得出其预测。 当您训练和调整模型时,它还可以指示数据集的哪些方面最有影响力或最无用。
如果您不使用 Kibana,您可以使用 获取训练模型 API 查看汇总的特征重要性值,并通过搜索目标索引来查看单个值。
API 示例
GET _ml/inference/model-flight-delays-regression*?include=total_feature_importance,feature_importance_baseline
下面的代码段显示了训练模型元数据中总特征重要性详细信息的示例
{
"count" : 1,
"trained_model_configs" : [
{
"model_id" : "model-flight-delays-regression-1601312043770",
...
"metadata" : {
...
"feature_importance_baseline" : {
"baseline" : 47.43643652716527
},
"total_feature_importance" : [
{
"feature_name" : "dayOfWeek",
"importance" : {
"mean_magnitude" : 0.38674590521018903,
"min" : -9.42823116446923,
"max" : 8.707461689065173
}
},
{
"feature_name" : "OriginWeather",
"importance" : {
"mean_magnitude" : 0.18548393012368913,
"min" : -9.079576266629092,
"max" : 5.142479101907649
}
...
- 特征重要性决策路径的基线。 它是所有训练数据中预测值的平均值。
- 所有训练数据中
dayOfWeek
字段的绝对特征重要性值的平均值。 - 此字段所有训练数据的最小特征重要性值。
- 此字段所有训练数据的最大特征重要性值。
要查看每个预测的最高特征重要性值,请搜索目标索引。 例如
GET model-flight-delays-regression/_search
下面的代码段显示了带有注释结果的文档的一部分
...
"DestCountry" : "CH",
"DestRegion" : "CH-ZH",
"OriginAirportID" : "VIE",
"DestCityName" : "Zurich",
"ml": {
"FlightDelayMin_prediction": 277.5392150878906,
"feature_importance": [
{
"feature_name": "DestCityName",
"importance": 0.6285966753441136
},
{
"feature_name": "DistanceKilometers",
"importance": 84.4982943868267
},
{
"feature_name": "DistanceMiles",
"importance": 103.90011847132116
},
{
"feature_name": "FlightTimeHour",
"importance": 3.7119156097309345
},
{
"feature_name": "FlightTimeMin",
"importance": 38.700587425831365
}
],
"is_training": true
}
...
最后,Kibana 在结果中提供了一个散点图矩阵。 它具有与您在作业向导中看到的矩阵相同的功能。 它的目的是同样帮助您可视化和探索数据中数字字段和因变量之间的关系。
虽然您可以查看单个结果并将预测值 (ml.FlightDelayMin_prediction
) 与实际值 (FlightDelayMins
) 进行比较,但您通常需要评估整个回归模型的成功程度。
Kibana 提供训练误差指标,这些指标代表模型在训练数据集上的表现。 它还提供泛化误差指标,这些指标代表模型在测试数据上的表现。

均方误差 (MSE) 为零意味着模型可以完全准确地预测因变量。 这是理想的,但通常是不可能的。 同样,R 平方值为 1 表示因变量的所有方差都可以用特征变量来解释。 通常,您会比较来自多个回归模型的 MSE 和 R 平方值,以找到数据的最佳平衡或拟合。
有关解释评估指标的更多信息,请参阅 6. 评估结果。
您也可以使用 数据帧分析评估 API 生成这些指标。
API 示例
POST _ml/data_frame/_evaluate
{
"index": "model-flight-delays-regression",
"query": {
"bool": {
"filter": [{ "term": { "ml.is_training": true } }]
}
},
"evaluation": {
"regression": {
"actual_field": "FlightDelayMin",
"predicted_field": "ml.FlightDelayMin_prediction",
"metrics": {
"r_squared": {},
"mse": {},
"msle": {},
"huber": {}
}
}
}
}
- 仅通过评估训练数据来计算训练误差。
- 包含实际(基本事实)值的字段。
- 包含预测值的字段。
API 返回如下响应
{
"regression" : {
"huber" : {
"value" : 30.216037330465102
},
"mse" : {
"value" : 2847.2211476422967
},
"msle" : {
"value" : "NaN"
},
"r_squared" : {
"value" : 0.6956530017255125
}
}
}
接下来,我们计算泛化误差
POST _ml/data_frame/_evaluate
{
"index": "model-flight-delays-regression",
"query": {
"bool": {
"filter": [{ "term": { "ml.is_training": false } }]
}
},
"evaluation": {
"regression": {
"actual_field": "FlightDelayMin",
"predicted_field": "ml.FlightDelayMin_prediction",
"metrics": {
"r_squared": {},
"mse": {},
"msle": {},
"huber": {}
}
}
}
}
- 仅评估不属于训练数据的文档。
当您训练出一个令人满意的模型后,您可以部署它来预测新数据。
如果您不想保留数据框分析任务,您可以将其删除。例如,使用 Kibana 或 删除数据框分析任务 API。在 Kibana 中删除数据框分析任务时,您可以选择同时删除目标索引和数据视图。