imbalanced-learnで不均衡データをアンダーサンプリングしてみる
https://github.com/scikit-learn-contrib/imbalanced-learn
↑ドキュメントを読めば終わり。
Contents
雑談
最近、scikit-learnをちょくちょく触ってる。
めっちゃ便利だよね。
テストデータいじって予想したりするのに飽きたので「この本は興味ありそうか否か」っていうテキストの二値分類に取り組んでいる。
本のデータをクローリングして「興味なし」は0、「興味あり」は1として各本データにラベル付ける。(一番しんどい)
ラベル付けしてから気がついたのだが、興味ありが圧倒的に少ない。
割合としては80%くらいが興味なし。
データがめっちゃ偏ってる。
これで学習させてpredictしてみると…
結果が全て「興味なし」となってしまった
ほとんどが0のデータで学習させたらそうなるわなw
こういう偏ったデータを「不均衡データ」というらしい。
この不均衡データを使うと何が問題なのかってのがよく分かってない。
均等データで学習した場合と比較すると精度が悪くなる、みたいなことは書いてる。
なんとなく偏ったデータで学習すると過学習状態になるのかなって感想。
とりあえずpredictで全部0になってるのを見ると、学習してない感(してるよ)あって萎えるので、手元の不均衡データをイイカンジにする方法を調べてみた。
↑これ見たら終わり。
なるほどですね。
偏ってるデータを取り除く(今回の場合だったら「興味なし」な本のデータだね)アンダーサンプリングってのが圧倒的に理解しやすいので、これをやってみようという気概になった。
手で間引くのメンドイし、なんかイイカンジな実装がscikit-learnにあるだろ、と思って調べたけど見つけられなくてアレだった
とはいえ自分で実装するのは絶対にイヤなので、五万年くらいググり続けた。
そしたらimbalanced-learnと出会った。
使ってみる
インストール
1 |
pip install -U imbalanced-learn |
condaでもインストールできるっぽいよ。
こんな感じ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 特徴ベクトルの数と次元数 X_train_data.shape # => (140, 4242) # 特徴ベクトルに対応する不均衡なラベルたち collections.Counter(X_train_target) # => Counter({0: 112, 1: 28}) # 適当なアンダーサンプリングアルゴリズムでやってみる from imblearn.under_sampling import NearMiss nm2 = NearMiss(version=2) X_resampled_train_data, X_resampled_train_target = nm2.fit_sample(X_train_data.todense(), X_train_target) len(X_resampled_train_target) # => 56 X_resampled_train_target # => array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) |
リサンプリングできてる
336px
336px
関連記事
-
-
KerasのCNNを使って文書分類する
Co …