LoginSignup
0
0

More than 1 year has passed since last update.

Databricks AutoMLを使って時系列予測問題を解いてみる

Last updated at Posted at 2022-08-14

こちらの続々編です。時系列データの予測を行います。こちらはフルバージョンのDatabricksを使います。フルバージョンのDatabricksも2週間無料でご利用いただけます。

以下の手順では、すでにワークスペースへのログインまで完了していることを前提としています。

注意

  • Databricks Community EditionではAutoMLの時系列予測の機能を使用することはできません。
  • GUIを用いたAutoML機能のウォークスルーに関してはこちらを参照ください。
  • ノートブックから時系列予測のAutoMLを行う際、フォルダ名、ノートブック名にマルチバイト文字(日本語)を含めないでください。エラーになります。

時系列予測問題を解いてみる

ノートブックのインポート手順とクラスターの作成手順はこちらを参考にしてください。

時系列予測問題のサンプルノートブックはこちらに置いてあります。

インポート時のURLはこちらです。

https://raw.githubusercontent.com/taka-yayoi/public_repo/main/AutoML_forecast/Databricks%20AutoML%20Time%20Series%20Forecast%20Notebook.py

ノートブックがインポートされ、クラスターが起動すると以下のような状態になっているはずです。
Screen Shot 2022-08-14 at 20.13.06.png

COVID-19データセット

アメリカにおける日毎のCOVID-19の感染者数と追加の位置情報のレコードを含むデータセットです。ここでのゴールは、USにおいて向こう30日のウィルス感染者数の予測を行うことです。

Python
import pyspark.pandas as ps
df = ps.read_csv("/databricks-datasets/COVID/covid-19-data")
df["date"] = ps.to_datetime(df['date'], errors='coerce')
df["cases"] = df["cases"].astype(int)
display(df)

Screen Shot 2022-08-14 at 20.14.55.png

AutoMLトレーニング

以下のコマンドはAutoMLのランを起動します。予測すべきカラムをtarget_col引数と時間のカラムを指定する必要があります。ランが完了すると、トレーニングコードを検証するためにベストなトライアルのノートブックへのリンクにアクセスすることができます。

このサンプルでは以下の指定も行っています。

  • horizon=30: AutoMLが未来の30日を予測するように指定
  • frequency="d": 日毎の予測を行うことを指定
  • primary_metric="mdape": トレーニングの際に最適化すべきメトリックを指定
Python
import databricks.automl
import logging

# fbprophetの情報レベルのメッセージを無効化
logging.getLogger("py4j").setLevel(logging.WARNING)

summary = databricks.automl.forecast(df, target_col="cases", time_col="date", horizon=30, frequency="d",  primary_metric="mdape")

上のコマンドを実行すると、分類問題回帰問題の時と同じようにモデルが生成され、それら全てがMLflowによって記録されていきます。
Screen Shot 2022-08-14 at 20.33.15.png

エクスペリメントページで詳細を確認することもできます。ProphetとARIMAを用いてトレーニングが行われています。
Screen Shot 2022-08-14 at 20.38.07.png

トレーニングが完了するとデータ探索用のノートブック(data exploration notebook)、ベストモデルのノートブック(best trial notebook)、MLflowエクスペリメント(MLflow experiment)へのリンクが表示されます。
Screen Shot 2022-08-14 at 20.51.53.png

予測のためにモデルを使用する

このセクションのコマンドはDatabricks機械学習ランタイム10.0以降で使用できます。

MLflowを用いてモデルをロードする

MLflowを用いることで、AutoMLのtrial_idを用いてモデルを容易にPythonにインポートすることができます。

Python
import mlflow.pyfunc
from mlflow.tracking import MlflowClient

run_id = MlflowClient()
trial_id = summary.best_trial.mlflow_run_id

model_uri = "runs:/{run_id}/model".format(run_id=trial_id)
pyfunc_model = mlflow.pyfunc.load_model(model_uri)

予測を行うためのモデルを使う

予測を行うためにpredict_timeseriesのモデルメソッドを呼び出します。詳細はProphet documentationをご覧ください。

Python
forecast = pyfunc_model._model_impl.python_model.predict_timeseries()
display(forecasts)

Screen Shot 2022-08-14 at 21.13.51.png

予測の変化点とトレンドをプロット

以下のプロットでは、太い黒線は時系列データセットを示しており、赤線がAutoML Prophetモデルによる予測値を示しています。

Python
df_true = df.groupby("date").agg(y=("cases", "avg")).reset_index().to_pandas()
Python
import matplotlib.pyplot as plt
 
fig = plt.figure(facecolor='w', figsize=(10, 6))
ax = fig.add_subplot(111)
forecasts = pyfunc_model._model_impl.python_model.predict_timeseries(include_history=True)
fcst_t = forecasts['ds'].dt.to_pydatetime()
ax.plot(df_true['date'].dt.to_pydatetime(), df_true['y'], 'k.', label='Observed data points')
ax.plot(fcst_t, forecasts['yhat'], ls='-', c='#0072B2', label='Forecasts')
ax.fill_between(fcst_t, forecasts['yhat_lower'], forecasts['yhat_upper'],
                color='#0072B2', alpha=0.2, label='Uncertainty interval')
ax.legend()
plt.show()

Screen Shot 2022-08-14 at 21.14.46.png

まとめ

こちらでは、(Community Editionでは予測問題のAutoMLがサポートされていないのでフルバージョンのDatabricksで)Databricks AutoMLを体験いただきました。Databricks AutoMLはGUIもサポートしていますが、それよりも重要なのは中身の処理が全てわかるようになっているガラスボックスアプローチであると考えています。これには以下のメリットがあります。

  • 機械学習プロジェクトにおけるベースラインモデルをクイックに構築し、以降のカスタマイズを容易に行えます。
  • いわゆるシチズンデータサイエンティストとプロフェッショナルデータサイエンティストのコラボレーションも円滑に行えるようになります(シチズンデータサイエンティストがビジネス知識を活かしてベースラインモデルを構築し、プロフェッショナルデータサイエンティストがチューニングを行う等)。

他のシリーズでは分類問題回帰問題を解いています。

この他、Databricksでの機械学習に興味がある方はこちらの記事もご覧になってください。

Databricks 無料トライアル

Databricks 無料トライアル

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0