時系列予測のためのXGBoostの活用

XGBoost for Time Series Prediction

XGBoost(eXtreme Gradient Boosting)は、勾配ブースティング木を実装したオープンソースのアルゴリズムで、パフォーマンスと速度の向上のための追加の改善を行っています。正確な予測を迅速に行う能力があるため、このモデルはKaggleのコンペティションなど、多くの競技会でよく使用されるモデルです。

XGBoostの一般的な応用例は、詐欺検出などの分類予測や、住宅価格予測などの回帰予測です。ただし、XGBoostアルゴリズムを時系列データの予測に拡張することも可能です。どのように動作するのでしょうか?さらに探ってみましょう。

 

時系列予測

 

データサイエンスと機械学習における予測は、時間の経過に伴って収集された過去のデータに基づいて将来の数値を予測するための技術です。データの収集間隔は一定または不定期である場合があります。

一般的な機械学習のトレーニングデータでは、各観測値は他の観測値とは独立していますが、時系列予測のためのデータは連続した順序であり、各データポイントに関連している必要があります。たとえば、時系列データには月次株価、週次天気、日次売上などが含まれます。

ここでは、Kaggleからの例としてDaily Climateデータセットを見てみましょう。

import pandas as pd

train = pd.read_csv('DailyDelhiClimateTrain.csv')
test = pd.read_csv('DailyDelhiClimateTest.csv')

train.head()

 

 

上記のデータフレームを見ると、すべての特徴量が日次で記録されていることがわかります。日付の列はデータが観測された日付を示し、各観測値は関連しています。

時系列予測では、トレンドや季節性、その他のパターンをデータから取り込んで予測を作成することが一般的です。パターンを確認するための簡単な方法は、可視化することです。たとえば、例のデータセットから平均気温データを可視化します。

train["date"] = pd.to_datetime(train["date"])
test["date"] = pd.to_datetime(test["date"])

train = train.set_index("date")
test = test.set_index("date")

train["meantemp"].plot(style="k", figsize=(10, 5), label="train")
test["meantemp"].plot(style="b", figsize=(10, 5), label="test")
plt.title("Mean Temperature Dehli Data")
plt.legend()

 

 

上記のグラフから、各年には共通の季節性パターンがあることが見て取れます。この情報を取り入れることで、データの動作を理解し、予測モデルに合うモデルを選択することができます。

一般的な予測モデルには、ARIMA、Vector AutoRegression、Exponential Smoothing、Prophetなどがあります。ただし、XGBoostも予測に利用することができます。

 

XGBoostによる予測

 

XGBoostを使用して予測する準備をする前に、まずパッケージをインストールする必要があります。

pip install xgboost

 

インストールが完了したら、モデルトレーニングのためのデータを準備します。XGBoost予測では、数値のみを含む単一または複数の特徴量に基づいて回帰モデルを実装するため、データトレーニングも数値である必要があります。また、XGBoostモデル内で時間の経過を取り込むために、時系列データを複数の数値特徴量に変換します。

まず、日付から数値特徴量を作成する関数を作成します。

def create_time_feature(df):
    df['dayofmonth'] = df['date'].dt.day
    df['dayofweek'] = df['date'].dt.dayofweek
    df['quarter'] = df['date'].dt.quarter
    df['month'] = df['date'].dt.month
    df['year'] = df['date'].dt.year
    df['dayofyear'] = df['date'].dt.dayofyear
    df['weekofyear'] = df['date'].dt.weekofyear
    return df

 

次に、この関数をトレーニングデータとテストデータに適用します。

train = create_time_feature(train)
test = create_time_feature(test)

train.head()

 

 

必要な情報はすべて利用可能です。次に、予測したい内容を定義します。この例では、平均気温を予測し、上記のデータに基づいてトレーニングデータを作成します。

X_train = train.drop('meantemp', axis =1)
y_train = train['meantemp']

X_test = test.drop('meantemp', axis =1)
y_test = test['meantemp']

 

湿度などの他の情報も使用して、XGBoostが多変量のアプローチを使用して値を予測することも示します。ただし、実際には、予測を試みる際に存在するとわかっているデータのみを組み込みます。

モデルにデータを適合させることで、トレーニングプロセスを開始しましょう。現在の例では、木の数以外のハイパーパラメータの最適化は行いません。

import xgboost as xgb

reg = xgb.XGBRegressor(n_estimators=1000)
reg.fit(X_train, y_train, verbose = False)

 

トレーニングプロセスの後、モデルの特徴の重要性を見てみましょう。

xgb.plot_importance(reg)

 

 

最初の3つの特徴量は予測に役立つことが予想されますが、時間の特徴量も予測に貢献しています。テストデータでの予測を試して、それらを視覚化してみましょう。

test['meantemp_Prediction'] = reg.predict(X_test)

train['meantemp'].plot(style='k', figsize=(10,5), label = 'train')
test['meantemp'].plot(style='b', figsize=(10,5), label = 'test')
test['meantemp_Prediction'].plot(style='r', figsize=(10,5), label = 'prediction')
plt.title('Mean Temperature Dehli Data')
plt.legend()

 

 

上記のグラフからわかるように、予測はわずかにずれているかもしれませんが、全体的な傾向に従っています。エラーメトリックに基づいてモデルを評価してみましょう。

from sklearn.metrics import mean_squared_error, mean_absolute_error, mean_absolute_percentage_error

print('RMSE: ', round(mean_squared_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))
print('MAE: ', round(mean_absolute_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))
print('MAPE: ', round(mean_absolute_percentage_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))

 

RMSE:  11.514

MAE:  2.655

MAPE:  0.133

結果から、予測には約13%の誤差がある可能性があり、RMSEも予測にわずかな誤差があることが示されています。ハイパーパラメータの最適化を行うことでモデルを改善することができますが、XGBoostを使用して予測する方法を学びました。

 

結論

 

XGBoostはオープンソースのアルゴリズムであり、多くのデータサイエンスのケースやKaggleの競技でよく使用されます。よくある使用例は、詐欺検知のような一般的な分類ケースや、家の価格予測のような回帰ケースですが、XGBoostは時系列予測にも拡張することができます。XGBoostリグレッサーを使用することで、将来の数値を予測するモデルを作成することができます。Cornellius Yudha Wijayaは、データサイエンスのアシスタントマネージャー兼データライターです。Allianz Indonesiaでフルタイムで働きながら、Pythonとデータのヒントをソーシャルメディアや執筆メディアで共有することが大好きです。  

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

「学生として、私がChatGPTを使って生産性を10倍にする方法」

現代の忙しい世界では、学生たちは常に生産性と効率を高める方法を求めています私自身も学生であり、一日中とても忙しかった...

AIニュース

OpenAIの需要急増により、ChatGPT Plusの申し込みを一時停止します

人工知能のパイオニアであるOpenAIは、需要の急増に苦しんでおり、そのためプレミアムChatGPT Plusサービスの新規申し込みを...

機械学習

AIパワードテックカンパニーが、食品小売業者に供給チェーン管理での新たなスタートを支援します

低く垂れ下がっている果物について話しましょう。Afreshは、食品ロスを減らすために供給チェーンを効率化するAIスタートアッ...

AIニュース

「オートジェンへの参入:マルチエージェントフレームワークの基礎を探索する」

イントロダクション 「自動生成に飛び込む:マルチエージェントフレームワークの基礎を探る」というテーマでソフトウェア開発...

AIニュース

Google Cloudがマッコーリー銀行のAIバンキング機能を強化するのを支援します

マッコーリーのバンキング&金融サービスグループは、人工知能(AI)と機械学習(ML)の力を結集し、銀行業界を変革するため...