ホームページ > 記事 > テクノロジー周辺機器 > 時系列予測に XGBoost と InluxDB を使用する方法
XGBoost は、さまざまな予測問題を解決するために使用できる、人気のあるオープンソースの機械学習ライブラリです。時系列予測のために InfluxDB と組み合わせて使用する方法を理解する必要があります。
翻訳者 | Li Rui
レビュー者 | Sun Shujuan
XGBoost は、最適化された分散勾配ブースティング アルゴリズムを実装するオープンソースの機械学習ライブラリです。 XGBoost は並列処理を使用して高速なパフォーマンスを実現し、欠損値を適切に処理し、小さなデータセットでも適切にパフォーマンスを発揮し、過剰適合を防ぎます。これらすべての利点により、XGBoost は予測などの回帰問題に対する一般的なソリューションになっています。
予測は、予測分析、予知保全、製品計画、予算編成などのさまざまなビジネス目標にとってミッションクリティカルです。多くの予測または予測の問題には、時系列データが関係します。このため、XGBoost はオープン ソースの時系列データベース InfluxDB の優れたパートナーになります。
このチュートリアルでは、XGBoost の Python パッケージを使用して InfluxDB 時系列データベースからデータを予測する方法を学習します。また、InfluxDB Python クライアント ライブラリを使用して InfluxDB からデータをクエリし、そのデータを Pandas DataFrame に変換して、予測を行う前に時系列データの操作を容易にします。さらに、XGBoost の利点についてさらに詳しく説明します。
このチュートリアルは、Homebrew を通じて Python 3 がインストールされた macOS システムで実行されます。 Python とクライアントのインストールを簡素化するために、virtualenv、pyenv、conda-env などの追加ツールをセットアップすることをお勧めします。それ以外の場合、完全な要件は次のとおりです:
このチュートリアルでは、無料枠の InfluxDB クラウド アカウントがあり、バケットとトークンが作成されていることも前提としています。バケットはデータベース、または InfluxDB の最高レベルのデータ組織であると考えてください。このチュートリアルでは、NOAA という名前のバケットが作成されます。
XGBoost とは何かを理解するには、デシジョン ツリー、ランダム フォレスト、および勾配強化を理解する必要があります。デシジョン ツリーは、一連の機能テストで構成される教師あり学習方法です。各ノードはテストであり、すべてのノードはフローチャート構造に編成されています。ブランチは、どのリーフ ラベルまたはクラス ラベルが入力データに割り当てられるかを最終的に決定する条件を表します。
# 機械学習の決定木は、明日雨が降るかどうかを判断するために使用されます。デシジョン ツリーのコンポーネント (葉、枝、ノード) を示すように編集されました。
デシジョン ツリー、ランダム フォレスト、および勾配ブースティングの背後にある基本原理は、複数の「弱学習器」または分類器が連携して強力な予測を行うということです。
ランダム フォレストには複数のデシジョン ツリーが含まれています。デシジョン ツリー内の各ノードは弱学習器とみなされ、ランダム フォレスト内の各デシジョン ツリーは、ランダム フォレスト モデル内の多数の弱学習器の 1 つとみなされます。通常、すべてのデータはランダムにサブセットに分割され、異なるデシジョン ツリーを通過します。
デシジョン ツリーとランダム フォレストを使用した勾配ブースティングは似ていますが、構造方法が異なります。勾配ブースト ツリーにはデシジョン ツリー フォレストも含まれていますが、これらのデシジョン ツリーは追加で構築され、すべてのデータはデシジョン ツリー アンサンブルを介して渡されます。勾配ブースティング ツリーは、離散値 (猫や犬など) の分類ツリーを含む一連の分類ツリーまたは回帰ツリーで構成されている場合があります。回帰木は連続値 (0 ~ 100 など) に使用されます。
勾配ブースティングは、分類と予測に使用される機械学習アルゴリズムです。 XGBoost は、極端なタイプの勾配ブースティングです。極端に言うと、並列処理の力によって勾配ブースティングをより効率的に実行できます。 XGBoost ドキュメントからの以下の画像は、誰かがビデオ ゲームを気に入るかどうかを予測するために勾配ブースティングを使用する方法を示しています。
#誰かがビデオゲームを好きになる可能性が高いかどうかを判断するために 2 つの決定ツリーが使用されます。両方のツリーのリーフ スコアを加算して、どちらがビデオ ゲームを楽しむ可能性が最も高いかを判断します。
XGBoost の利点:
XGBoost のいくつかの欠点:
ここで使用される空気センサーのサンプル データ セットは、InfluxDB によって提供されます。このデータセットには、複数のセンサーからの温度データが含まれています。次のようなデータを使用して、単一センサーの温度予測が作成されています。
次の 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"])
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 から取得した予測と、トレーニング/テスト分割からの期待値の比較を示しています。
以下は完全なスクリプトです。このコードは主にここのチュートリアルから引用しています。
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 と InluxDB を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。