Databricks Community EditionでAutoMLを使って分類問題を解いてみる

こちらの記事に触発されて自分でもやってみました。

https://qiita.com/manabian/items/103b50c8aed5b232fbb2

無料のCommunity Editionへのサインアップの手順については[こちら](https://qiita.com/taka_yayoi/items/5918a0e88d9b2472578c#databricks-community-edition%E3%81%B8%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97)を参考にしてください。また、フルバージョンのDatabricksとの違いに関しては、[こちら](https://qiita.com/taka_yayoi/items/800fd2714f460a9a1c40)を参照ください。

以下の手順では、すでにワークスペースへのログインまで完了していることを前提としています。
![Screen Shot 2022-08-14 at 10.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3d023aab-633c-5307-8373-00544577bb48.png)

# Databricks AutoMLとは

AutoMLとは[Automated machine learning](https://en.wikipedia.org/wiki/Automated_machine_learning)の略であり、現実世界の問題に対して機械学習を適用する際のタスクを自動化するプロセスのことを意味します。

Databricks AutoMLを活用することで、データセットに対して自動で機械学習を適用することができます。モデルのトレーニングのためにデータセットを準備し、一連の実験を実施、記録し、複数のモデルに対して、作成、チューニング、評価を行います。結果の表示に加えて、中身を確認し、再現、修正できるようにそれぞれの実験のソースコードをPythonノートブック形式で提供します。また、AutoMLはデータセットの統計情報を計算し、後ほど確認できるようにノートブックの中に情報を記録します。

AutoMLはハイパーパラメーターチューニングのトライアルを自動でクラスターのワーカーノードに分散します。

それぞれのモデルは、scikit-learnやXGBoostなどのオープンソースコンポーネントから構築され、容易に修正でき、既存の機械学習パイプラインに組み込むことができます。回帰、分類、予測問題に対してDatabricks AutoMLを活用できます。scikit-learn、xgboost、LightGBMパッケージのアルゴリズムに基づきモデルを評価します。

[UI](https://qiita.com/taka_yayoi/items/0ed860131a02aeade14f#automl-ui)あるいは[Python API](https://qiita.com/taka_yayoi/items/0ed860131a02aeade14f#automl-python-api)でAutoMLを実行することができます。

:::note info
**注意**
Community EditionではPythonノートブックからのAutoMLの実行は可能ですが、GUIでのAutoMLはサポートされていません。GUIでのAutoMLのウォークスルーに関しては、[こちら](https://qiita.com/taka_yayoi/items/ae5913d83a74a071b87d)を参照ください。
:::

# ノートブックとクラスターを準備する

AutoMLで分類問題を解くノートブックは以下のURLに置いてあります。これをインポートして実行します。

https://raw.githubusercontent.com/taka-yayoi/public_repo/main/AutoML_classification/Databricks%20AutoML%E5%88%86%E9%A1%9E%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF.py

1. サイドメニューが日本語になっていない場合は、[こちら](https://qiita.com/taka_yayoi/items/ff4127e0d632f5e02603)を参考に言語を日本語に設定してください。
1. サイドメニューから**ワークスペース**を選択します。
![Screen Shot 2022-08-14 at 10.50.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/827d4d85-c9ec-e0b2-c6d6-e720a07ff336.png)
1. **ホーム**ボタンをクリックして、自分のホームディレクトリに移動します。
![Screen Shot 2022-08-14 at 10.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d92a5201-5ac8-71f1-5224-d5fadab750f5.png)
1. 自分のメールアドレスの右にある下向き矢印のアイコンをクリックしてメニューを展開します。
![Screen Shot 2022-08-14 at 10.50.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/eafc8764-5f63-551b-7035-2157394a0238.png)
1. **インポート**を選択します。インポートダイアログが表示されます。このダイアログからノートブックをインポートすることができます。
![Screen Shot 2022-08-14 at 10.51.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1a2532f6-c46e-b80a-d6f8-6e7b5217dd1a.png)
1. **URL**を選択します。
![Screen Shot 2022-08-14 at 10.51.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ce0b968d-7076-e66f-945d-cb8c05e36ea7.png)
1. ボックスに以下のURLを貼り付けます。

    ```
    https://raw.githubusercontent.com/taka-yayoi/public_repo/main/AutoML_classification/Databricks%20AutoML%E5%88%86%E9%A1%9E%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF.py
    ```
1. **インポート**をクリックすると、ノートブックがインポートされます。
![Screen Shot 2022-08-14 at 10.51.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1f8958dc-ffd7-0069-28db-d00fd6dc1167.png)
1. 左上の**アタッチされていません**と表示されているドロップダウンリストを展開し、**クラスターを作成する**をクリックします。
![Screen Shot 2022-08-14 at 10.51.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2fe943bd-be5b-8f6e-987e-0a656f176f43.png)
1. クラスター作成画面に遷移します。クラスターとはDatabricksにおける計算資源です。ノートブックの処理を実行するにはクラスターが必要となります。なお、ノートブックの編集の際にはクラスターは不要です。
    - **クラスター名**にわかりやすい名前をつけます。
    - **Databricks Runtimeのバージョン**で、`Runtime: 11.1ML`を選択します。ランタイムとはクラスターに自動でインストールされるソフトウェアパッケージです。
![Screen Shot 2022-08-14 at 10.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/eafd32b9-c028-80c2-be39-0340baa02fb7.png)
1. **クラスターを作成**をクリックします。クラスター名の右側のインジケーターが回転し、クラスターの作成が開始します。数分時間を要しますのでお待ちください。
![Screen Shot 2022-08-14 at 10.52.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e89c2cd5-912a-5b5f-2907-2dce598f330a.png)
1. 再びサイドメニューから**ワークスペース**をクリックし、自分のホームディレクトリにある`Databricks AutoML分類サンプルノートブック`をクリックして、ノートブックを開きます。
![Screen Shot 2022-08-14 at 10.52.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/258b1411-149d-034a-2787-99a55a76e5ee.png)
1. 左上のドロップダウンリストから先ほど選択したクラスターを選択します。
![Screen Shot 2022-08-14 at 10.52.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b0adc5d1-38aa-cfa3-ad2d-dc46106c9365.png)
1. クラスターが起動するとインジケータがチェックマークに変わります。
![Screen Shot 2022-08-14 at 10.59.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a1d5912f-df2d-9f48-7393-28aa3b718906.png)

# 分類問題を解いてみる

## 国勢調査 年収データセット

分類問題で使用するデータセットには1994年の国勢調査データベースから取得された国勢調査データが含まれています。それぞれの行が個人を表しています。ここでのゴールは、当該人物が年収5万ドルより多いか否かを判断することです。分類結果は**income**列に文字列`<=50K`あるいは`>50k`で表現されます。

以下のセルではデータのスキーマを定義した上で、データを読み込んでSparkデータフレームとしてロードしています。セルを実行するにはセル右側にある▶︎ボタンを展開し、**▶︎セルを実行**をクリックします。
![Screen Shot 2022-08-14 at 11.19.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9f767ce8-6957-0fe8-6c33-b7952a447052.png)

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

## トレーニングデータセットとテストデータセットの分割

```py:Python
train_df, test_df = input_df.randomSplit([0.99, 0.01], seed=42)
display(train_df)
```
![Screen Shot 2022-08-14 at 11.18.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/755a3efc-80b5-6a7d-e64f-fe368cdc919f.png)

## トレーニング

以下のコマンドでAutoMLを実行します。モデルが予測すべき目的変数を、引数`target_col`で指定する必要があります。実行が完了すると、トレーニングでベストなモデルを生成したノートブックにアクセスして、コードを確認することができます。このノートブックには特徴量の重要度のグラフも含まれています。`timeout_minutes`が30に設定されているので、処理に最大30分要します。

```py:Python
from databricks import automl
summary = automl.classify(train_df, target_col="income", timeout_minutes=30)
```

こちらを実行するとAutoMLによって大量の機械学習モデルが生成されますが、これら全ては[MLflow](https://qiita.com/taka_yayoi/items/1a4e82f7e20c56ba4f72)によって自動でトラッキングされます。MLflowでは1回の機械学習モデルのトレーニングを**ラン**と呼び、それらのランをまとめて**エクスペリメント**という単位で管理します。
![Screen Shot 2022-08-14 at 11.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/196141db-c0e5-b120-58d0-ac954741d5a5.png)

画面右上の**エクスペリメント**をクリックするとサイドバーとして記録されたモデルが一覧表示されます。
![Screen Shot 2022-08-14 at 11.21.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/00a4d51e-e546-c062-0c5c-fd2a90fc3fa3.png)

この状態でMLflowランの右にある右上向きに矢印が伸びているアイコンをクリックすると、別タブで詳細画面([エクスペリメントページ](https://qiita.com/taka_yayoi/items/e9f6d6628fbad209770b))が開きます。ちなみにその左にある**Date↓**をクリックするとモデルのソート順を変更することができます。
![Screen Shot 2022-08-14 at 11.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d0937fbc-7e2a-a48f-75eb-ddcee0be6b8c.png)

エクスペリメントページではトレーニングされたモデルのハイパーパラメーターやアルゴリズムなど詳細を確認したり、モデル同士を比較することができます。
![Screen Shot 2022-08-14 at 11.37.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/308a5176-4ff1-44b4-c99b-fa9cf202bad6.png)

トレーニングが終了すると以下のようなリンクが表示されます。
![Screen Shot 2022-08-14 at 11.42.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d8fd1dfb-6607-8888-a601-ae50fc8dab8a.png)

- **data exploration notebook**は、AutoMLに入力されたデータの分布などを確認できるノートブックであり、リンクをクリックすると別タブで開きます。
![Screen Shot 2022-08-14 at 11.44.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/54be7ccd-defe-1873-1419-40d07fe7f1e5.png)
![Screen Shot 2022-08-14 at 11.45.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c942a5f7-752a-24ff-37ce-6dfe0749e96e.png)
- **best trial notebook**は、AutoMLの結果最も良い精度を出したモデルをトレーニングした処理を記述しているノートブックであり、リンクをクリックすると別タブで開きます。今回はLightGBMが最も良い精度となりました。
![Screen Shot 2022-08-14 at 11.46.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/28013977-d6c1-23bf-400d-cffb5815d43a.png)
- **MLflow experiment**は、先ほど上で確認したエクスペリメントページへのリンクとなります。今回は合計74モデルがトレーニングされました。
![Screen Shot 2022-08-14 at 11.47.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3317ad45-a90e-5782-787e-58b9c88b63f5.png)
    ここで、ラン一覧の左上のチェックボックスにチェックを入れ全てのモデルを選択した状態で**比較**をクリックすると、それぞれのモデルを詳細に比較することができます。
![Screen Shot 2022-08-14 at 11.48.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d00dbb5f-71b2-ce99-e5aa-62aa98b81686.png)
   **散布図**を選択し、縦軸、横軸を選択することで、どのような傾向にあるのかをグラフで確認することも可能です。
![Screen Shot 2022-08-14 at 11.49.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5fc93c73-ff9b-5fa6-0a4c-0d0f92c3d539.png)

フルバージョンのDatabricksであれば、データセットの指定や問題の選択などをGUIから行うことができますが、Community Editionであってもこれだけの機能を活用してAutoMLを行うことができます。加えて、処理過程はすべてPythonノートブックとして生成されるので、中身のロジックのチェックやカスタマイズも容易です。

# 推論

トレーニングした機械学習モデルで推論を行うことも、MLflowを使えば簡単です。

新たなデータを用いて予測を行う際に、AutoMLでトレーニングしたモデルを活用することが可能です。以下の例では、pandasデータフレームのデータに対してどのように予測を行うのか、Sparkデータフレームに対して予測を行うために、モデルをどのようにSparkのUDF(ユーザー定義関数)として登録するのかをデモします。以下のコマンドでは、最も精度が良かった機械学習モデルのパスを取得しています。

```py:Python
model_uri = summary.best_trial.model_path
```

## pandasデータフレームに対する推論の実施

```py:Python
import mlflow

# テストデータセットの準備
test_pdf = test_df.toPandas()
y_test = test_pdf["income"]
X_test = test_pdf.drop("income", axis=1)

# ベストモデルによる推論の実行
model = mlflow.pyfunc.load_model(model_uri)
predictions = model.predict(X_test)
test_pdf["income_predicted"] = predictions
display(test_pdf)
```

結果の一番右側に`income_predicted`というカラムが追加されており、推論が行われていることがわかります。
![Screen Shot 2022-08-14 at 11.54.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9c76a967-cc90-5a07-1141-50f10e6fc92e.png)

## Sparkデータフレームに対する推論の実施

pandasデータフレームでも推論は可能ですが、推論するデータが大量になってきた場合、分散処理が可能となるSparkデータフレームを用いることをお勧めします。その際の推論では機械学習モデルをユーザー定義関数として定義することで、Pythonのapplyと同じような手順で分散処理による推論を行うことができます。

```py:Python
predict_udf = mlflow.pyfunc.spark_udf(spark, model_uri=model_uri, result_type="string")
display(test_df.withColumn("income_predicted", predict_udf()))
```
![Screen Shot 2022-08-14 at 11.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a55f9b7d-c582-ef08-4458-680b4f96c280.png)

## テスト

実運用環境において、最終的なベストモデルがどれだけの性能を発揮するのかを見積もるために、ホールドアウトしておいたテストセットで予測を行います。以下の図では正しい予測と誤った予測をブレークダウンしています。
![Screen Shot 2022-08-14 at 11.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4a954a5a-b628-7850-0ba9-a7e37cffc14f.png)

# まとめ

こちらでは、すぐにでも試せるCommunity EditionでのAutoMLを体験いただきました。Databricks AutoMLは[GUIもサポート](https://qiita.com/taka_yayoi/items/ae5913d83a74a071b87d)していますが、それよりも重要なのは中身の処理が全てわかるようになっている**ガラスボックスアプローチ**であると考えています。これには以下のメリットがあります。

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

次のシリーズでは[回帰問題](https://qiita.com/taka_yayoi/items/25d3356982040ea41091)や[時系列予測問題](https://qiita.com/taka_yayoi/items/a6d7f2e3104d90918c17)を解いています。

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