Databricks AutoMLの仕組み
この記事では、Databricks AutoML のしくみと、欠損値補完や 大規模なデータ サンプリングなどの概念の実装について詳しく説明します。
Databricks AutoMLは以下を実行します:
モデル トレーニング用のデータセットを準備します。 たとえば、AutoML は、モデルのトレーニングの前に、分類の問題に対して 不均衡なデータ検出 を実行します。
複数のモデルのトレーニングとチューニングを繰り返します。各モデルはオープンソースのコンポーネントから構築されており、簡単に編集して機械学習パイプラインに統合することができます。
AutoMLは、ハイパーパラメーターチューニングの試行をクラスターのワーカーノード全体に自動的に分散させます。
Databricks Runtime 9.1 LTS 機械学習以降では、データセットが大きすぎて 1 つのワーカーノードのメモリに収まらない場合、Auto機械学習によって自動的にサンプリングされます。大規模なデータセットのサンプリングを参照してください。
scikit-learn、xgboost、LightGBM、Prophet、ARIMAパッケージのアルゴリズムに基づいてモデルを評価します。
結果が表示され、各試行に関するPythonノートブック(ソースコード付き)が提供されます。これにより、コードを確認、再現、修正できます。AutoMLは、データセットの要約統計も計算し、後で確認できるようにこの情報をノートブックに保存します。
AutoMLアルゴリズム
Databricks AutoMLは、以下の表のアルゴリズムに基づいてモデルをトレーニングおよび評価します。
注
分類および回帰モデルでは、決定木、ランダムフォレスト、ロジスティック回帰、および確率的勾配降下アルゴリズムによる線形回帰はscikit-learnに基づいています。
分類モデル |
回帰モデル |
予測モデル |
---|---|---|
Auto-ARIMA(Databricks Runtime 10.3 ML以降で使用可能) |
||
サポートされているデータ特徴量タイプ
以下に記載されていない特徴量タイプはサポートされていません。たとえば、画像はサポートされていません。
以下の特徴量タイプがサポートされています。
数値(
ByteType
、ShortType
、IntegerType
、LongType
、FloatType
、DoubleType
)ブール値
文字列(カテゴリまたは英語のテキスト)
タイムスタンプ(
TimestampType
、DateType
)ArrayType[Numeric](Databricks ランタイム 10.4 LTS ML以降)
DecimalType(Databricks ランタイム 11.3 LTS ML以降)
データをトレーニング/検証/テストセットに分割する
Databricks Runtime 10.4 LTS ML 以降では、分類および回帰問題のトレーニング/検証/テスト データ分割に使用する時間列を指定できます。 この列を指定すると、データセットは時間ごとにトレーニング セット、検証 セット、テスト セットに分割されます。 最も古いポイントはトレーニングに使用され、次に古いポイントは検証に使用され、最新のポイントはテスト セットとして使用されます。 時間列は、タイムスタンプ、文字列、または整数列である必要があります。
大規模なデータセットをサンプリングする
注
サンプリングは予測問題には適用されません。
AutoMLはハイパーパラメーターチューニングの試行をクラスターのワーカーノード全体に分散させますが、各モデルは単一のワーカーノードでトレーニングされています。
AutoMLは、データセットの読み込みとトレーニングに必要なメモリを自動的に推定し、必要に応じてデータセットをサンプリングします。
Databricks Runtime 9.1 LTS ML から Databricks Runtime 10.4 LTS ML では、サンプリング率はクラスターのノード タイプや各ノードのメモリ量に依存しません。
Databricks Runtime 11.x MLでは、以下のようになります。
コアあたりのメモリ量が多いワーカーノードでは、サンプリング率が増加します。メモリが最適化されているインスタンスタイプを選択することで、サンプルサイズを増やすことができます。
クラスターのSpark設定で
spark.task.cpus
に大きな値を選択すると、サンプルサイズをさらに増やすことができます。デフォルト設定は1で、最大値はワーカーノードのCPU数です。この値を増やすと、サンプルサイズは大きくなりますが、並行して実行される試行の数は少なくなります。たとえば、4つのコアと合計64 GBのRAMが搭載されたマシンでは、デフォルトのspark.task.cpus=1
に従って、ワーカーごとに4回試行します。この場合、各試行のRAMは16 GBに制限されます。spark.task.cpus=4
と設定すると、各ワーカーは1回だけ試行しますが、その試行では64GBのRAMを使用できます。
Databricks Runtime 12.2 LTS ML以降では、 AutoMLトレーニング タスクごとにより多くの CPU コアを割り当てることで、より大きなデータセットでトレーニングを行うことができます。 合計メモリが大きいインスタンスサイズを選択することで、サンプルサイズを増やすことができます。
Databricks Runtime 11.3 LTS ML 以降では、AutoML がデータセットをサンプリングした場合、サンプリングの割合が UI の[概要]タブに表示されます。
分類問題では、AutoMLは層別サンプリングにPySparksampleBy
メソッドを使用し、ターゲットラベルの分布を保持します。
回帰問題の場合、AutoMLはPySparksample
メソッドを使用します。
分類の問題における不均衡なデータセットのサポート
Databricks Runtime 11.3 LTS ML 以降では、AutoML はデータセットの不均衡を検出すると、主要クラスをダウンサンプリングしてクラスの重みを追加することで、トレーニング データセットの不均衡を軽減しようとします。 AutoMLトレーニング データセットのバランスをとるだけで、テスト データセットと検証データセットのバランスはとりません。 こうすることで、モデルのパフォーマンスが常に、真の入力クラス分布を持つ非エンリッチデータセットで評価されるようになります。
不均衡なトレーニングデータセットのバランスをとるために、AutoMLはクラスの重みを使用します。この重みは、特定のクラスがダウンサンプリングされる度合いに反比例しています。たとえば、100サンプルのトレーニングデータセットに、クラスAに属する95個のサンプルとクラスBに属する5個のサンプルがある場合、AutoMLは、クラスBのサンプル数を5に保ちながら、クラスAを70サンプルにダウンサンプリング(クラスAを70/95または0.736の比率でダウンサンプリング)することで、この不均衡を軽減します。最終的なモデルが正しく調整され、モデル出力の確率分布が入力の確率分布と同じになるように、AutoMLはクラスBの重みを1として維持しながら、クラスAのクラスの重みを1/0.736または1.358の比率でスケールアップします。AutoMLは、モデルのトレーニングにこれらのクラスの重みをパラメーターとして使用することで、モデルのトレーニング時に各クラスのサンプルが適切に重み付けされるようにします。
セマンティック型の検出
注
セマンティック型の検出は、予測の問題には適用されません。
AutoML では、 カスタム補完メソッド が指定されている列のセマンティック型検出は実行されません。
Databricks Runtime 9.1 LTS 機械学習以降では、Auto機械学習は、列にテーブル スキーマの Spark データ型または pandas データ型とは異なるセマンティック型があるかどうかを検出しようとします。AutoML は、これらの列を検出されたセマンティックの種類として扱います。 これらの検出はベスト エフォートであり、場合によってはセマンティックの種類の存在を見逃す可能性があります。 また、列のセマンティック型を手動で設定したり、 注釈を使用してセマンティック型の検出を列に適用しないように AutoML に指示したりすることもできます。
具体的には、AutoMLは以下の調整を行います:
日付またはタイムスタンプデータを表す文字列および整数の列は、タイムスタンプ型として扱われます。
数値データを表す文字列カラムは数値型として扱われます。
Databricks Runtime 10.1 ML以降では、AutoMLは以下の調整も行います。
カテゴリIDを含む数値列は、カテゴリ特徴量として扱われます。
英語のテキストを含む文字列は、テキスト特徴量として扱われます。
セマンティック型のアノテーション
Databricks Runtime 10.1 ML以降では、列にセマンティック型のアノテーションを付与することで、割り当てられるセマンティック型を手動で制御できます。列<column-name>
のセマンティック型を<semantic-type>
として手動でアノテーションを付与するには、以下の構文を使用します。
metadata_dict = df.schema["<column-name>"].metadata
metadata_dict["spark.contentAnnotation.semanticType"] = "<semantic-type>"
df = df.withMetadata("<column-name>", metadata_dict)
<semantic-type>
は、以下のいずれかとなります。
categorical
:列にはカテゴリ値(たとえば、IDとして扱う必要がある数値)が含まれています。numeric
:列には数値(たとえば、数値として解析できる文字列値)が含まれています。datetime
:列にはタイムスタンプ値(タイムスタンプに変換できる文字列、数値、または日付値)が含まれています。text
:文字列に英語のテキストが含まれています。
列のセマンティック型検出を無効にするには、特別なキーワードアノテーションnative
を使用します。
モデルの説明可能性のためのShapley値(SHAP)
注
MLR 11.1以前では、データセットにdatetime
列が含まれている場合、SHAPプロットが生成されません。
AutoMLの回帰と分類の実行によって作成されたノートブックには、Shapley値を計算するコードが含まれています。Shapley値はゲーム理論に基づいており、モデルの予測に対する各特徴量の重要性を推定します。
AutoMLノートブックは、SHAPパッケージを使用してShapley値を計算します。これらの計算はメモリを大量に消費するため、デフォルトでは実行されません。
Shapley値を計算して表示するには、以下を実行します。
AutoMLで生成されたトライアルノートブックの「特徴量の重要度」セクションに移動します。
shap_enabled = True
と設定します。ノートブックを再実行します。
時系列集計
予測の問題では、時系列のタイムスタンプに複数の値がある場合、AutoMLはその平均値を使用します。
代わりに合計を使用するには、ソースコードノートブックを編集します。「データの集計基準」セルで、.agg(y=(target_col, "avg"))
を.agg(y=(target_col, "sum"))
に変更します:
group_cols = [time_col] + id_cols
df_aggregation = df_loaded \
.groupby(group_cols) \
.agg(y=(target_col, "sum")) \
.reset_index() \
.rename(columns={ time_col : "ds" })
Feature Storeの統合
Databricks Runtime 11.3 LTS ML以降では、Feature Storeの既存の特徴量テーブルを使用して、分類および回帰の問題に対して元の入力データセットを拡張できます。
Databricks Runtime 12.2 LTS ML以降では、Feature Storeの既存の特徴量テーブルを使用して、分類、回帰、予測など、AutoMLのすべての問題に対して元の入力データセットを拡張できます。
特徴量テーブルを作成するには、「 Feature Storeとは」を参照してください。
既存の機能テーブルを使用するには、 AutoML UI で機能テーブルを選択するか 、 AutoML 実行仕様で feature_store_lookups
パラメーターを設定します。
feature_store_lookups = [
{
"table_name": "example.trip_pickup_features",
"lookup_key": ["pickup_zip", "rounded_pickup_datetime"],
},
{
"table_name": "example.trip_dropoff_features",
"lookup_key": ["dropoff_zip", "rounded_dropoff_datetime"],
}
]
試用版ノートブックの生成
エクスペリメントを予測する場合、AutoML で生成されたノートブックは、エクスペリメントのすべてのトライアルのワークスペースに自動的にインポートされます。
分類と回帰のエクスペリメントでは、データ探索用に AutoML によって生成されたノートブックと、エクスペリメント内の最適なトライアルが自動的にワークスペースにインポートされます。 他のエクスペリメント試用用に生成されたノートブックは、ワークスペースに自動インポートされるのではなく、DBFS に MLflow 成果物として保存されます。 最適なトライアル以外のすべてのトライアルでは、TrialInfo
Python API のnotebook_path
とnotebook_url
は設定されていません。これらのノートブックを使用する必要がある場合は、AutoML エクスペリメント UI または databricks.automl.import_notebook
Python API を使用して、ワークスペースに手動でインポートできます。
AutoML によって生成されたデータ探索ノートブックまたは最適な試用版ノートブックのみを使用する場合、AutoML エクスペリメント UI の [ソース ] 列には、最適な試用版用に生成されたノートブックへのリンクが含まれます。
AutoML エクスペリメント UI で他の生成されたノートブックを使用する場合、これらはワークスペースに自動的にインポートされません。 ノートブックを見つけるには、各 MLflow 実行をクリックします。 IPython ノートブックは、実行ページの [アーティファクト] セクションに保存されます。 ワークスペース管理者によって成果物のダウンロードが有効になっている場合は、このノートブックをダウンロードしてワークスペースにインポートできます。