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

こちらの続々編です。時系列データの予測を行います。こちらはフルバージョンのDatabricksを使います。フルバージョンのDatabricksも[2週間無料](https://databricks.com/jp/try-databricks)でご利用いただけます。

https://qiita.com/taka_yayoi/items/3010e1e4b023c3d7c793

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

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

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

ノートブックのインポート手順とクラスターの作成手順は[こちら](https://qiita.com/taka_yayoi/items/3010e1e4b023c3d7c793#%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%A8%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%92%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B)を参考にしてください。

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

https://github.com/taka-yayoi/public_repo/tree/main/AutoML_forecast

インポート時の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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2c3fcf87-9bea-a691-aab1-60cd6d9b50a9.png)

## COVID-19データセット

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

```py: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/138bc7d7-65cd-1ac6-86d2-b7aa8fbd14ab.png)

## AutoMLトレーニング

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

このサンプルでは以下の指定も行っています。
- `horizon=30`: AutoMLが未来の30日を予測するように指定 
- `frequency="d"`: 日毎の予測を行うことを指定 
- `primary_metric="mdape"`: トレーニングの際に最適化すべきメトリックを指定

```py: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")
```

上のコマンドを実行すると、[分類問題](https://qiita.com/taka_yayoi/items/3010e1e4b023c3d7c793#%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0)や[回帰問題](https://qiita.com/taka_yayoi/items/25d3356982040ea41091)の時と同じようにモデルが生成され、それら全てが[MLflow](https://qiita.com/taka_yayoi/items/1a4e82f7e20c56ba4f72)によって記録されていきます。
![Screen Shot 2022-08-14 at 20.33.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/11f93df2-fa52-111d-15b1-776c75f4fd6c.png)

エクスペリメントページで詳細を確認することもできます。ProphetとARIMAを用いてトレーニングが行われています。
![Screen Shot 2022-08-14 at 20.38.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1bb6fa17-2346-c13a-81b0-6fd9bdd6e0a0.png)

トレーニングが完了するとデータ探索用のノートブック(data exploration notebook)、ベストモデルのノートブック(best trial notebook)、MLflowエクスペリメント(MLflow experiment)へのリンクが表示されます。
![Screen Shot 2022-08-14 at 20.51.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/943fb5b1-f32e-165b-d86e-f98aede8a768.png)

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

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

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

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

```py: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](https://facebook.github.io/prophet/docs/quick_start.html#python-api)をご覧ください。

```py:Python
forecast = pyfunc_model._model_impl.python_model.predict_timeseries()
display(forecasts)
```
![Screen Shot 2022-08-14 at 21.13.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/afc1a62f-a255-3ff8-204c-32100c0c687a.png)

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

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

```py:Python
df_true = df.groupby("date").agg(y=("cases", "avg")).reset_index().to_pandas()
```

```py: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c9b211c9-0523-b6c2-1cd1-0fa2862dec85.png)

# まとめ

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

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

他のシリーズでは[分類問題](https://qiita.com/taka_yayoi/items/3010e1e4b023c3d7c793)や[回帰問題](https://qiita.com/taka_yayoi/items/25d3356982040ea41091)を解いています。

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

- [Databricks AutoMLのご紹介 : 機械学習開発の自動化に対するガラスボックスアプローチ](https://qiita.com/taka_yayoi/items/3bf4f4e89990b299c6c9)
- [Databricks AutoMLのマニュアル](https://qiita.com/taka_yayoi/items/0ed860131a02aeade14f)
- [あなたの機械学習プロジェクトをDatabricks AutoMLでスーパーチャージしましょう](https://qiita.com/taka_yayoi/items/65ab0197c627df1b74b5)
- [Databricks機械学習ガイド](https://qiita.com/taka_yayoi/items/2d8ebdc9374696b24e0f)
- [Databricksにおける機械学習チュートリアル](https://qiita.com/taka_yayoi/items/5cfe319c14f2b985d441)
- [Databricksで機械学習を始めてみる](https://qiita.com/taka_yayoi/items/22f45cc82f6b5b1170ad)
- [機械学習エンジニアとしてDatabricksを使い始める](https://qiita.com/taka_yayoi/items/6750e2a74d532004c269)
- [Databricksにおける機械学習モデル構築のエンドツーエンドのサンプル](https://qiita.com/taka_yayoi/items/f48ccd35e0452611d81b)


### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)