Databricks Community EditionでAutoMLを使って回帰問題を解いてみる

こちらの続編的内容です。回帰問題をAutoMLで解いてみます。

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

無料の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)

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

# 回帰問題を解いてみる

:::note info
**注意**
Databricks Community Editionでは一度停止したクラスターを再度起動することはできません。再度クラスターを作成してください。
:::

ノートブックのインポート手順とクラスターの作成手順は[こちら](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_regression

インポート時のURLはこちらです。

```
https://raw.githubusercontent.com/taka-yayoi/public_repo/main/AutoML_regression/Databricks%20AutoML%E5%9B%9E%E5%B8%B0%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
```

ノートブックがインポートされ、クラスターが起動すると以下のような状態になっているはずです。
![Screen Shot 2022-08-14 at 16.20.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2107eaea-be50-111b-34e2-38f46b469059.png)


## カルフォルニア住宅データセット

このデータセットは1990年のアメリカの国勢調査から作成されたものです。一行が国勢調査のブロックグループとなります。目的変数はカルフォルニアの地域における住宅価格の中央値です。

```py:Python
import sklearn
input_pdf = sklearn.datasets.fetch_california_housing(as_frame=True)
display(input_pdf.frame)
```

一番右にある`MedHouseVal`が目的変数となる住宅価格の中央値です。
![Screen Shot 2022-08-14 at 16.21.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3956a528-a111-0da2-0368-70f9135a766f.png)

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

```py:Python
from sklearn.model_selection import train_test_split

train_pdf, test_pdf = train_test_split(input_pdf.frame, test_size=0.01, random_state=42)
display(train_pdf)
```

# トレーニング

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

```py:Python
from databricks import automl
summary = automl.regress(train_pdf, target_col="MedHouseVal", timeout_minutes=30)
```

上のコマンドを実行すると、[分類問題の時](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)と同じように大量のモデルが生成され、それら全てが[MLflow](https://qiita.com/taka_yayoi/items/1a4e82f7e20c56ba4f72)によって記録されていきます。
![Screen Shot 2022-08-14 at 16.26.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9c13e6c1-bbc1-efa2-b9f5-2c3725a90c9b.png)

エクスペリメントページで詳細を確認することもできます。
![Screen Shot 2022-08-14 at 16.27.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/99f3bf64-419d-eddd-7047-31a36fd9b430.png)

トレーニングが完了するとデータ探索用のノートブック(data exploration notebook)、ベストモデルのノートブック(best trial notebook)、MLflowエクスペリメント(MLflow experiment)へのリンクが表示されます。
![Screen Shot 2022-08-14 at 16.54.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/205b0529-19e7-1657-1a11-39148cd9be25.png)
今回は130のモデルがトレーニングされました。
![Screen Shot 2022-08-14 at 16.56.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c477616c-9f2e-43d1-69f7-c3547968f09b.png)

# 推論

新たなデータを用いて予測を行う際に、AutoMLでトレーニングしたモデルを活用することが可能です。以下の例では、pandasデータフレームのデータに対してどのように予測を行うのか、Sparkデータフレームに対して予測を行うために、モデルをどのようにSparkのUDF(ユーザー定義関数)として登録するのかをデモします。

## pandasデータフレーム

`summary.best_trial`でベストなモデルにアクセスすることができます。

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

呼び出したベストモデルを用いて推論を行います。

```py:Python
import mlflow

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

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

推論結果が`MedHouseVal_predicted`として得られます。
![Screen Shot 2022-08-14 at 16.59.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ab168b35-0447-d5fe-8494-455889845cf5.png)

## Sparkデータフレーム

Sparkデータフレームに対しても同様に推論を行うことができます。

```py:Python
# テストデータセットの準備
test_df = spark.createDataFrame(test_pdf)

predict_udf = mlflow.pyfunc.spark_udf(spark, model_uri=model_uri)
display(test_df.withColumn("MedHouseVal_predicted", predict_udf()))
```
![Screen Shot 2022-08-14 at 17.01.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cd0e613f-2ec4-def0-7a91-e7fb84a1344f.png)

## テスト

実運用環境において、最終的なベストモデルがどれだけの性能を発揮するのかを見積もるために、ホールドアウトしておいたテストセットで予測を行います。

```py:Python
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# データセットの準備
y_pred = test_pdf["MedHouseVal_predicted"]
test = pd.DataFrame({"Predicted":y_pred,"Actual":y_test})
test = test.reset_index()
test = test.drop(["index"], axis=1)

# グラフのプロット
fig= plt.figure(figsize=(16,8))
plt.plot(test[:50])
plt.legend(["Actual", "Predicted"])
sns.jointplot(x="Actual", y="Predicted", data=test, kind="reg");
```
![Screen Shot 2022-08-14 at 17.04.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/09f648a9-975f-fc22-eff7-f0eaed833272.png)
![Screen Shot 2022-08-14 at 17.04.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ac4aa511-26ef-21db-093b-eb2196fe0424.png)

# まとめ

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

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

前のシリーズでは[分類問題](https://qiita.com/taka_yayoi/items/3010e1e4b023c3d7c793)や[時系列予測問題](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)