このノートブック例では、AutoML Python API を使用して Databricks で分類モデルをトレーニングする方法を示します。 UCI Census Income データセットを使用して、 automl.classify() を呼び出して、個人が年間 $50,000 を超える収入を得ているかどうかを予測し、最適な試用版を使用して pandas と Spark DataFrames の両方で推論を実行します。
Requirements
Databricks Runtime for Machine Learning.
国勢調査収入データセット
このデータセットには、1994 年の国勢調査データベースの国勢調査データが含まれています。 各行は、個人のグループを表します。 目標は、グループの収入が年収が 50,000 万を超えているかどうかを判断することです。 この分類は、値または<=50K値を持つ>50k列の文字列として表されます。
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")
トレーニング/テストの分割
train_df, test_df = input_df.randomSplit([0.99, 0.01], seed=42)
display(train_df)
トレーニング
次のコマンドは、AutoML の実行を開始します。 モデルが予測する列を target_col 引数に指定する必要があります。
実行が完了したら、最適な試用版ノートブックへのリンクに従って、トレーニング コードを確認できます。 このノートブックには、特徴重要度プロットも含まれています。
from databricks import automl
summary = automl.classify(train_df, target_col="income", timeout_minutes=30)
次のコマンドは、AutoML 出力に関する情報を表示します。
help(summary)
推論
AutoML によってトレーニングされたモデルを使用して、新しいデータに対して予測を行うことができます。 次の例は、pandas DataFrames のデータに対して予測を行うか、Spark DataFrames での予測用の Spark UDF としてモデルを登録する方法を示しています。
model_uri = summary.best_trial.model_path
# model_uri = "<model-uri-from-generated-notebook>"
pandasデータフレーム
import mlflow
# Prepare test dataset
test_pdf = test_df.toPandas()
y_test = test_pdf["income"]
X_test = test_pdf.drop("income", axis=1)
# Run inference using the best model
model = mlflow.pyfunc.load_model(model_uri)
predictions = model.predict(X_test)
test_pdf["income_predicted"] = predictions
display(test_pdf)
Spark DataFrame
predict_udf = mlflow.pyfunc.spark_udf(spark, model_uri=model_uri, result_type="string")
display(test_df.withColumn("income_predicted", predict_udf()))
Test
最終的なモデルを使用して、ホールドアウト テスト セットに対して予測を行い、運用環境の設定でモデルがどのように実行されるかを見積もります。 この図は、正しい予測と正しくない予測の内訳を示しています。
import sklearn.metrics
model = mlflow.sklearn.load_model(model_uri)
sklearn.metrics.plot_confusion_matrix(model, X_test, y_test)
モデルを登録してデプロイする
MLflow モデル レジストリの他のモデルと同様に、AutoML によってトレーニングされたモデルを登録してデプロイできます。 MLflow モデルのログ記録、読み込み、登録を参照してください。
トラブルシューティング: No module named pandas.core.indexes.numeric
モザイク AI モデル サービスを使用して AutoML トレーニング済みモデルを提供すると、エラー No module named pandas.core.indexes.numericが表示されることがあります。 これは、AutoML で使用される pandas バージョンが、エンドポイント環境を提供するモデルのバージョンと異なる場合に発生します。 解決するには、以下を行います。
-
add-pandas-dependency.py スクリプトをダウンロード。 このスクリプトでは、ログに記録されたモデルの
requirements.txtとconda.yamlが編集され、pandas==1.5.3がピン留めされます。 - モデルがログに記録された MLflow 実行の
run_idを含むようにスクリプトを編集します。 - モデルを再登録します。
- 新しいモデル バージョンを提供します。