Elasticsearch 機械学習は、データ内の異常を自動的に見つけ、トレンドを予測するのに役立ちます。このチュートリアルでは、教師なし機械学習と教師あり機械学習の両方を使用して、ビジネスデータからインサイトを得る方法を説明します。Web トラフィックを監視するための異常検知ジョブと、フライト遅延を予測するための回帰モデルを作成します。
背景情報
Elasticsearch の機械学習には、教師なし機械学習と教師あり機械学習という 2 つの主要な種類があります。
-
教師なし機械学習には、異常検知などの手法が含まれます。このモードでは、機械学習アルゴリズムが、異常とは何かを事前にトレーニングすることなく、データ内の通常とは異なるパターンを自動的に見つけます。
-
教師あり機械学習には、回帰や分類などの手法が含まれます。このモードでは、ラベル付けされたデータセットでモデルをトレーニングします。その後、トレーニング済みモデルを使用して予測を行ったり、新しいデータを分類したりできます。
|
カテゴリ |
ユースケース |
タイプ |
説明 |
|
異常検知 |
単一メトリックベースの検知 |
教師なし |
1 つのインデックスフィールドを分析し、単一の時系列における異常を検知します。 |
|
複数メトリックベースの検知 |
教師なし |
1 つ以上のメトリックを使用して異常を検知し、複数のインデックスフィールドにまたがって分析を分割できます。 |
|
|
母集団 |
教師なし |
エンティティの挙動を母集団の挙動と比較して異常を検知します。 母集団とは、結論を導き出したい個人、イベント、または項目のグループ全体を指します。 |
|
|
高度 |
教師なし |
高度なユースケース向けに、機械学習ジョブをカスタマイズおよび最適化するための追加オプションを提供します。 |
|
|
Categorization |
教師なし |
ログメッセージ内のパターンを特定し、類似するメッセージをグループ化して、通常とは異なるエントリを検知します。 |
|
|
データフレーム分析 |
外れ値検出 |
教師なし |
クラスタリングを使用して、データの大部分と比較して通常とは異なるデータポイントを特定します。 |
|
回帰 |
教師あり |
各データポイントについて数値を予測します。 |
|
|
分類 |
教師あり |
各データポイントが属するクラスを予測します。 |
事前準備
-
Alibaba Cloud Elasticsearch クラスターを作成します。このチュートリアルでは Elasticsearch バージョン 8.5 のクラスターを使用します。詳細については、「Create an Alibaba Cloud Elasticsearch cluster」をご参照ください。
説明機械学習機能は、Elasticsearch のバージョンによって異なる場合があります。詳細については、公式ドキュメント「What is Elastic Machine Learning?」をご参照ください。
-
Kibana コンソールにログオンします。詳細については、「Log on to the Kibana console」をご参照ください。
-
サンプルデータセットを追加します。
-
Kibana ホームページで、[Get started by adding integrations] の下にある [Try sample data] をクリックします。
-
[Sample data] タブで、[Other sample data sets] をクリックします。
-
サンプル フライト データとサンプル Web ログの両方のデータセットで、データの追加 をクリックします。
データの追加 ボタンが データを表示 に変わると、データセットが追加されます。 サンプルデータを追加すると、
kibana_sample_data_flightsとkibana_sample_data_logsインデックスが自動的に作成されます。
-
機械学習ジョブの作成
このチュートリアルでは、教師なし機械学習と教師あり機械学習を示す 2 つの例を使用します。
単一メトリックの異常検知ジョブの作成
このセクションでは、単一メトリックベースの検知を使用して、教師なし機械学習ジョブを作成します。このデータを分析すると、ユーザーアクセスのパターンを把握し、Web サイトのパフォーマンスを最適化し、通常とは異なるアクセスアクティビティを検知できます。
次の例は、Sample web logs データセットのデータレコードを示しています。
{
"_index": "kibana_sample_data_logs",
"_type": "_doc",
"_id": "n6GHI4gBmNQSVxOwNnPn",
"_version": 1,
"_score": null,
"_source": {
"agent": "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24",
"bytes": 847,
"clientip": "122.62.233.59",
"extension": "",
"geo": {
"srcdest": "CN:CO",
"src": "CN",
"dest": "CO",
"coordinates": {
"lat": 31.24905556,
"lon": -82.39530556
}
},
"host": "www.elastic.co",
"index": "kibana_sample_data_logs",
"ip": "122.62.233.59",
"machine": {
"ram": 4294967296,
"os": "win xp"
},
"memory": null,
"message": "122.62.233.59 - - [2023-06-06T02:34:54.901Z] \"GET /logging HTTP/1.1\" 200 847 \"-\" \"Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24\"",
"phpmemory": null,
"referer": "http://twitter.com/success/paul-w-richards",
"request": "/logging",
"response": 200,
"tags": [
"success",
"info"
],
"timestamp": "2023-06-06T02:34:54.901Z",
"url": "https://www.elastic.co/solutions/logging",
"utc_time": "2023-06-06T02:34:54.901Z",
"event": {
"dataset": "sample_web_logs"
}
},
"fields": {
"@timestamp": [
"2023-06-06T02:34:54.901Z"
],
"utc_time": [
"2023-06-06T02:34:54.901Z"
],
"hour_of_day": [
2
],
"timestamp": [
"2023-06-06T02:34:54.901Z"
]
},
"sort": [
1686018894901
]
}
transform を使用して、生データを上位レベルのメトリックや統計に集計することもできます。これらの集計を新しいインデックスに格納すると、クエリパフォーマンスが向上し、他の機械学習ジョブ向けのクリーンなデータソースを提供できます。
-
Kibana の左側のナビゲーションペインで、メニューアイコン
をクリックし、Kibana > Kibana の順にクリックします。 -
左側のナビゲーションペインで、 をクリックします。
-
[Anomaly Detection jobs] ページで、[Create job] をクリックします。
-
kibana_sample_data_logs データビューを選択します。
-
[Create a job from the data view Kibana Sample Data Logs] ページの [Use a wizard] セクションで、[Single metric] をクリックします。
-
単一メトリックジョブを設定します。
-
時間範囲には、[すべてのデータを使用] を選択し、Next step をクリックします。
説明サンプルデータセットには少量のデータしか含まれていないため、
kibana_sample_data_logsデータセット全体を使用します。 -
フィールドにはCount(イベントレート)を選択します。バケットスパンとスパースデータの設定を行い、Next stepをクリックします。
説明メトリックとして
Count (Event rate)を使用すると、異常検知ジョブはサーバーが 1 秒あたりに応答するリクエスト数を監視できます。-
バケットスパン:分析のために時系列データを集計する時間間隔です。データと分析要件に基づいてこの値を調整します。
-
スパースデータ:データが存在しないバケットを異常として扱うかどうかを指定します。
-
-
ジョブ IDと[ジョブの説明]を入力し、次に Next stepをクリックします。
-
ジョブが検証に合格すると、Next step をクリックします。
-
-
ページ下部で、[Create job] をクリックします。
Elasticsearch はデータを時系列順にリプレイし、モデルを構築して、その後のデータをモデルに照らして評価します。
説明ジョブの検証と作成に必要な時間は、ソースインデックスのサイズによって異なります。
-
ジョブが作成されたら、左下隅の [View Results] をクリックします。
-
Single time series analysis of count の横にある情報アイコン
をクリックして、分析の詳細を確認します。 -
タイムラインの端をドラッグするか、タイムラインを移動して、異常検知の対象となる時間範囲を選択します。
-
右側パネルで、[Forecast] をクリックして将来の値を予測します。
右パネルには、チャートの表示内容を制御するための[モデル境界の表示]、[アノテーション]、[予測の表示]という 3 つのチェックボックスがあります。チャートでは、実測値は青色の実線、モデル境界は水色の網掛け領域、予測区間は黄色の網掛け領域として表示されます。チャートの下の[異常] セクションでは、検出された異常データポイントが、時刻、重大度、検出器、実測値、標準値、説明、アクションを列に持つテーブルに一覧表示されます。
-
回帰モデルの作成と使用
フライト遅延予測モデルのトレーニング
このセクションでは、回帰を使用して教師あり機械学習モデルをトレーニングします。この予測により、航空会社と乗客はフライトやスケジュールをより適切な計画を立てられるようになります。
次の例は、Sample flight data データセットのデータレコードを示しています。
{
"_index": "kibana_sample_data_flights",
"_type": "_doc",
"_id": "7b0aeogBmNQSVxOwslB_",
"_version": 1,
"_score": null,
"_source": {
"FlightNum": "QYX9S3I",
"DestCountry": "CH",
"OriginWeather": "Cloudy",
"OriginCityName": "Chicago",
"AvgTicketPrice": 824.8516378170061,
"DistanceMiles": 4442.909325899777,
"FlightDelay": false,
"DestWeather": "Thunder & Lightning",
"Dest": "Zurich Airport",
"FlightDelayType": "No Delay",
"OriginCountry": "US",
"dayOfWeek": 4,
"DistanceKilometers": 7150.1694661808515,
"timestamp": "2023-06-02T07:28:15",
"DestLocation": {
"lat": "47.464699",
"lon": "8.54917"
},
"DestAirportID": "ZRH",
"Carrier": "Logstash Airways",
"Cancelled": false,
"FlightTimeMin": 420.59820389299125,
"Origin": "Chicago O'Hare International Airport",
"OriginLocation": {
"lat": "41.97859955",
"lon": "-87.90480042"
},
"DestRegion": "CH-ZH",
"OriginAirportID": "ORD",
"OriginRegion": "US-IL",
"DestCityName": "Zurich",
"FlightTimeHour": 7.009970064883188,
"FlightDelayMin": 0
}
}
-
Kibana の左側のナビゲーションペインで、メニューアイコン
をクリックし、次に Kibana>[Machine learning] をクリックします。 -
左側のナビゲーションペインで、データフレーム分析 > 宿題 をクリックします。
-
[Data frame analytics jobs] ページで、[Create job] をクリックします。
-
kibana_sample_data_flights データビューを選択します。
-
[ジョブの作成] ページの 設定 セクションで、ジョブパラメーターを設定します。
-
分析タイプとして [Regression] を選択します。
-
[Dependent variable] で
FlightDelayMinを選択します。これは、モデルが予測するように学習するフィールドです。 -
含めるフィールドから、
Cancelled、FlightDelay、FlightDelayTypeフィールドを除外します。これらのフィールドは結果と直接関連しています。これらを含めるとモデルが過学習し、新しいデータに対する予測精度が低下します。
-
トレーニングの割合を調整します。
この設定は、データをトレーニングセットとテストセットに分割します。このチュートリアルでは、トレーニングの割合として 90% を使用します。
説明トレーニング時間はデータ量に応じて増加します。非常に大きなデータセットの場合は、50% などの小さめのトレーニングの割合から開始し、トレーニング時間とモデル精度のバランスを取りながら必要に応じて調整してください。
-
-
続行 をクリックし、[追加オプション] を設定します。
-
[Number of top feature importance values] を 5 に設定します。これにより、予測に最も寄与する上位 5 つの特徴量が計算され、特徴量の選択やジョブの最適化に役立ちます。
-
[Prediction field name] を
FlightDelayMin_predictionに設定します。これは、予測結果を格納するフィールド名を指定します。 -
[Use estimated model memory limit] チェックボックスをオフにし、[Model memory limit] を 500 MB に設定します。これは、ジョブが使用できる最大メモリを指定します。大規模データセットに対する複雑なジョブは大量のメモリを消費する場合があります。ジョブがこの上限を超えると、失敗したりパフォーマンスが低下したりする可能性があります。
-
スレッド最大数 を 1 に設定します。このパラメーターは、トレーニングジョブの最大スレッド数を指定します。スレッド数が多すぎると、メモリの問題やシステムの不安定化を引き起こす可能性があります。
-
続行 をクリックし、ジョブ ID を
flightdelaymin_jobに設定します。 -
続行 をクリックしてジョブ設定を検証します。
-
検証に合格すると、続行 をクリックします。
-
Create セクションで、Create をクリックしてジョブを開始します。
ジョブの作成に必要な時間は、トレーニングデータの量によって異なります。
-
-
ジョブが完了したら、[View Results] をクリックして分析結果を確認します。
[Model evaluation] セクションで、モデルのパフォーマンスを確認できます。
-
汎化誤差:新規の未知データに対するモデルの性能を測定します。汎化誤差が低いほど、未知データに対するモデルの精度が高いことを示します。
-
訓練誤差:トレーニングデータセットに対するモデルの性能を測定します。訓練誤差が低いほど、モデルがトレーニングデータに適合していることを示します。
-
評価指標:
-
平均二乗誤差:回帰の性能を評価するうえで重要な指標です。実測値と予測値の差を二乗した値の平均です。値が小さいほど予測精度が高いことを示します。
-
R 2乗:モデルがデータにどの程度適合しているかを示す指標です。値が 1 に近いほど適合度が高いことを示します。一般的に 0.8 を超えると良好な適合と見なされます。
-
平均二乗対数誤差:実測値と予測値の対数の差を二乗した値の平均です。値が小さいほど予測性能が高いことを示します。
説明複数の回帰モデルを比較する場合は、平均二乗誤差と R 2乗 の両方の値を考慮し、データセットに最も適合するモデルを選択してください。
-
平均二乗誤差が 0、または R 2乗 が 1 になることは通常ありません。モデルの予測は、完全には考慮できない多くの要因の影響を受けるためです。
-
平均二乗対数誤差が
NaN(Not a Number) となる場合、実測値または予測値が 0 以下 (負の数または 0) であったことを意味します。
詳細については、「Evaluating data frame analytics」をご参照ください。
-
-
トレーニング済みモデルを使用した推論
インジェストパイプライン内の推論プロセッサを使用して、トレーニング済みのフライト遅延モデルで予測を行います。
-
Kibana の左側のナビゲーションペインで、メニューアイコン
をクリックし、次に [管理] > Developer Tools をクリックします。 -
コンソールで、次のコマンドを実行し、
model_idを見つけて記録します。GET _ml/inference/flightdelaymin_job*?human=trueこのコマンドは、
flightdelaymin_jobに一致するジョブの推論分析結果をすべてクエリし、人が読みやすい形式で出力を返します。flightdelaymin_jobは、回帰ジョブの作成時に定義したジョブ ID です。 -
推論プロセッサとトレーニング済みモデルを使用するインジェストパイプラインを作成します。
説明コマンド内の
model_idを、前の手順で取得した値に置き換えてください。PUT _ingest/pipeline/flight_flightDelayMin_predict { "description": "Predict the number of minutes of delay for each flight", "processors": [ { "inference": { "model_id": "flightDelayMin_job-168609891****", "inference_config": { "regression": {} }, "field_map": {}, "tag": "flightDelayMin_prediction" } } ] } -
パイプラインをシミュレートし、
FlightDelayMinをターゲット変数として、新しいデータに対する予測を行います。POST _ingest/pipeline/flight_flightDelayMin_predict/_simulate { "docs": [ { "_source": { "FlightNum": "EDGSV3T", "DestCountry": "CN", "OriginWeather": "Damaging Wind", "OriginCityName": "Durban", "AvgTicketPrice": 1065.7037805199147, "DistanceMiles": 7273.460817641552, "FlightDelay": true, "DestWeather": "Rain", "Dest": "Shanghai Pudong International Airport", "FlightDelayType": "Carrier Delay", "OriginCountry": "ZA", "dayOfWeek": 5, "DistanceKilometers": 11705.500526106527, "timestamp": "2023-06-03T09:34:00", "DestLocation": { "lat": "31.14340019", "lon": "121.8050003" }, "DestAirportID": "PVG", "Carrier": "Kibana Airlines", "Cancelled": false, "FlightTimeMin": 881.1071804361806, "Origin": "King Shaka International Airport", "OriginLocation": { "lat": "-29.61444444", "lon": "31.11972222" }, "DestRegion": "CN-SH", "OriginAirportID": "DUR", "OriginRegion": "ZA-KZN", "DestCityName": "Shanghai", "FlightTimeHour": 14.685119673936343, "FlightDelayMin": 45 } } ] }結果は次のとおりです。
"flightDelayMin_prediction" : { "FlightDelayMin_prediction" : 50.278760382477095, "feature_importance" : [ { "feature_name" : "FlightTimeMin", "importance" : 43.5994522867254 }, { "feature_name" : "DistanceKilometers", "importance" : -16.095227076624866 }, { "feature_name" : "DistanceMiles", "importance" : -15.496369672570939 }, { "feature_name" : "OriginAirportID", "importance" : -5.120423036009302 }, { "feature_name" : "FlightTimeHour", "importance" : 3.944654321505046 } ], "model_id" : "flightdelaymin_job3-1686721092815" }実際のフライト遅延 (
FlightDelayMin) は 45 分で、予測された遅延 (FlightDelayMin_prediction) は 50.28 分です。これは近い推定値です。feature_importanceオブジェクトは、予測に最も寄与した上位 5 つの要因として、FlightTimeMin、DistanceKilometers、DistanceMiles、OriginAirportID、FlightTimeHourを示しています。この情報を使用して、フライト遅延に影響する要因をより深く理解し、必要に応じてモデルを改善できます。