LoginSignup
1
2

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-08-14

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

無料のCommunity Editionへのサインアップの手順についてはこちらを参考にしてください。また、フルバージョンのDatabricksとの違いに関しては、こちらを参照ください。

以下の手順では、すでにワークスペースへのログインまで完了していることを前提としています。
Screen Shot 2022-08-14 at 10.50.32.png

Databricks AutoMLとは

AutoMLとはAutomated machine learningの略であり、現実世界の問題に対して機械学習を適用する際のタスクを自動化するプロセスのことを意味します。

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

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

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

UIあるいはPython APIでAutoMLを実行することができます。

注意
Community EditionではPythonノートブックからのAutoMLの実行は可能ですが、GUIでのAutoMLはサポートされていません。GUIでのAutoMLのウォークスルーに関しては、こちらを参照ください。

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

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

  1. サイドメニューが日本語になっていない場合は、こちらを参考に言語を日本語に設定してください。

  2. サイドメニューからワークスペースを選択します。
    Screen Shot 2022-08-14 at 10.50.40.png

  3. ホームボタンをクリックして、自分のホームディレクトリに移動します。
    Screen Shot 2022-08-14 at 10.50.45.png

  4. 自分のメールアドレスの右にある下向き矢印のアイコンをクリックしてメニューを展開します。
    Screen Shot 2022-08-14 at 10.50.53.png

  5. インポートを選択します。インポートダイアログが表示されます。このダイアログからノートブックをインポートすることができます。
    Screen Shot 2022-08-14 at 10.51.03.png

  6. URLを選択します。
    Screen Shot 2022-08-14 at 10.51.28.png

  7. ボックスに以下の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
    
  8. インポートをクリックすると、ノートブックがインポートされます。
    Screen Shot 2022-08-14 at 10.51.35.png

  9. 左上のアタッチされていませんと表示されているドロップダウンリストを展開し、クラスターを作成するをクリックします。
    Screen Shot 2022-08-14 at 10.51.42.png

  10. クラスター作成画面に遷移します。クラスターとはDatabricksにおける計算資源です。ノートブックの処理を実行するにはクラスターが必要となります。なお、ノートブックの編集の際にはクラスターは不要です。

    • クラスター名にわかりやすい名前をつけます。
    • Databricks Runtimeのバージョンで、Runtime: 11.1MLを選択します。ランタイムとはクラスターに自動でインストールされるソフトウェアパッケージです。
      Screen Shot 2022-08-14 at 10.51.56.png
  11. クラスターを作成をクリックします。クラスター名の右側のインジケーターが回転し、クラスターの作成が開始します。数分時間を要しますのでお待ちください。
    Screen Shot 2022-08-14 at 10.52.08.png

  12. 再びサイドメニューからワークスペースをクリックし、自分のホームディレクトリにあるDatabricks AutoML分類サンプルノートブックをクリックして、ノートブックを開きます。
    Screen Shot 2022-08-14 at 10.52.15.png

  13. 左上のドロップダウンリストから先ほど選択したクラスターを選択します。
    Screen Shot 2022-08-14 at 10.52.31.png

  14. クラスターが起動するとインジケータがチェックマークに変わります。
    Screen Shot 2022-08-14 at 10.59.52.png

分類問題を解いてみる

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

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

以下のセルではデータのスキーマを定義した上で、データを読み込んでSparkデータフレームとしてロードしています。セルを実行するにはセル右側にある▶︎ボタンを展開し、▶︎セルを実行をクリックします。
Screen Shot 2022-08-14 at 11.19.23.png

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

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

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

トレーニング

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

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

こちらを実行するとAutoMLによって大量の機械学習モデルが生成されますが、これら全てはMLflowによって自動でトラッキングされます。MLflowでは1回の機械学習モデルのトレーニングをランと呼び、それらのランをまとめてエクスペリメントという単位で管理します。
Screen Shot 2022-08-14 at 11.15.48.png

画面右上のエクスペリメントをクリックするとサイドバーとして記録されたモデルが一覧表示されます。
Screen Shot 2022-08-14 at 11.21.57.png

この状態でMLflowランの右にある右上向きに矢印が伸びているアイコンをクリックすると、別タブで詳細画面(エクスペリメントページ)が開きます。ちなみにその左にあるDate↓をクリックするとモデルのソート順を変更することができます。
Screen Shot 2022-08-14 at 11.34.38.png

エクスペリメントページではトレーニングされたモデルのハイパーパラメーターやアルゴリズムなど詳細を確認したり、モデル同士を比較することができます。
Screen Shot 2022-08-14 at 11.37.02.png

トレーニングが終了すると以下のようなリンクが表示されます。
Screen Shot 2022-08-14 at 11.42.37.png

  • data exploration notebookは、AutoMLに入力されたデータの分布などを確認できるノートブックであり、リンクをクリックすると別タブで開きます。
    Screen Shot 2022-08-14 at 11.44.23.png
    Screen Shot 2022-08-14 at 11.45.13.png
  • best trial notebookは、AutoMLの結果最も良い精度を出したモデルをトレーニングした処理を記述しているノートブックであり、リンクをクリックすると別タブで開きます。今回はLightGBMが最も良い精度となりました。
    Screen Shot 2022-08-14 at 11.46.24.png
  • MLflow experimentは、先ほど上で確認したエクスペリメントページへのリンクとなります。今回は合計74モデルがトレーニングされました。
    Screen Shot 2022-08-14 at 11.47.38.png
    ここで、ラン一覧の左上のチェックボックスにチェックを入れ全てのモデルを選択した状態で比較をクリックすると、それぞれのモデルを詳細に比較することができます。
    Screen Shot 2022-08-14 at 11.48.34.png
    散布図を選択し、縦軸、横軸を選択することで、どのような傾向にあるのかをグラフで確認することも可能です。
    Screen Shot 2022-08-14 at 11.49.40.png

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

推論

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

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

Python
model_uri = summary.best_trial.model_path

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

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

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

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

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

テスト

実運用環境において、最終的なベストモデルがどれだけの性能を発揮するのかを見積もるために、ホールドアウトしておいたテストセットで予測を行います。以下の図では正しい予測と誤った予測をブレークダウンしています。
Screen Shot 2022-08-14 at 11.58.21.png

まとめ

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

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

次のシリーズでは回帰問題時系列予測問題を解いています。

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

Databricks 無料トライアル

Databricks 無料トライアル

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2