ホームページ  >  記事  >  テクノロジー周辺機器  >  時系列予測に XGBoost と InluxDB を使用する方法

時系列予測に XGBoost と InluxDB を使用する方法

王林
王林転載
2023-04-04 12:40:071685ブラウズ

XGBoost は、さまざまな予測問題を解決するために使用できる、人気のあるオープンソースの機械学習ライブラリです。時系列予測のために InfluxDB と組み合わせて使用​​する方法を理解する必要があります。

翻訳者 | Li Rui

レビュー者 | Sun Shujuan

XGBoost は、最適化された分散勾配ブースティング アルゴリズムを実装するオープンソースの機械学習ライブラリです。 XGBoost は並列処理を使用して高速なパフォーマンスを実現し、欠損値を適切に処理し、小さなデータセットでも適切にパフォーマンスを発揮し、過剰適合を防ぎます。これらすべての利点により、XGBoost は予測などの回帰問題に対する一般的なソリューションになっています。

予測は、予測分析、予知保全、製品計画、予算編成などのさまざまなビジネス目標にとってミッションクリティカルです。多くの予測または予測の問題には、時系列データが関係します。このため、XGBoost はオープン ソースの時系列データベース InfluxDB の優れたパートナーになります。

このチュートリアルでは、XGBoost の Python パッケージを使用して InfluxDB 時系列データベースからデータを予測する方法を学習します。また、InfluxDB Python クライアント ライブラリを使用して InfluxDB からデータをクエリし、そのデータを Pandas DataFrame に変換して、予測を行う前に時系列データの操作を容易にします。さらに、XGBoost の利点についてさらに詳しく説明します。

1. 要件

このチュートリアルは、Homebrew を通じて Python 3 がインストールされた macOS システムで実行されます。 Python とクライアントのインストールを簡素化するために、virtualenv、pyenv、conda-env などの追加ツールをセットアップすることをお勧めします。それ以外の場合、完全な要件は次のとおりです:

  • influxdb-client=1.30.0
  • pandas = 1.4.3
  • xgboost>=1.7.3
  • influxdb-client>=1.30.0
  • pandas>=1.4.3
  • matplotlib>=3.5.2
  • sklearn>=1.1.1

このチュートリアルでは、無料枠の InfluxDB クラウド アカウントがあり、バケットとトークンが作成されていることも前提としています。バケットはデータベース、または InfluxDB の最高レベルのデータ組織であると考えてください。このチュートリアルでは、NOAA という名前のバケットが作成されます。

2. デシジョン ツリー、ランダム フォレスト、および勾配強化

XGBoost とは何かを理解するには、デシジョン ツリー、ランダム フォレスト、および勾配強化を理解する必要があります。デシジョン ツリーは、一連の機能テストで構成される教師あり学習方法です。各ノードはテストであり、すべてのノードはフローチャート構造に編成されています。ブランチは、どのリーフ ラベルまたはクラス ラベルが入力データに割り当てられるかを最終的に決定する条件を表します。

時系列予測に XGBoost と InluxDB を使用する方法

# 機械学習の決定木は、明日雨が降るかどうかを判断するために使用されます。デシジョン ツリーのコンポーネント (葉、枝、ノード) を示すように編集されました。

デシジョン ツリー、ランダム フォレスト、および勾配ブースティングの背後にある基本原理は、複数の「弱学習器」または分類器が連携して強力な予測を行うということです。

ランダム フォレストには複数のデシジョン ツリーが含まれています。デシジョン ツリー内の各ノードは弱学習器とみなされ、ランダム フォレスト内の各デシジョン ツリーは、ランダム フォレスト モデル内の多数の弱学習器の 1 つとみなされます。通常、すべてのデータはランダムにサブセットに分割され、異なるデシジョン ツリーを通過します。

デシジョン ツリーとランダム フォレストを使用した勾配ブースティングは似ていますが、構造方法が異なります。勾配ブースト ツリーにはデシジョン ツリー フォレストも含まれていますが、これらのデシジョン ツリーは追加で構築され、すべてのデータはデシジョン ツリー アンサンブルを介して渡されます。勾配ブースティング ツリーは、離散値 (猫や犬など) の分類ツリーを含む一連の分類ツリーまたは回帰ツリーで構成されている場合があります。回帰木は連続値 (0 ~ 100 など) に使用されます。

3. XGBoost とは何ですか?

勾配ブースティングは、分類と予測に使用される機械学習アルゴリズムです。 XGBoost は、極端なタイプの勾配ブースティングです。極端に言うと、並列処理の力によって勾配ブースティングをより効率的に実行できます。 XGBoost ドキュメントからの以下の画像は、誰かがビデオ ゲームを気に入るかどうかを予測するために勾配ブースティングを使用する方法を示しています。

時系列予測に XGBoost と InluxDB を使用する方法

#誰かがビデオゲームを好きになる可能性が高いかどうかを判断するために 2 つの決定ツリーが使用されます。両方のツリーのリーフ スコアを加算して、どちらがビデオ ゲームを楽しむ可能性が最も高いかを判断します。

XGBoost の利点:

  • 比較的理解しやすい。
  • 特徴がほとんどない、小規模で構造化された通常のデータに適しています。

XGBoost のいくつかの欠点:

  • 過学習しやすく、外れ値に敏感です。予測には、XGBoost の時系列データのマテリアライズド ビューを使用することをお勧めします。
  • スパースなデータや教師なしデータではパフォーマンスが低下します。

4. 時系列予測に XGBoost を使用する

ここで使用される空気センサーのサンプル データ セットは、InfluxDB によって提供されます。このデータセットには、複数のセンサーからの温度データが含まれています。次のようなデータを使用して、単一センサーの温度予測が作成されています。

時系列予測に XGBoost と InluxDB を使用する方法

次の Flux コードを使用して、単一の時系列のデータセットとフィルターをインポートします。 (Flux は InfluxDB のクエリ言語です)

import "join"

import "influxdata/influxdb/sample"

//データセットは 10 秒間隔の定期的な時系列です

data = sample.data(set: "airSensor")

|>filter(fn: (r) => r._field == "温度" および r.sensor_id = = "TLM0100")

ランダム フォレストと勾配ブースティングは時系列予測に使用できますが、データを教師あり学習に変換する必要があります。これは、時系列データを教師あり学習セットに変換するには、スライディング ウィンドウ アプローチまたはゆっくりとしたアプローチでデータを前進させる必要があることを意味します。データは Flux で準備することもできます。理想的には、最初に自己相関分析を実行して、使用する最適な方法を決定する必要があります。簡潔にするために、次の Flux コードを使用してデータを定期的に移動します。

import "join"

import "influxdata/influxdb/sample"

data = sample.data(set: "airSensor")

|> ; filter(fn: (r) => r._field == "温度" および r.sensor_id == "TLM0100")

shiftedData = data

|> timeShift(duration : 10 秒、列: ["_time"] )

join.time(左: データ、右:ShiftedData、as: (l, r) => ({l with data: l._value,shiftData : r._value}))

|>drop(列: ["_measurement", "_time", "_value", "sensor_id", "_field"])

#左右にスワイプして完全なコードを表示します

時系列予測に XGBoost と InluxDB を使用する方法

追加のラグ データをモデル入力に追加する場合は、代わりに次の Flux ロジックに従うことができます。

import "experimental"


import "influxdata/influxdb/sample"

data = sample.data(set: "airSensor")

|> ; filter(fn: (r) => r._field == "温度" および r.sensor_id == "TLM0100")



shiftedData1 = data

|> timeShift(期間: 10 秒、列: ["_time"] )

|> set(キー: "シフト" 、値: "1" )


#shiftedData2 = data

|> timeShift(duration: 20s , columns: ["_time"] )

|> set(key: "shift" , value: "2" )



shiftedData3 = data

|> timeShift(期間: 30 秒、列: ["_time"] )

|> set(キー: "shift" 、値: "3")



shiftedData4 = data

|> timeShift(期間: 40 秒、列: ["_time"] )

|> set(key: "shift" , value: "4")


##union(tables: [shiftedData1,ShiftedData2,shiftedData3,shiftData4])

|> pivot(rowKey:["_time"], columnKey: ["shift"], valueColumn: "_value")

|>drop(columns: ["_measurement", " _time", "_value", "sensor_id", "_field"])

// NaN 値を削除します

|>limit(n:360)

| > tail(n: 356)


さらに、前方検証を使用してアルゴリズムをトレーニングする必要があります。これには、データ セットをテスト セットとトレーニング セットに分割することが含まれます。次に、XGB Regressor を使用して XGBoost モデルをトレーニングし、フィッティング手法を使用して予測します。最後に、平均絶対誤差 (MAE) を使用して予測の精度を判断します。 10 秒の遅延の場合、計算された平均絶対誤差 (MAE) は 0.035 です。これは、予測の 96.5% が非常に正しいことを意味すると解釈できます。以下の図は、XGBoost から取得した予測と、トレーニング/テスト分割からの期待値の比較を示しています。

以下は完全なスクリプトです。このコードは主にここのチュートリアルから引用しています。 時系列予測に XGBoost と InluxDB を使用する方法

import pandas as pd

from numpy import asarray

from sklearn.metrics import means_absolute_error

from xgboost import XGBRegressor

from matplotlib import pyplot

from influxdb_client import InfluxDBClient

from influxdb_client.client.write_api import SYNCHRONOUS




Python InfluxDB クライアント ライブラリを使用してデータをクエリし、データを教師ありデータに変換しますFlux

client = InfluxDBClient(url="https://us-west-2-1.aws.cloud2.influxdata.com", token="NyP-HzFGkObUBI4Wwg6Rbd-_SdrTMtZzbFK921VkMQWp3bv_e9BhpBi6fCBr_0-6i0ev32_XWZcmkDPsearTWA==) の学習問題", org="0437f6d51b579000")



# write_api = client.write_api(write_optinotallow=SYNCHRONOUS)

query_api = client.query_api()

df = query_api.query_data_frame('import "join"'

'import "influxdata/influxdb/sample"'

'data = sample.data(set: "airSensor")'

'|>filter(fn: (r) => r._field == "温度" および r.sensor_id == "TLM0100")'

'shiftedData = データ'

'|> timeShift(duration: 10s , columns: ["_time"] )'

'join.time(左: データ、右:ShiftedData、as: (l, r) = > ({データを含む l: l._value、shiftData: r._value}))'

'|> drop(columns: ["_measurement", "_time", "_value", "sensor_id", "_field"])'

'|> yield(name: "教師あり学習データセットに変換")'

)

df = df.drop(columns=['table', 'result'])

data = df.to_numpy()



# 単変量データセットをトレーニング/テスト セットに分割します

def train_test_split(data, n_test):

return data[:-n_test:], data[-n_test:]



# xgboost モデルを当てはめて 1 ステップ予測を行う

def xgboost_forecast(train, testX) :

# リストを配列に変換します

train = asarray(train)

# 入力列と出力列に分割します

trainX, trainy = train[: , :-1], train[:, -1]

# モデルの適合

model = XGBRegressor(objective='reg:squarederror', n_estimators=1000)

model.fit(trainX, trainy)

# ワンステップ予測を行う

yhat = model.predict(asarray([testX]))

return yhat[0 ]



# 単変量データのウォークフォワード検証

def walk_forward_validation(data, n_test):

precision = list()

# データセットを分割します。

train, test = train_test_split(data, n_test)

History = [x for x in train]

# 各タイムステップをステップ オーバーします。テストセット

for i in range(len(test)):

# テスト行を入力列と出力列に分割

testX, testy = test[i, : -1]、test[i, -1]

# 履歴にモデルを当てはめて予測を行う

yhat = xgboost_forecast(history, testX)

# 予測を格納します予測のリスト

predictions.append(yhat)

# 次のループの履歴に実際の観測を追加します

history.append(test[i])

# 進捗状況の要約

print('>expected=%.1f,dicted=%.1f' % (testy, yhat))

# 予測誤差の推定

エラー = 平均絶対エラー(テスト[:, -1], 予測)

エラーを返す, テスト[:, -1], 予測



# 評価

mae, y, yhat = walk_forward_validation(data, 100)

print('MAE: %.3f' % mae)



プロットの予想と予想

pyplot.plot(y, label='Expected')

pyplot.plot(yhat, label='Predicted')

pyplot.legend()
pyplot.show()

五、承認

このセクションのブログが XGBoost と InfluxDB の利用を促進できるようにすることを希望します。ここで説明されている多数の計算法と InfluxDB を使用して、事前検査と定期的な検査を実行する方法の例を示します。 xgboost-and-influxdb.html

時系列予測に XGBoost と InluxDB を使用する方法

以上が時系列予測に XGBoost と InluxDB を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。