この記事では Azure Machine Learning デザイナーで SMOTE コンポーネントを使用して、機械学習に使用するデータセット内の小数派のケースの数を増やす方法について説明します。 SMOTE は、単純に既存のケースを複製するよりも、まれなケースの数を増やす方法として適しています。
SMOTE コンポーネントを、"不均衡" データセットに接続します。 多くの理由により、データセットが不均衡になる可能性があります。 たとえば、ターゲットとするカテゴリが母集団にほとんどない場合や、データの収集が困難な場合です。 通常、SMOTE は、分析する "クラス" が少ししか存在しない場合に使用します。
このコンポーネントは、元のサンプルを含むデータセットを返します。 また、指定した割合に応じたマイノリティ合成サンプルの数も返します。
SMOTE の詳細
Synthetic Minority Oversampling Technique (SMOTE) は均衡の取れた方法で実際のデータセット内のケースの数を増やすための統計手法です。 このコンポーネントは、入力として提供する既存のマイノリティ ケースから新しいインスタンスを生成することによって機能します。 SMOTE のこの実装では、多数のケースの数は変更されません。
新しいインスタンスは、既存の少数派ケースのコピーだけではありません。 そうではなく、このアルゴリズムでは、各ターゲット クラスとその最近傍に対する特徴空間のサンプルを受け取ります。 その後、ターゲット ケースの特徴とその近隣の特徴を組み合わせた新しい例を生成します。 この方法では、各クラスで使用できる特徴が増え、サンプルがより一般的になります。
SMOTE では、データセット全体を入力として受け取りますが、マイノリティ ケースの割合だけを増やします。 たとえば、ケースの 1% だけがターゲット値 A (マイノリティ クラス) を持ち、ケースの 99% が値 B を持つ不均衡なデータセットがあるとします。元の少数派ケース数の 2 倍の合成ケースを生成するには、コンポーネントのプロパティに SMOTE の割合として「200」と入力します。
例
SMOTE を小さなデータセットで使用して、そのしくみを確認してみてください。 次の例では、Azure Machine Learning デザイナーで使用できる献血データセットを使用します。
データセットをパイプラインに追加し、データセットの出力で [視覚化 ] を選択すると、データセット内の 748 行またはケースのうち、570 ケース (76%) がクラス 0、178 ケース (24%) がクラス 1 であることがわかります。 この結果はひどく不均衡なわけではありませんが、クラス 1 は献血した人を表しているため、これらの行にはモデル化する "特徴空間" が含まれています。
ケースの数を増やすには、次のように、100 の倍数を使用して SMOTE の割合 の値を設定します。
| クラス 0 | クラス 1 | トータル | |
|---|---|---|---|
| 元のデータセット (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 の構成方法
SMOTE コンポーネントをパイプラインに追加します。 このコンポーネントは、データ変換コンポーネントの [操作] カテゴリにあります。
ブーストするデータセットを接続します。 特定の列のみを使用するか、一部を除外することで、新しいケースを構築するための特徴空間を指定する場合は、Select Columns in Dataset (データセットの列を選択する) コンポーネントを使用します。 そうすると、SMOTE を使用する前に、使用する列を分離できます。
これを行わない場合、SMOTE を使用した新しいケースの作成は、入力として提供した "すべて" の列に基づいて行われます。 特徴列のうち少なくとも 1 列は数値です。
ラベル (ターゲット クラス) を含む列が選択されていることを確認します。 SMOTE で受け入れられるのは、バイナリ ラベルだけです。
SMOTE コンポーネントでは、ラベル列のマイノリティ クラスが自動的に識別され、そのマイノリティ クラスのすべての例が取得されます。 すべての列に NaN を含めることはできません。
[SMOTE percentage]\(SMOTE 率\) オプションに、出力データセット内のマイノリティ ケースのターゲットとする割合を示す整数を入力します。 次に例を示します。
「0」と入力します。 SMOTE コンポーネントにより、入力として指定したものとまったく同じデータセットが返されます。 新しいマイノリティ ケースは追加されません。 このデータセットでは、クラスの比率は変更されていません。
「100」と入力します。 SMOTE コンポーネントにより、新しいマイノリティ ケースが生成されます。 元のデータセットに含まれていたものと同じ数のマイノリティ ケースが追加されます。 SMOTE では多数のケースの数が増えるわけではないため、各クラスのケースの割合が変わります。
「200」と入力します。 このコンポーネントでは、元の少数派ケース数の 2 倍の新しい合成ケースが生成され、その結果、元の 3 倍の少数派ケースが生成されます。 SMOTE は多数派のケースの数を増やさないため、データセット内の少数派ケースの全体の割合が増加します。
注
SMOTE 率には、100 の倍数のみを使用します。
[Number of nearest neighbors]\(最近傍の数\) オプションを使用して、新しいケースを構築するときに SMOTE アルゴリズムで使用される特徴空間のサイズを決定します。 最近傍は、ターゲット ケースと同様のデータの行 (ケース) です。 任意の 2 つのケース間の距離は、すべての特徴の重み付けベクターを組み合わせることによって測定されます。
- 最近傍の数を増やすことで、より多くのケースから特徴を取得できます。
- 最近傍の数を低く抑えると、元のサンプルにより似ている特徴を使用できます。
同じデータを使用して同じパイプラインで実行した場合に同じ結果が得られるようにする場合は、[ランダム シード] ボックスに値を入力します。 そうしなければ、パイプラインの展開時に、プロセッサのクロック値に基づいて、コンポーネントによってランダム シードが生成されます。 ランダム シードが生成されると、実行のたびに結果がわずかに異なる可能性があります。
パイプラインを送信します。
コンポーネントの出力は、元の行とマイノリティ ケースの追加された行を含むデータセットです。
テクニカル ノート
SMOTE コンポーネントを使用するモデルを発行する場合は、予測パイプラインから SMOTE を削除してから Web サービスとして発行します。 SMOTE は、スコアリングではなく、トレーニング中にモデルを改善することを目的としています。 公開された予測パイプラインに SMOTE コンポーネントが含まれていると、エラーが発生することがあります。
SMOTE を適用する前に、欠損値のクリーニングやその他の変換の適用を行ってデータを修正すると、多くの場合、より良い結果が得られます。
一部の研究者は、SMOTE が高次元データまたはスパース データ (テキスト分類やゲノミクス データセットで使用されるデータ) に対して有効かどうかを調査しています。 こちらの論文には、このような場合に SMOTE を適用することによる影響と理論的な有効性がよくまとめられています。Blagus および Lusa: SMOTE for high-dimensional class-imbalanced data (高次元クラスの不均衡データの SMOTE)。
データセットで SMOTE が有効でない場合は、次のような他のアプローチを検討してください。
- マイノリティ ケースをオーバーサンプリングしたりマジョリティ ケースをアンダーサンプリングしたりする方法。
- クラスタリング、バギング、またはアダプティブ ブーストを使用して学習者を直接的に支援するアンサンブル手法。
次のステップ
Azure Machine Learning で使用できる一連のコンポーネントを参照してください。