分類のためのデータ準備
AutoML を使用して分類用のデータを準備する方法について説明します。
この記事では、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.4 LTS ML 以降では、null 値の代入方法を指定できます。 UI で、テーブル スキーマの [Impute with ] 列のドロップダウンから方法を選択します。 API では、 imputers
パラメーターを使用します。 詳細については、「 AutoML Python API リファレンス」を参照してください。
デフォルトによって、 AutoML は列のタイプと内容に基づいて代入方法を選択します。
注:
デフォルト以外の代入方法を指定した場合、 AutoML はセマンティック型検出を実行しません。
分類の問題における不均衡なデータセットのサポート
Databricks Runtime 11.3 LTS ML 以降では、AutoML がデータセットの不均衡を検出した場合、主要なクラスをダウンサンプリングし、クラスの重みを追加することで、トレーニング データセットの不均衡を減らそうとします。 AutoML はトレーニング データセットのバランスを取るだけで、test データセットと validation データセットのバランスは取りません。 これにより、モデルのパフォーマンスは、真の入力クラス分布を持つエンリッチされていないデータセットで常に評価されます。
不均衡なトレーニング データセットのバランスを取るために、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 は、モデルのトレーニングでこれらのクラスの重みをパラメーターとして使用し、モデルのトレーニング時に各クラスのサンプルが適切に重み付けされるようにします。
列の選択
Databricks Runtime 10.3 ML 以降では、AutoML がトレーニングに使用する列を指定できます。 UI で列を除外するには、[ 含める ] 列で列のチェックを外します。 API では、 exclude_cols
パラメーターを使用します。 詳細については、「 AutoML Python API リファレンス」を参照してください。
予測ターゲットまたは 時間列 として選択した列をドロップしてデータを分割することはできません。
デフォルトでは、すべての列が含まれます。
データをトレーニングするセット、検証セット、およびテストセットに分割する
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 - 10.4 LTS ML |
サンプリング率は一定であり、クラスターのノード タイプやノードあたりのメモリには依存 しません 。 |
11.x の ML |
サンプリング率は、コアあたりのメモリが多いワーカー ノードで 増加します 。 サンプルサイズを増やすには:
例: 4 コアと 64GB RAM を搭載したマシンの場合:
|
11.3 LTS ML 以上 |
AutoML でデータセットがサンプリングされると、サンプリング分数が UI の [概要 ] タブに表示されます。 |
12.2 LTS ML 以上 |
AutoML では、トレーニング タスクごとにより多くの CPU コアを割り当てることで、より大きなデータセットを処理できます。 サンプルサイズを増やすには、合計メモリが多いインスタンスを選択します。 |
分類問題では、AutoMLは層別サンプリングにPySparksampleBy
メソッドを使用し、ターゲットラベルの分布を保持します。
回帰問題の場合、AutoMLはPySparksample
メソッドを使用します。
セマンティック型の検出
注:
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
を使用します。