R で不均衡なデータに smote を使用する方法 (例あり)


機械学習分類アルゴリズムを使用する場合、データセット内のクラスのバランスが崩れることがよくあります。

例えば:

  • 大学の選手が NBA にドラフトされるかどうかに関する情報を含むデータセットでは、98% の選手がドラフト外で、2% がドラフトされる可能性があります。
  • 患者ががんを患っているかどうかに関する情報を含むデータセットには、がんを患っていない患者の 99% とがんを患っている患者の 1% だけが含まれている可能性があります。
  • 銀行詐欺情報を含むデータセットには、96% の正当な取引と 4% の不正な取引が含まれる可能性があります。

このような不均衡なクラスのため、構築する予測モデルは少数派のクラスではうまく機能しない可能性があります。

さらに悪いことに、私たちが最も予測したいのは少数派の層であることがよくあります。

この不均衡の問題を解決する 1 つの方法は、合成マイノリティ オーバーサンプリング技術( SMOTEと略されることが多い) を使用することです。

この手法では、少数クラスからの観測値をオーバーサンプリングして新しいデータセットを作成し、よりバランスの取れたクラスを含むデータセットを生成します。

R で SMOTE を使用する最も簡単な方法は、 DMwRパッケージのSMOTE()関数を使用することです。

この関数は次の基本構文を使用します。

 SMOTE(form, data, perc. over = 200 , perc. under = 200 , ...)

金:

  • form : 適応させたいモデルを説明する式
  • data : データフレームの名前
  • perc.over : 少数派クラスの追加ケースが何件生成されるかを決定する数値
  • perc.under : マジョリティクラスの追加ケースが何件生成されるかを決定する数値

次の例は、この関数を実際に使用する方法を示しています。

例: R で SMOTE を使用する方法

R に 100 個の観測値を含む次のデータセットがあり、そのうち 90 個が応答変数に「Yes」クラスを持ち、10 個が「No」クラスを持っているとします。

 #make this example reproducible
set. seed ( 0 )

#create data frame with one response variable and two predictor variables
df <- data. frame (y=rep(as. factor (c(' Yes ', ' No ')), times=c( 90 , 10 )),
                 x1=rnorm( 100 ),
                 x2=rnorm( 100 ))

#view first six rows of data frame
head(df)

    y x1 x2
1 Yes 1.2629543 0.7818592
2 Yes -0.3262334 -0.7767766
3 Yes 1.3297993 -0.6159899
4 Yes 1.2724293 0.0465803
5 Yes 0.4146414 -1.1303858
6 Yes -1.5399500 0.5767188
 
#view distribution of response variable
table(df$y)

 Drowned 
 10 90

これは、不均衡なデータセットの典型的な例です。なぜなら、私たちが予測している応答変数には、「Yes」のクラスを持つ観測値が 90 個あり、「No」のクラスを持つ観測値が 10 個しかないからです。

よりバランスの取れたデータセットを作成するには、 DMwRパッケージのSMOTE()関数を使用します。

 library ( DMwR)

#use SMOTE to create new dataset that is more balanced
new_df <- SMOTE(y ~ ., df, perc. over = 2000 , perc. under = 400 )

#view distribution of response variable in new dataset
table(new_df$y)

 Drowned 
210,800

結果のデータセットには、クラスが「いいえ」の 210 件の観測値と、クラスが「はい」の 800 件の観測値が含まれています。

SMOTE 関数がこの新しいデータ セットを生成する方法を正確に示します。

  • perc.over引数は、既存の少数観測値の数の 2000/100 (または 20) 倍をデータセットに追加することを指定しました。元のデータセットには 10 個の観測値が存在したため、20*10 = 200 個の少数の観測値を追加しました。
  • perc.under引数は、多数派の観測値の数を、既存の少数派の観測値に追加される少数派の観測値の数の 400/100 (または 4) 倍に等しくすることを指定しました。さらに 200 の少数観測が追加されたため、多数の観測の数は 200 * 4 = 800 の多数の観測と等しくなります。

最終結果は、より多くの多数派クラスを含むデータセットになりますが、元のデータセットよりもバランスが取れています。

これで、選択した分類アルゴリズムをこの新しいデータセットに適応させることができます。この新しいデータセットでは少数派クラスからの観測値が増えるため、少数派クラスでのパフォーマンスが向上するはずです。

: SMOTE 関数のperc.overおよびperc.under引数を自由に試して、ニーズに合ったデータセットを取得してください。

追加リソース

次のチュートリアルでは、R で他の一般的なタスクを実行する方法について説明します。

Rで集計表を作成する方法
R でデータを正規化する方法
R で外れ値を削除する方法

コメントを追加する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です