メインコンテンツまでスキップ

はじめに: Databricks で初めての機械学習モデルを構築する

この記事では、Databricks の scikit-learn ライブラリを使用して機械学習分類モデルを構築する方法について説明します。

目標は、ワインが「高品質」と見なされるかどうかを予測する分類モデルを作成することです。 データセットは、さまざまなワインの 11 の特徴 (アルコール含有量、酸度、残留糖など) と、1 から 10 の品質ランキングで構成されています。

この例では、MLflow を使用してモデル開発プロセスを追跡し、Hyperopt を使用してハイパーパラメーターチューニングを自動化することも示しています。

このデータセットは、Modeling wine preferences by data mining from physicochemical properties [Cortez et al., 2009] に掲載されているUCI Machine Learningリポジトリからのものです。

始める前に

  • ワークスペースで Unity Catalog が有効になっている必要があります。 「Unity Catalog の設定と管理」を参照してください。
  • コンピュート リソースを作成する権限、または Databricks Runtime for Machine Learning を使用するコンピュート リソースへのアクセス権が必要です。
  • カタログに対するUSE_CATALOG権限が必要です。
  • そのカタログ内では、スキーマに対する権限 (USE_SCHEMA、CREATE_TABLE、および CREATE_MODEL) が必要です。
ヒント

この記事のすべてのコードは、ワークスペースに直接インポートできるノートブックで使用できます。 「サンプル ノートブック: 分類モデルの構築」を参照してください。

手順 1: Databricks ノートブックを作成する

ワークスペースにノートブックを作成するには、サイドバーの「新しいアイコン 新規 」をクリックし、「 ノートブック 」をクリックします。空白のノートブックがワークスペースで開きます。

ノートブックの作成と管理の詳細については、「 ノートブックの管理」を参照してください。

ステップ 2: コンピュート リソースに接続する

探索的データ分析とデータエンジニアリングを行うには、 コンピュートにアクセスできる必要があります。 この記事の手順では、Databricks Runtime for Machine Learning が必要です。 の バージョンを選択するための詳細情報と手順については、「MLDatabricks Runtime Databricks Runtime機械学習の 」を参照してください。

ノートブックで、右上の [接続 ] プルダウン メニューをクリックします。 Databricks Runtime for Machine Learning を使用する既存のリソースにアクセスできる場合は、メニューからそのリソースを選択します。 それ以外の場合は、[ 新しいリソースの作成] をクリックして 、新しいコンピュート リソースを構成します

ステップ 3: モデルレジストリ、カタログ、スキーマを設定する

開始する前に、2つの重要な手順が必要です。 まず、 MLflow クライアントをモデルレジストリとして Unity Catalog を使用するように構成する必要があります。 ノートブックの新しいセルに次のコードを入力します。

Python
import mlflow
mlflow.set_registry_uri("databricks-uc")

また、モデルが登録されるカタログとスキーマも設定する必要があります。 カタログに対する USE CATALOG 権限と、スキーマに対する USE_SCHEMA、CREATE_TABLE、および CREATE_MODEL 権限が必要です。

Unity Catalogの使用方法の詳細については、「Unity Catalogとは」を参照してください。

ノートブックの新しいセルに次のコードを入力します。

Python
# If necessary, replace "main" and "default" with a catalog and schema for which you have the required permissions.
CATALOG_NAME = "main"
SCHEMA_NAME = "default"

ステップ 4: データを読み込み、Unity Catalog テーブルを作成する

この例では、 databricks-datasetsで使用できる 2 つの CSV ファイルを使用します。 独自のデータを取り込む方法については、「 Databricks レイクハウスにデータを取り込む」を参照してください。

ノートブックの新しいセルに次のコードを入力します。 このコードは、次のことを行います。

  1. winequality-white.csv からデータを読み取り、 Spark DataFramesにwinequality-red.csvします。
  2. 列名のスペースをアンダースコアに置き換えて、データをクリーンアップします。
  3. DataFrames を Unity Catalogの white_wine テーブルと red_wine テーブルに書き込みます。データを Unity Catalog に保存すると、データが保持され、他のユーザーと共有する方法を制御できます。
Python
white_wine = spark.read.csv("/databricks-datasets/wine-quality/winequality-white.csv", sep=';', header=True)
red_wine = spark.read.csv("/databricks-datasets/wine-quality/winequality-red.csv", sep=';', header=True)

# Remove the spaces from the column names
for c in white_wine.columns:
white_wine = white_wine.withColumnRenamed(c, c.replace(" ", "_"))
for c in red_wine.columns:
red_wine = red_wine.withColumnRenamed(c, c.replace(" ", "_"))

# Define table names
red_wine_table = f"{CATALOG_NAME}.{SCHEMA_NAME}.red_wine"
white_wine_table = f"{CATALOG_NAME}.{SCHEMA_NAME}.white_wine"

# Write to tables in Unity Catalog
spark.sql(f"DROP TABLE IF EXISTS {red_wine_table}")
spark.sql(f"DROP TABLE IF EXISTS {white_wine_table}")
white_wine.write.saveAsTable(f"{CATALOG_NAME}.{SCHEMA_NAME}.white_wine")
red_wine.write.saveAsTable(f"{CATALOG_NAME}.{SCHEMA_NAME}.red_wine")

ステップ5.データの前処理と分割

このステップでは、ステップ 4 で作成した Unity Catalog テーブルから Pandas DataFrames にデータを読み込み、データを前処理します。 このセクションのコードでは、次のことを行います。

  1. データを Pandas DataFramesとしてロードします。
  2. 赤ワインと白ワインを区別するために各 にBoolean 列を追加し、 を新しいDataFrameDataFrames DataFramedata_dfに結合します。
  3. データセットには、ワインを 1 から 10 まで評価する quality 列が含まれており、10 は最高品質を示します。 このコードは、この列を 2 つの分類値に変換します。"True" は高品質のワイン (quality >= 7) を示し、"False" は高品質ではないワイン (quality < 7) を示します。
  4. DataFrame を個別のトレーニング データセットとテスト データセットに分割します。

まず、必要なライブラリをインポートします。

Python
import numpy as np
import pandas as pd
import sklearn.datasets
import sklearn.metrics
import sklearn.model_selection
import sklearn.ensemble

import matplotlib.pyplot as plt

from hyperopt import fmin, tpe, hp, SparkTrials, Trials, STATUS_OK
from hyperopt.pyll import scope

次に、データをロードして前処理します。

Python
# Load data from Unity Catalog as Pandas dataframes
white_wine = spark.read.table(f"{CATALOG_NAME}.{SCHEMA_NAME}.white_wine").toPandas()
red_wine = spark.read.table(f"{CATALOG_NAME}.{SCHEMA_NAME}.red_wine").toPandas()

# Add Boolean fields for red and white wine
white_wine['is_red'] = 0.0
red_wine['is_red'] = 1.0
data_df = pd.concat([white_wine, red_wine], axis=0)

# Define classification labels based on the wine quality
data_labels = data_df['quality'].astype('int') >= 7
data_df = data_df.drop(['quality'], axis=1)

# Split 80/20 train-test
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(
data_df,
data_labels,
test_size=0.2,
random_state=1
)

ステップ6.分類モデルをトレーニングする

このステップでは、デフォルトのアルゴリズム設定を用いて、勾配ブースト分類器をトレーニングします。次に、結果のモデルをテストデータセットに適用し、 ROC曲線のAUC を計算、ログ、および表示して、モデルのパフォーマンスを評価します。

まず、MLflow の自動ログ記録を有効にします。

Python
mlflow.autolog()

次に、モデルトレーニングの実行を開始します。

Python
with mlflow.start_run(run_name='gradient_boost') as run:
model = sklearn.ensemble.GradientBoostingClassifier(random_state=0)

# Models, parameters, and training metrics are tracked automatically
model.fit(X_train, y_train)

predicted_probs = model.predict_proba(X_test)
roc_auc = sklearn.metrics.roc_auc_score(y_test, predicted_probs[:,1])
roc_curve = sklearn.metrics.RocCurveDisplay.from_estimator(model, X_test, y_test)

# Save the ROC curve plot to a file
roc_curve.figure_.savefig("roc_curve.png")

# The AUC score on test data is not automatically logged, so log it manually
mlflow.log_metric("test_auc", roc_auc)

# Log the ROC curve image file as an artifact
mlflow.log_artifact("roc_curve.png")

print("Test AUC of: {}".format(roc_auc))

セルの結果には、計算された曲線の下の面積とROC曲線のプロットが表示されます。

分類モデルの ROC 曲線。

ステップ7.View エクスペリメント 実行 in MLflow

エクスペリメント追跡MLflow、モデルを反復的に開発するときにコードと結果をログに記録することで、モデル開発を追跡するのに役立ちます。

実行したトレーニング実行のログ結果を表示するには、次の図に示すように、セル出力のリンクをクリックします。

セルの結果のエクスペリメントへのリンク。

エクスペリメント ページでは、実行を比較したり、特定の実行の詳細を表示したりできます。 実行の名前をクリックすると、その実行のパラメーター値やメトリクス値などの詳細が表示されます。 エクスペリメントMLflowトラッキングを参照してください。

ノートブックの右上にある エクスペリメント アイコン エクスペリメントアイコン をクリックして、ノートブックのエクスペリメント 実行を表示することもできます。 エクスペリメントのサイドバーが開き、ノートブックのエクスペリエンスに関連付けられた各実行の概要 (実行 パラメーターやメトリクスなど) が表示されます。 必要に応じて、更新アイコンをクリックして、最新の実行をフェッチして監視します。

ノートブックのエクスペリメント 実行サイドバーには、最新の MLflow 実行が表示されます。

ステップ8.ハイパーパラメーターチューニングに Hyperopt を使用する

MLモデルを開発する際の重要な手順は、ハイパーパラメーターと呼ばれるアルゴリズムを制御するパラメーターを調整して、モデルの精度を最適化することです。

Databricks RuntimeMLHyperoptPythonには、ハイパーチューニングパラメーターの ライブラリである が含まれています。Hyperopt を使用して、ハイパーパラメーター スイープを実行し、複数のモデルを並列でトレーニングできるため、モデルのパフォーマンスを最適化するために必要な時間を短縮できます。 MLflow トラッキングは、 Hyperopt to automatically 記録済みモデルとパラメーターと統合されています。 HyperoptでのDatabricks の使用の詳細については、「ハイパーパラメーターチューニング 」を参照してください。

次のコードは、Hyperopt の使用例を示しています。

Python
# Define the search space to explore
search_space = {
'n_estimators': scope.int(hp.quniform('n_estimators', 20, 1000, 1)),
'learning_rate': hp.loguniform('learning_rate', -3, 0),
'max_depth': scope.int(hp.quniform('max_depth', 2, 5, 1)),
}

def train_model(params):
# Enable autologging on each worker
mlflow.autolog()
with mlflow.start_run(nested=True):
model_hp = sklearn.ensemble.GradientBoostingClassifier(
random_state=0,
**params
)
model_hp.fit(X_train, y_train)
predicted_probs = model_hp.predict_proba(X_test)
# Tune based on the test AUC
# In production, you could use a separate validation set instead
roc_auc = sklearn.metrics.roc_auc_score(y_test, predicted_probs[:,1])
mlflow.log_metric('test_auc', roc_auc)

# Set the loss to -1*auc_score so fmin maximizes the auc_score
return {'status': STATUS_OK, 'loss': -1*roc_auc}

# SparkTrials distributes the tuning using Spark workers
# Greater parallelism speeds processing, but each hyperparameter trial has less information from other trials
# On smaller clusters try setting parallelism=2
spark_trials = SparkTrials(
parallelism=1
)

with mlflow.start_run(run_name='gb_hyperopt') as run:
# Use hyperopt to find the parameters yielding the highest AUC
best_params = fmin(
fn=train_model,
space=search_space,
algo=tpe.suggest,
max_evals=32,
trials=spark_trials)

ステップ9.最適なモデルを見つけて Unity Catalog に登録する

次のコードは、ROC 曲線の下の面積で測定された、最良の結果を生成した実行を示しています。

Python
# Sort runs by their test auc. In case of ties, use the most recent run.
best_run = mlflow.search_runs(
order_by=['metrics.test_auc DESC', 'start_time DESC'],
max_results=10,
).iloc[0]
print('Best Run')
print('AUC: {}'.format(best_run["metrics.test_auc"]))
print('Num Estimators: {}'.format(best_run["params.n_estimators"]))
print('Max Depth: {}'.format(best_run["params.max_depth"]))
print('Learning Rate: {}'.format(best_run["params.learning_rate"]))

最適なモデルとして特定したrun_idを使用して、次のコードをそのモデルを Unity Catalogに登録します。

Python
model_uri = 'runs:/{run_id}/model'.format(
run_id=best_run.run_id
)

mlflow.register_model(model_uri, f"{CATALOG_NAME}.{SCHEMA_NAME}.wine_quality_model")

ノートブックの例: 分類モデルを構築する

次のノートブックを使用して、この記事の手順を実行します。 ノートブックを Databricks ワークスペースにインポートする手順については、「 ノートブックのインポート」を参照してください。

Databricks で初めての機械学習モデルを構築する

Open notebook in new tab

詳細情報

Databricks は、生データから、提供されたモデルのすべてのリクエストとレスポンスを保存する推論テーブルまで、ML の開発とデプロイのすべてのステップに対応する単一のプラットフォームを提供します。 データサイエンティスト、データエンジニア、 ML エンジニア、および DevOps は、データの同じツールセットと単一の真実のソースを使用して、それぞれの作業を行うことができます。

詳細については、以下を参照してください。

関連リソース