SMOTE

この記事では Azure Machine Learning デザイナーで SMOTE コンポーネントを使用して、機械学習に使用するデータセット内の小数派のケースの数を増やす方法について説明します。 SMOTE は、単純に既存のケースを複製するよりも、まれなケースの数を増やす方法として適しています。

SMOTE コンポーネントを、"不均衡" データセットに接続します。 データセットが不均衡になる理由は数多くあります。 たとえば、ターゲットとするカテゴリが母集団にほとんどない場合や、データの収集が困難な場合です。 通常、SMOTE は、分析する "クラス" が少ししか存在しない場合に使用します。

このコンポーネントは、元のサンプルを含むデータセットを返します。 また、指定した割合に応じたマイノリティ合成サンプルの数も返します。

SMOTE の詳細

Synthetic Minority Oversampling Technique (SMOTE) は均衡の取れた方法で実際のデータセット内のケースの数を増やすための統計手法です。 このコンポーネントは、入力として提供する既存のマイノリティ ケースから新しいインスタンスを生成することによって機能します。 この SMOTE の実装では、マジョリティ ケースの数は変更されません

新しいインスタンスは、既存のマイノリティ ケースの単なるコピーではありません。 そうではなく、このアルゴリズムでは、各ターゲット クラスとその最近傍に対する特徴空間のサンプルを受け取ります。 その後、ターゲット ケースの特徴とその近隣の特徴を組み合わせた新しい例を生成します。 この方法では、各クラスで使用できる特徴が増え、サンプルがより一般的になります。

SMOTE では、データセット全体を入力として受け取りますが、マイノリティ ケースの割合だけを増やします。 たとえば、ターゲット値 A が含まれているのがケースの 1% しかなく (マイノリティ クラス)、ケースの 99% に値 B が含まれている不均衡データセットがあるとします。マイノリティ ケースの割合を以前の 2 倍の割合に増やすには、コンポーネントのプロパティの [SMOTE percentage]\(SMOTE 率\) に「200」と入力します。

小さなデータセットに対して SMOTE を使用してみて、そのしくみを確認することをお勧めします。 次の例では、Azure Machine Learning デザイナーで使用できる献血データセットを使用します。

データセットをパイプラインに追加し、データセットの出力で [視覚化] を選択すると、データセット内の 748 行またはケースのうち、クラス 0 が 570 ケース (76%) で、クラス 1 が 178 ケース (24%) であることがわかります。 この結果はひどく不均衡なわけではありませんが、クラス 1 は献血した人を表しているため、これらの行にはモデル化する "特徴空間" が含まれています。

ケースの数を増やすには、次のように 100 の倍数を使用して SMOTE 率の値を設定します。

クラス 0 クラス 1 total
元のデータセット

(SMOTE 率 = 0 に相当)
570

76%
178

24%
748
SMOTE 率 = 100 570

62%
356

38%
926
SMOTE 率 = 200 570

52%
534

48%
1,104
SMOTE 率 = 300 570

44%
712

56%
1,282

警告

SMOTE を使用してケースの数を増やしても、より正確なモデルが生成されるとは限りません。 さまざまな割合、特徴、最近傍の数を使用してパイプライン処理を試し、ケースの追加が実際のモデルに与える影響を確認してください。

SMOTE の構成方法

  1. SMOTE コンポーネントをパイプラインに追加します。 このコンポーネントは、データ変換コンポーネント[操作] カテゴリにあります。

  2. ブーストするデータセットを接続します。 特定の列のみを使用するか、一部を除外することで、新しいケースを構築するための特徴空間を指定する場合は、Select Columns in Dataset (データセットの列を選択する) コンポーネントを使用します。 そうすると、SMOTE を使用する前に、使用する列を分離できます。

    これを行わない場合、SMOTE を使用した新しいケースの作成は、入力として提供した "すべて" の列に基づいて行われます。 特徴列のうち少なくとも 1 列は数値です。

  3. ラベル (ターゲット クラス) を含む列が選択されていることを確認します。 SMOTE で受け入れられるのは、バイナリ ラベルだけです。

  4. SMOTE コンポーネントでは、ラベル列のマイノリティ クラスが自動的に識別され、そのマイノリティ クラスのすべての例が取得されます。 すべての列に NaN を含めることはできません。

  5. [SMOTE percentage]\(SMOTE 率\) オプションに、出力データセット内のマイノリティ ケースのターゲットとする割合を示す整数を入力します。 次に例を示します。

    • 0」と入力します。 SMOTE コンポーネントにより、入力として指定したものとまったく同じデータセットが返されます。 新しいマイノリティ ケースは追加されません。 このデータセットでは、クラスの割合は変化しません。

    • 100」と入力します。 SMOTE コンポーネントにより、新しいマイノリティ ケースが生成されます。 元のデータセットに含まれていたものと同じ数のマイノリティ ケースが追加されます。 SMOTE ではマジョリティ ケースの数は増えないため、各クラスのケースの割合が変化します。

    • 200」と入力します。 コンポーネントにより、マイノリティ ケースの割合が元のデータセットと比較して 2 倍になります。 これにより、マイノリティ ケースが前よりも 2 倍に増えることはありません。 つまり、マジョリティ ケースの数はそのままで、データセットのサイズが増えます。 マイノリティ ケースの数は目的の割合の値に達するまで増えます。

    Note

    SMOTE 率には、100 の倍数のみを使用します。

  6. [Number of nearest neighbors]\(最近傍の数\) オプションを使用して、新しいケースを構築するときに SMOTE アルゴリズムで使用される特徴空間のサイズを決定します。 最近傍は、ターゲット ケースと同様のデータの行 (ケース) です。 任意の 2 つのケース間の距離は、すべての特徴の重み付けベクターを組み合わせることによって測定されます。

    • 最近傍の数を増やすことで、より多くのケースから特徴を取得できます。
    • 最近傍の数を低く抑えると、元のサンプルにより似ている特徴を使用できます。
  7. 同じデータを使用して同じパイプラインで実行した場合に同じ結果が得られるようにする場合は、[ランダム シード] ボックスに値を入力します。 そうしなければ、パイプラインの展開時に、プロセッサのクロック値に基づいて、コンポーネントによってランダム シードが生成されます。 ランダム シードが生成されると、実行のたびに結果がわずかに異なる可能性があります。

  8. パイプラインを送信します。

    コンポーネントの出力は、元の行とマイノリティ ケースの追加された行を含むデータセットです。

テクニカル ノート

  • SMOTE コンポーネントを使用するモデルを発行する場合は、Web サービスとして発行される前に、予測パイプラインから SMOTE を削除します。 その理由は、SMOTE はトレーニング中にモデルを改善するためのものであり、スコアリングを目的としたものではないからです。 公開された予測パイプラインに SMOTE コンポーネントが含まれていると、エラーが発生することがあります。

  • SMOTE を適用する前に、欠損値のクリーニングやその他の変換の適用を行ってデータを修正すると、多くの場合、より良い結果が得られます。

  • 一部の研究者は、SMOTE が高次元データまたはスパース データ (テキスト分類やゲノミクス データセットで使用されるデータ) に対して有効かどうかを調査しています。 こちらの論文には、このような場合に SMOTE を適用することによる影響と理論的な有効性がよくまとめられています。Blagus および Lusa: SMOTE for high-dimensional class-imbalanced data (高次元クラスの不均衡データの SMOTE)

  • 実際のデータセットに対して SMOTE が有効でない場合は、次のような他の方法を検討できます。

    • マイノリティ ケースをオーバーサンプリングしたりマジョリティ ケースをアンダーサンプリングしたりする方法。
    • クラスタリング、バギング、またはアダプティブ ブーストを使用して学習者を直接的に支援するアンサンブル手法。

次のステップ

Azure Machine Learning で使用できる一連のコンポーネントを参照してください。