厉害了!使用Elastic的有监督机器学习进行二元分类

7.6版本的Elastic Stack提供了端到端机器学习管道所需的最后一块拼图。此前,机器学习专注于无监督技术与异常检测。然而,在7.x版本中,已经发布了几个功能。在7.2中,Elasticsearch发布了用于将原始索引转化为特征索引的Transforms。然后7.3、7.4和7.5分别发布了异常值检测回归分类。最后在7.6中,你可以使用回归和分类模型与推理ingest处理器来丰富文档。所有这些一起为端到端机器学习管道建立起了闭环。所有这些都可以在Elastic Stack中进行。

为什么要进行有监督的机器学习?

有监督式机器学习从标记的数据中训练模型。这与无监督学习不同,在无监督学习中,模型从尚未标记的数据中学习。在data frame analytics中,我们为您提供了创建监督模型的工具集,而无需了解底层算法。然后,您可以使用训练后的模型对未观察到的数据进行预测(通过推理)。模型应用它通过训练学到的东西来提供预测。

为什么要用这个而不是异常检测?异常检测是无监督学习的一个例子,它在学习模式和预测基于时间序列数据的指标方面非常出色。这对于许多用例来说都很强大,但如果我们想通过检测可疑域来识别不良行为者呢?自动检测语言并应用适当的分析器来更好地搜索呢?

这些用例需要更丰富的特征集来提供准确的预测。它们使用已知的例子从中学习。意思是,存在一个训练数据集,其中的数据被标记为正确的预测。Transforms提供了构建复杂特征集所需的工具。data frame analytics可以训练有监督的机器学习模型。我们可以使用这两者来部署流数据上的特征生成和监督模型的生产使用。

有监督学习实例:二元分类

让我们从头开始建立和使用一个二元分类模型。不要被吓到,这里数据科学的学位不是必要的。我们将使用Elastic Stack中的构建模块来创建我们的特征集,训练我们的模型,并将其部署在一个摄取管道中执行推理。使用 ingest 处理器可以让我们的数据在被索引之前被模型的预测所丰富。

在这个例子中,我们将根据客户元数据和通话记录的特征来预测电信客户是否有可能流失。我们将使用已流失和未流失客户的例子作为训练数据集。

设置您的环境

首先,我们要获得原始数据集。下载calls.csvcustomers.csv文件,并通过CSV上传功能加载但ES中。数据来源于不同来源引用的数据集:openmlkaggleLarose 2014。这个数据集被分解成行,并添加了随机特征。电话号码和其他数据都是捏造的,与真实数据的任何相似之处都是巧合。

上传后,你的数据应该是这样的。

customers索引:

{
  "column1" : 0,
  "number_vmail_messages" : 25,
  "account_length" : 128,
  "churn" : 0,
  "customer_service_calls" : 1,
  "voice_mail_plan" : "yes",
  "phone_number" : "415-382-4657",
  "state" : "KS",
  "international_plan" : "no"
}

call索引:

{
  "column1" : 20000,
  "dialled_number" : "408-408-6496",
  "call_charges" : 0.1980211744513012,
  "call_duration" : 2.0445331385440126,
  "@timestamp" : "2019-08-08T13:49:06.850-04:00",
  "phone_number" : "408-365-9011",
  "timestamp" : "2019-08-08 13:49:06.850150"
}

建立特征集

首先,我们要构建出我们的特征集。我们有两个数据来源:客户元数据和通话记录。这就需要使用Transformsenrich processor。这种组合使我们能够将元数据与呼叫信息一起合并到另一个索引中。

以下是enrich的策略和pipeline。(在Kibana开发控制台中执行命令)

# Enrichment policy for customer metadata
PUT /_enrich/policy/customer_metadata
{
    "match": {
        "indices": "customers",
        "match_field": "phone_number",
        "enrich_fields": ["account_length", "churn", "customer_service_calls", "international_plan","number_vmail_messages", "state", "voice_mail_plan"]
    }
}
# Execute the policy so we can populate with the metadata
POST /_enrich/policy/customer_metadata/_execute
# Our enrichment pipeline for generating features
PUT _ingest/pipeline/customer_metadata
{
  "description": "Adds metadata about customers by phone_number", 
  "processors": [
      {
        "enrich": {
          "policy_name": "customer_metadata",
          "field": "phone_number",
          "target_field": "customer",
          "max_matches": 1
        }
      }
    ]
}

接下来,我们可以建立一个利用我们新的Transform任务。下面是Transform的定义。

# transform for enriching the data for training
PUT _transform/customer_churn_transform
{
 "source": {
   "index": [
     "calls"
   ]
 },
 "dest": {
   "index": "churn",
   "pipeline": "customer_metadata"
 },
 "pivot": {
   "group_by": {
     "phone_number": {
       "terms": {
         "field": "phone_number"
       }
     }
   },
   "aggregations": {
     "call_charges": {
       "sum": {
         "field": "call_charges"
       }
     },
     "call_duration": {
       "sum": {
         "field": "call_duration"
       }
     },
     "call_count": {
       "value_count": {
         "field": "dialled_number"
       }
     }
   }
 }
}

现在创建了transform,我们可以启动它,并在堆栈管理下的transform页面上查看它的进度。

在这里插入图片描述
我们已经建立了通话费、通话次数和通话时长的总和。这些特征与我们的客户元数据结合起来,应该足以建立一个流失预测模型。

我们的特征集中一共有九个特征,其中三个是分类特征。此外,我们还有customer.churn这个字段。这代表了过去流失的客户的历史数据。它将是我们的监督学习利用的标签,以建立我们的预测模型。

在这里插入图片描述

建立模型

一旦我们有了我们的特征集,我们就可以开始建立我们的监督模型。我们将根据我们的客户呼叫数据来预测流失率。

注意:需要一个索引模式来引用新的透视数据(pivot data)。可用index pattern为churn*。

导航到Kibana中机器学习应用中的Data Frame Analytics标签。

要创建作业,我们需要:

在这里插入图片描述

  • 选择 "classification "工作类型,预测两类 "流失 "情况
  • 给工作一个独特的ID
  • 添加一个漂亮的描述
  • 指定训练数据的存放位置
  • 指定我们的预测将被写在哪里

现在我们的任务的元数据已经出来了,让我们选择我们的特征值和training:

在这里插入图片描述

  • 因变量是 “customer.churn”,因为这正是我们要预测的。
  • 保持默认的80%的训练百分比就可以了。
  • 我们应该排除我们知道不会添加信息的字段。在这种情况下,"customer.phone_number "和 "phone_number "是每个条目唯一的,不包含有用的信息。
  • 保持模型的内存限制不变。这允许作业执行器在至少能支持这个内存量的节点上执行。

这个分析作业将确定以下内容:

  • 每个特征值的最佳编码
  • 哪些特征值可以提供最好的信息,哪些应该被忽略?
  • 建立最佳模型的最佳超参数(hyperparameters)

一旦它完成运行,我们可以看到给定其测试和训练数据的模型错误率
在这里插入图片描述

准确率相当高! 如果你跟着做这个例子,你的数据可能会略有不同。因为当模型被训练时,它使用数据的随机子集进行训练和测试,会有偏差。

我们现在有一个模型,可以在ingest pipeline中使用。

使用该模型

因为我们知道是哪个数据框架分析作业创建了这个模型,所以我们可以通过这个API调用看到它的ID和各种设置。

GET _ml/inference/customer_churn*?human=true

有了模型ID,我们现在可以进行预测了。我们通过transform建立了原始特征集。我们将对所有通过inference processor发送的数据进行同样的处理。

# Enrichment + prediction pipeline
# NOTE: model_id will be different for your data
PUT _ingest/pipeline/customer_churn_enrich_and_predict
{
  "description": "enriches the data with the customer info if known and makes a churn prediction", 
  "processors": [
      {
        "enrich": {
          "policy_name": "customer_metadata",
          "field": "phone_number",
          "target_field": "customer",
          "max_matches": 1,
          "tag": "customer_data_enrichment"
        }
      },
      {
        "inference": {
          "model_id": "customer_churn-1581693287679",
          "inference_config": {
            "classification": {}
          },
          "field_map": {},
          "tag": "chrun_prediction"
        }
      }
    ]
}

然后对所有的流进行连续的transform:

PUT _transform/continuous-customer-churn-prediction
{
 "sync": {
   "time": {
     "field": "@timestamp",
     "delay": "10m"
   }
 },
 "source": {
   "index": [
     "calls"
   ]
 },
 "dest": {
   "index": "churn_predictions",
   "pipeline": "customer_churn_enrich_and_predict"
 },
 "pivot": {
   "group_by": {
     "phone_number": {
       "terms": {
         "field": "phone_number"
       }
     }
   },
   "aggregations": {
     "call_charges": {
       "sum": {
         "field": "call_charges"
       }
     },
     "call_duration": {
       "sum": {
         "field": "call_duration"
       }
     },
     "call_count": {
       "value_count": {
         "field": "dialled_number"
       }
     }
   }
 }
}

当transform看到新的数据时,它会创建我们的特征集,并针对模型进行推断。预测与丰富的数据一起被索引到churn_predictions中。这一切都在持续发生。随着新的客户呼叫数据的到来,transform会更新我们的流失预测。这些预测是索引中的数据。这意味着我们可以通过警报进行操作,用Lens构建可视化,或者构建一个自定义的仪表板。

结论

现在可以在Elastic内部进行数据管道化,用于创建特征、模型训练和模型推理。这意味着Elastic APM、SIEM或日志中的数据可以用来构建监督式机器学习模型。这为安全、可观察性、物流或好奇心方面的许多用例打开了大门。今天就使用免费试用版中尝试一下新的机器学习功能吧。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页