Databricks AutoMLを使って分類問題を解いてみる(GUI編)

こちらのGUI編です。

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

:::note info
**注意**
Databricks Community EditionではAutoMLのGUIを使用することはできません。
:::

# クラスターを作成する

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
    from pyspark.sql.types import DoubleType, StringType, StructType, StructField
    
    # スキーマ定義
    schema = StructType([
      StructField("age", DoubleType(), False),
      StructField("workclass", StringType(), False),
      StructField("fnlwgt", DoubleType(), False),
      StructField("education", StringType(), False),
      StructField("education_num", DoubleType(), False),
      StructField("marital_status", StringType(), False),
      StructField("occupation", StringType(), False),
      StructField("relationship", StringType(), False),
      StructField("race", StringType(), False),
      StructField("sex", StringType(), False),
      StructField("capital_gain", DoubleType(), False),
      StructField("capital_loss", DoubleType(), False),
      StructField("hours_per_week", DoubleType(), False),
      StructField("native_country", StringType(), False),
      StructField("income", StringType(), False)
    ])
    
    # データ読み込み
    input_df = spark.read.format("csv").schema(schema).load("/databricks-datasets/adult/adult.data")
    
    # データベースにテーブルus_adult_censusとして登録
    input_df.write.format("parquet").saveAsTable("us_adult_census")
    ```

データベースにテーブルが登録されると、サイドメニューの**データ**からテーブルを確認することができます。
![Screen Shot 2022-08-15 at 9.22.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/136e4aae-610e-9c57-f6b6-946bc03d70ae.png)
![Screen Shot 2022-08-15 at 9.23.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3727acc6-fcab-0edc-6a92-ee90ea5da72d.png)

:::note info
**注意**
ここでは全てのデータを登録しており、次のステップではトレーニングデータセットとして使用しています。ホールドアウトデータを用いて精度検証を行う場合には、事前にデータを分割しておくことをお勧めします。
:::

# 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 9.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6167beff-4c4d-0e26-144e-22eb3c59ba24.png)
1. すると、トレーニングデータセットのスキーマが表示されます。ここで、トレーニングデータセットに含めるカラムを選択したり、null値の取り扱いを指定することができますが、ここではデフォルトのままとしておきます。
![Screen Shot 2022-08-15 at 9.25.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bce2d3ca-49a1-09fb-8697-9d99da11a85a.png)
1. **予測ターゲット**では、予測対象となる目的変数を選択します。ここでは、年収である`income`を選択します。**エクスペリメント名**はデフォルトのままとしておきます。
1. 以下のように設定されていることを確認したら、一番下にある**AutoMLを開始**ボタンをクリックします。
![Screen Shot 2022-08-15 at 9.28.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c02a698c-31dc-ffac-e4f4-81899d0a2f29.png)

# AutoMLの実行

1. トレーニングが始まると進捗を表示する画面に切り替わります。
![Screen Shot 2022-08-15 at 9.31.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d00e7557-c8c4-fa5f-c0f3-4c3d87a13fd5.png)
1. **リフレッシュ**ボタンを押すと、トレーニングされたモデルの一覧が更新されます。ここでは精度指標として`val_f1_score`が用いられており、常にベストな`val_f1_score`を出したモデルが上に表示されるようになっています。
![Screen Shot 2022-08-15 at 9.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/16a7b0fc-0b27-820c-77d5-f9b0fefc237e.png)
1. トレーニングが完了すると**完了**と表示されます。
![Screen Shot 2022-08-15 at 9.40.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3aaaa771-358d-716e-aa5a-5fccd111c786.png)

# AutoMLの結果の確認

1. トレーニングに用いたデータの分布などを確認するには、**データ調査用ノートブック**のリンクをクリックします。
1. 別タブでノートブックが開きます。
![Screen Shot 2022-08-15 at 9.42.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c30ea983-1035-6985-9947-0347d23079de.png)
1. 各特徴量の分布や特徴量同士の相関などを確認することができます。
![Screen Shot 2022-08-15 at 9.43.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d098d171-a23a-b01c-1252-8182f83aff01.png)
![Screen Shot 2022-08-15 at 9.43.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1e94dad5-94f0-4a08-9c69-a57ae49c32de.png)
1. 一番精度が良かったモデルの詳細を確認するには、**最適なモデルのノートブックを表示**をクリックするか、モデル一覧の一番上の行の**Source**列のリンクをクリックしてノートブックを開きます。
![Screen Shot 2022-08-15 at 9.44.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/41ef51f8-3db9-0cd9-00d2-4ddbe83e4e67.png)
1. 今回のベストモデルを作成したのはLightGBMであることがわかります。
![Screen Shot 2022-08-15 at 9.45.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d98e0d7a-2e36-77f8-5979-03dbfd7e7f3c.png)
1. ノートブックを下にスクロールしていくと、具体的にどのような処理を行っているのかを確認することができます。こちらを再度実行しても同じ結果を得ることができますし、処理をカスタマイズすることも可能です。
![Screen Shot 2022-08-15 at 9.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a8db829a-a88e-f00e-5db7-6976fa391e76.png)
1. ここでは各特徴量が予測結果にどのような影響を与えているのかを確認できるSHAP値を表示させてみたいと思います。`shap_enabled = False`となっている部分を`shap_enabled = True`に変更し、ノートブックをクラスターにアタッチしてノートブックを実行します。
![Screen Shot 2022-08-15 at 9.49.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/be77e1ac-8af6-24d4-8cb8-61a59f68a701.png)
1. すると、ノートブック上にSHAP値が表示され、以下の結果から`captal_gain`(投資資産による利益)、`marital_status`(既婚・未婚)がいずれの予測結果(年収が50Kドルより高い、50Kドル以下)に対しても大きな影響を与えていることがわかります。
![Screen Shot 2022-08-15 at 9.54.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e10d9e1c-8c9f-94ba-4581-f5bd7b493885.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)