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

こちらのGUI編です。

https://qiita.com/taka_yayoi/items/a6d7f2e3104d90918c17

# クラスターを作成する

AutoMLの実行にはDatabricksクラスターが必要となります。機械学習ランタイム(以下の例では11.1ML)を選択して[クラスターを作成](https://qiita.com/taka_yayoi/items/d36a469a1e0c0cebaf1b)し、起動しておきます。
![Screen Shot 2022-08-15 at 9.02.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d3ef50c3-0aba-ceb2-5d5e-fd0d02b952a3.png)

# データセットを準備する

GUIを使用してAutoMLを実行するには、トレーニングデータセットがデータベースに登録されている必要があります。

1. [ノートブックを作成](https://qiita.com/taka_yayoi/items/c306161906d6d34e8bd5#%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E4%BD%9C%E6%88%90)し、[上のステップ](#クラスターを作成する)で作成したクラスターにアタッチします。
![Screen Shot 2022-08-15 at 9.20.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f73f23f9-afd1-01a1-cf0f-5d7f7d9534ff.png)
1. 以下のコマンドを実行します。
    ```py:Python
    import re
    from pyspark.sql.types import * 
    
    # ログインIDからUsernameを取得
    username_raw = dbutils.notebook.entry_point.getDbutils().notebook().getContext().tags().apply('user')
    # Username の英数字以外を除去し、全て小文字化。Username をファイルパスやデータベース名の一部で使用可能にするため。
    username = re.sub('[^A-Za-z0-9]+', '', username_raw).lower()
    
    # データベース名
    db_name = f"automl_{username}"
    
    # Hiveメタストアのデータベースの準備:データベースの作成
    spark.sql(f"DROP DATABASE IF EXISTS {db_name} CASCADE")
    spark.sql(f"CREATE DATABASE IF NOT EXISTS {db_name}")
    # Hiveメタストアのデータベースの選択
    spark.sql(f"USE {db_name}")
    
    print("database name: " + db_name)
    ```
    あなたのユーザー名が埋め込まれたデータベース名でデータベースが作成されます。
![Screen Shot 2022-08-15 at 9.21.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7eea97b7-7574-2fc0-1a26-6fed4adddb93.png)
1. 以下のコマンドを実行してテーブルをデータベースに登録します。
    ```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)

    # Sparkデータフレームに変換
    input_sdf = df.to_spark()

    # データベースにテーブルcovid_19_dataとして登録
    input_sdf.write.format("parquet").saveAsTable("covid_19_data")
    ```

データベースにテーブルが登録されると、サイドメニューの**データ**からテーブルを確認することができます。
![Screen Shot 2022-08-15 at 16.14.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/88906b30-10fc-f221-4565-fe44563618bc.png)
![Screen Shot 2022-08-15 at 16.14.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1f62a070-be56-f4f1-ee8d-4418dc8ceec5.png)

# AutoMLのGUIにアクセスする

1. Databricksワークスペースにログインします。画面が日本語になっていない場合は、[こちら](https://qiita.com/taka_yayoi/items/ff4127e0d632f5e02603)を参考にGUIを日本語に切り替えてください。
1. サイドメニューのDatabricksロゴの下に**D**が表示されている場合にはクリックして、**M Machine Learning**を選択します。これはペルソナスイッチャーと呼ばれるインタフェースで、作業の内容に応じてペルソナを切り替えることでメニュー項目が切り替わります。
![Screen Shot 2022-08-15 at 8.55.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7109bfb8-b565-4085-c60d-2627bac2a0e3.png)
1. サイドメニューから**エクスペリメント**をクリックします。
![Screen Shot 2022-08-15 at 8.56.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/db95e60a-5bab-7d98-d364-8674530b6038.png)
1. エクスペリメント(MLflowランの管理単位)の一覧が表示されます。
![Screen Shot 2022-08-15 at 8.59.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/18c9f3c5-e243-c005-6b92-58f4213b12a0.png)
1. 左上にある**AutoMLエクスペリメントを作成**をクリックします。AutoMLの設定画面が表示されます。
![Screen Shot 2022-08-15 at 9.00.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/06f3c71b-df28-0cd6-0d91-8957866b57c3.png)

# AutoMLのGUIから設定を行う

1. **クラスター**では、[上のステップ](#クラスターを作成する)で作成したクラスターを選択します。
![Screen Shot 2022-08-15 at 9.06.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/668a7b64-4dd1-dc3d-a6d1-c9624baa4aa9.png)
1. **機械学習の問題のタイプ**では`予測`を選択します。
1. **データセット**では、**Browse**をクリックします。[上のステップ](#データセットを準備する)で作成したテーブルを選択して、**選択**をクリックします。
![Screen Shot 2022-08-15 at 16.15.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d5552049-f278-bd7c-8af7-773505317006.png)
1. すると、トレーニングデータセットのスキーマが表示されます。
![Screen Shot 2022-08-15 at 16.16.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4667c0af-92d7-c5ad-a3c1-ae7b78b1fd53.png)
1. 以下の設定を行います。
    - **予測ターゲット**には予測対象となるカラムを選択します。ここでは、感染者数を示す`cases`を選択します。
    - **時間列**には記録された日時を示す`date`を選択します。
    - **予測期間**には`30日`を指定します。
    - **エクスペリメント名**はデフォルトのままとしておきます。
    - **Output Database**には予測結果のデータを格納するデータベースを指定することができます。ここでは、**Browse**をクリックして、[上のステップ](#データセットを準備する)で作成したデータベースを選択して、**選択**をクリックします。
![Screen Shot 2022-08-15 at 16.20.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ee15666a-10f7-b347-1129-c462454fb4f6.png)
1. 以下のように設定されていることを確認したら、一番下にある**AutoMLを開始**ボタンをクリックします。
![Screen Shot 2022-08-15 at 16.20.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3836db81-87cd-7444-c9f3-33ba048af96e.png)

# AutoMLの実行

1. トレーニングが始まると進捗を表示する画面に切り替わります。
![Screen Shot 2022-08-15 at 16.21.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/afa3d0c8-5337-37c7-0e25-0db56615c8b8.png)
1. **リフレッシュ**ボタンを押すと、トレーニングされたモデルの一覧が更新されます。ここでは精度指標として`val_smape`が用いられており、常にベストな`val_smape`を出したモデルが上に表示されるようになっています。
![Screen Shot 2022-08-15 at 16.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6cb15c17-83f1-acfe-ff79-3906f77b0495.png)
1. トレーニングが完了すると**完了**と表示されます。
![Screen Shot 2022-08-15 at 16.29.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d17b44d7-9235-7e62-7542-fed53ca55dee.png)

# AutoMLの結果の確認

1. トレーニングに用いたデータの分布などを確認するには、**データ探索用ノートブックの表示**をクリックします。
1. 別タブでノートブックが開き、データの時系列変化などを確認することができます。
![Screen Shot 2022-08-15 at 16.30.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ad587f40-59a9-1cf0-371b-b94b2eb75435.png)
1. 一番精度が良かったモデルの詳細を確認するには、**最適なモデルのノートブックを表示**をクリックするか、モデル一覧の一番上の行の**Source**列のリンクをクリックしてノートブックを開きます。今回のベストモデルを作成したのはARIMAであることがわかります。
![Screen Shot 2022-08-15 at 16.33.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/153e0985-a104-5164-2117-19ff1abc2fc4.png)
1. 予測結果も確認することができます。
![Screen Shot 2022-08-15 at 16.34.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/768b2c2a-b998-1caf-37c3-b59ad1194188.png)
1. また、今回は結果をデータベースに登録しているので以下の画面に表示されれている指示に従うことでデータにアクセスすることができます。
![Screen Shot 2022-08-15 at 16.35.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/79b783f7-7b6a-da26-2b4f-4d73b1a225ae.png)
1. ノートブックで以下のコマンドを実行して予測結果にアクセスします。
    ```sql:SQL
    %sql
    select * from automl_takaakiyayoidatabrickscom.forecast_prediction_966f2be7
    ```
    ![Screen Shot 2022-08-15 at 16.37.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/eb791a4a-a47e-571f-2df4-32515fc14d54.png)
    ![Screen Shot 2022-08-15 at 16.41.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7cb287c1-31f1-5afa-4071-db74975b10f0.png)

# まとめ

こちらでは、GUIの操作を主体としたAutoMLを体験いただきました。Databricks AutoMLではGUIもPython APIもサポートしていますが、それよりも重要なのは中身の処理が全てわかるようになっている**ガラスボックスアプローチ**であると考えています。これには以下のメリットがあります。

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

この他、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)