Python

SMOTEはデータを分割した後に実行する

SMOTEを使うタイミング

今日、プログラムを書いているときに指摘されて、すべての工程をやり直しになるほどの失敗を犯しました。
ほぼ初心者であるための失敗なのかどうか分からないので、私のような不幸物を二度と出さないことを祈りつつ書きます。

私の失敗例

陽性データと陰性データが偏っていたので、SMOTEを使って増やそうとしました。
普通にSMOTEを使って、陽性と陰性のデータ数を合わせて、データインバランスを解消しました。
その後、学習データとテストデータに分割しました。
学習データで機械学習にガンガン学習させて、テストセットで評価しました。

……ここですでに間違いがありました。

SMOTEで作ったデータをテストセットに入れてはいけない

よく考えたら当たり前ですが、実際に存在しないデータで評価したところで何の意味もありませんでした。
テストセットは実際に実在するデータを用いてこそ、汎化性能を評価することができるのであります。

つまり……?

SMOTEを用いるときは、テストセットはインバランス状態になってもいいので、先にデータを学習データとテストデータに分割しておく。
次に、インバランス状態の学習データをSMOTEで増やして、インバランスを解消します。

こうすれば学習データはちゃんと増えているし、テストデータは実際のデータのみで構築することができます。

さっさと気づいていればよかった。