Databricks AutoML データの準備と処理
この記事では、Databricks AutoML が機械学習トレーニング用にデータを準備する方法と、構成可能なデータ設定について説明します。 これらのオプションは、 AutoML UIでの拡張機能のセットアップ中に調整できます。 AutoML APIを使用してこれらの設定を構成する方法については、 AutoML Python API リファレンスを参照してください。
サポートされているデータ特徴量タイプ
以下に記載されていない特徴量タイプはサポートされていません。たとえば、画像はサポートされていません。
以下の特徴量タイプがサポートされています。
数値(
ByteType
、ShortType
、IntegerType
、LongType
、FloatType
、DoubleType
)ブール値
文字列(カテゴリまたは英語のテキスト)
タイムスタンプ(
TimestampType
、DateType
)ArrayType[Numeric](Databricks ランタイム 10.4 LTS ML以降)
DecimalType(Databricks ランタイム 11.3 LTS ML以降)
列の選択
注:
この機能は、分類問題と回帰問題でのみ使用できます
Databricks Runtime 10.3 ML 以降では、AutoML がトレーニングに使用する列を指定できます。 UI で列を除外するには、[ 含める ] 列でその列をオフにします。 APIでは、exclude_cols
を使用します。 詳細については、 Databricks AutoML Python APIリファレンスを参照してください。
予測テストとして選択した列またはデータを分割する時間列として選択した列を削除することはできません。
デフォルトでは、すべての列が含まれます。
欠損値の代入
Databricks Runtime 10.4 LTS ML 以降では、null 値の補完方法を指定できます。 UI で、テーブル スキーマの [ Implute with ] 列のドロップダウンからメソッドを選択します。 APIでは、imputers
を使用します。 詳細については、 Databricks AutoML Python APIリファレンスを参照してください。
デフォルトでは、AutoML は列のタイプとコンテンツに基づいて補完方法を選択します。
注:
デフォルト以外の補完方法を指定した場合、AutoML はセマンティック型の検出を実行しません。
データをトレーニング、検証、テストセットに分割する
AutoML はデータをトレーニング、検証、テストの 3 つの部分に分割します。 ML 問題の種類に応じて、データを分割するためのさまざまなオプションがあります。
回帰と分類のためのデータの分割
次の方法を使用して、回帰タスクと分類タスクのトレーニング セット、検証セット、テスト セットにデータを分割します。
(デフォルト)ランダム分割: データ分割戦略が指定されていない場合、データセットはランダムに 60% のトレーニングする分割、20% の検証分割、20% のテスト分割に分割されます。 分類の場合、層別ランダム分割により、各クラスがトレーニング セット、検証セット、テスト セットで適切に表現されることが保証されます。
時系列分割: Databricks Runtime 10.4 LTS ML以降では、時間列を選択して時系列のトレーニング、検証、テストの分割を作成できます。 時系列分割では、最も古いデータポイントをトレーニングに、次に古いデータポイントを検証に、最新のデータポイントをテストに使用します。 時間列は、タイムスタンプ、整数、または文字列の列にすることができます。
手動分割: Databricks Runtime 15.3 ML 以降では、API を使用して手動分割を設定できます。 分割列を指定し、値train
、 validate
、またはtest
を使用して、トレーニング、検証、およびテスト データセットに使用する行を識別します。 train
、 test
、またはvalidate
以外の分割列値を持つ行は無視され、対応するアラートが生成されます。
大規模なデータセットをサンプリングする
注:
サンプリングは予測問題には適用されません。
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 つのトライアルを実行し、各トライアルは 16 GB の RAM に制限されます。spark.task.cpus=4
を設定すると、各ワーカーは 1 つのトライアルのみを実行しますが、そのトライアルでは 64 GB の 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 はクラス A を 70 サンプルにダウンサンプリングしてこの不均衡を軽減します。つまり、クラス B のサンプル数を 5 のままにしたまま、クラス A を 70/95 または 0.736 の比率でダウンサンプリングします。最終モデルが正しく調整され、モデル出力の確率分布が入力の確率分布と同じになるように、AutoML はクラス B の重みを 1 のままにしたまま、クラス A のクラス重みを 1/0.736 または 1.358 の比率でスケールアップします。 AutoML は、モデルのトレーニング時にこれらのクラスの重みをパラメーターとして使用し、モデルのトレーニング時に各クラスのサンプルが適切に重み付けされるようにします。
時系列集計
予測の問題では、時系列のタイムスタンプに複数の値がある場合、AutoMLはその平均値を使用します。
代わりに合計を使用するには、試用実行によって生成されたソース コード ノートブックを編集します。 [ Aggregate data by ...] セルで、次に示すように .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" })
セマンティック型の検出
注:
セマンティック型の検出は、予測の問題には適用されません。
AutoML は、カスタム補完方法が指定された列に対してセマンティック型の検出を実行しません。
Databricks Runtime 9.1 LTS ML以降では、 AutoML 、列のセマンティック タイプがテーブル スキーマ内の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
を使用します。
Feature Storeの統合
Databricks Runtime 11.3 LTS ML以降では、Feature Storeの既存の特徴量テーブルを使用して、分類および回帰の問題に対して元の入力データセットを拡張できます。
Databricks Runtime 12.2 LTS ML以降では、Feature Storeの既存の特徴量テーブルを使用して、分類、回帰、予測など、AutoMLのすべての問題に対して元の入力データセットを拡張できます。
特徴量テーブルを作成するには、 「特徴量のエンジニアリングと提供」を参照してください。
既存の特徴量テーブルを使用するには、 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"],
}
]