こちらの続々編です。時系列データの予測を行います。こちらはフルバージョンの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
ノートブックがインポートされ、クラスターが起動すると以下のような状態になっているはずです。
COVID-19データセット
アメリカにおける日毎のCOVID-19の感染者数と追加の位置情報のレコードを含むデータセットです。ここでのゴールは、USにおいて向こう30日のウィルス感染者数の予測を行うことです。
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)
AutoMLトレーニング
以下のコマンドはAutoMLのランを起動します。予測すべきカラムをtarget_col
引数と時間のカラムを指定する必要があります。ランが完了すると、トレーニングコードを検証するためにベストなトライアルのノートブックへのリンクにアクセスすることができます。
このサンプルでは以下の指定も行っています。
-
horizon=30
: AutoMLが未来の30日を予測するように指定 -
frequency="d"
: 日毎の予測を行うことを指定 -
primary_metric="mdape"
: トレーニングの際に最適化すべきメトリックを指定
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によって記録されていきます。
エクスペリメントページで詳細を確認することもできます。ProphetとARIMAを用いてトレーニングが行われています。
トレーニングが完了するとデータ探索用のノートブック(data exploration notebook)、ベストモデルのノートブック(best trial notebook)、MLflowエクスペリメント(MLflow experiment)へのリンクが表示されます。
予測のためにモデルを使用する
このセクションのコマンドはDatabricks機械学習ランタイム10.0以降で使用できます。
MLflowを用いてモデルをロードする
MLflowを用いることで、AutoMLのtrial_id
を用いてモデルを容易に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をご覧ください。
forecast = pyfunc_model._model_impl.python_model.predict_timeseries()
display(forecasts)
予測の変化点とトレンドをプロット
以下のプロットでは、太い黒線は時系列データセットを示しており、赤線がAutoML Prophetモデルによる予測値を示しています。
df_true = df.groupby("date").agg(y=("cases", "avg")).reset_index().to_pandas()
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()
まとめ
こちらでは、(Community Editionでは予測問題のAutoMLがサポートされていないのでフルバージョンのDatabricksで)Databricks AutoMLを体験いただきました。Databricks AutoMLはGUIもサポートしていますが、それよりも重要なのは中身の処理が全てわかるようになっているガラスボックスアプローチであると考えています。これには以下のメリットがあります。
- 機械学習プロジェクトにおけるベースラインモデルをクイックに構築し、以降のカスタマイズを容易に行えます。
- いわゆるシチズンデータサイエンティストとプロフェッショナルデータサイエンティストのコラボレーションも円滑に行えるようになります(シチズンデータサイエンティストがビジネス知識を活かしてベースラインモデルを構築し、プロフェッショナルデータサイエンティストがチューニングを行う等)。
この他、Databricksでの機械学習に興味がある方はこちらの記事もご覧になってください。
- Databricks AutoMLのご紹介 : 機械学習開発の自動化に対するガラスボックスアプローチ
- Databricks AutoMLのマニュアル
- あなたの機械学習プロジェクトをDatabricks AutoMLでスーパーチャージしましょう
- Databricks機械学習ガイド
- Databricksにおける機械学習チュートリアル
- Databricksで機械学習を始めてみる
- 機械学習エンジニアとしてDatabricksを使い始める
- Databricksにおける機械学習モデル構築のエンドツーエンドのサンプル