不均衡データをクラス分類

881 views
Skip to first unread message

Mayu

unread,
Dec 15, 2017, 1:05:03 AM12/15/17
to Neural Network Console Users (JP)
こんにちは.

タイトルの通り,私は不均衡データのクラス分類を行いたいと考えています.
今のままではデータの偏りによって出力結果があまりよくないため,解決方法を探しています.

クラス分類の中身は,9種類の数値データ(x)を入力し3種類(y : 0, 1, 2)に分類をするものです.

解決策の候補は2つあり,1つは
オーバーサンプリングやアンダーサンプリングのような,Trainingデータセットから学習を行う際に用いるデータ数を調整すること
(バッチ数90のとき"y=0のデータ"と"y=1のデータ","y=2のデータ"がそれぞれ30件ずつのように,バランスを取りたい),

もう1つは
データ数の少ないクラスデータを学習する際に重みづけを調整すること
(データ数が"y=0" : 100,"y=1" : 1000,"y=2" : 1000 のとき,クラス0に分類されるデータだけ特別扱いしたい)
です.

これらを実装する方法が見つからず困っています.
それ以外の解決策を含め,何か分かる方がいましたら助けて頂きたいです.
どうぞよろしくお願いします.



network.png

Ahn John

unread,
Dec 15, 2017, 7:14:59 AM12/15/17
to Neural Network Console Users (JP)
2番目の方法ですが、単純に学習データ内のy=0のデータをコピペで増やしてみてはいかがでしょうか。

小林由幸

unread,
Dec 18, 2017, 1:09:01 AM12/18/17
to Neural Network Console Users (JP)
データセットを作り替えてよいのであれば、Ahn Johnさんが書かれているような
オーバーサンプリングの手法は手軽で有効です。

データセットをそのまま用いたい場合、例えば以下のようなネットワークで
ロスに重みづけを行うことができます。



上記ネットワークはsmall_mnist_4or9データセットを用いた2クラス分類において、
y=0のロスを0.1倍するように構成したものです。
具体的な動作は以下の通りです。

・EqualScalarレイヤーを用いてy=0とy=1で場合分けを行う(それぞれ当てはまる場合1を出力)
・MulScalarレイヤーでy=0の場合のみ0.1倍してAdd2で足し合わせることで
y=0の場合は0.1、y=1の場合は1.0が得られるような値を作る
・これをMul2レイヤーでCategoricalCrossEntropyレイヤーに掛け合わせることで
y=0の場合のみロスを1/10にする動作を実現

Mayu

unread,
Dec 19, 2017, 7:27:00 PM12/19/17
to Neural Network Console Users (JP)
ご提案ありがとうございます。
確かにその方法が一番簡単そうなので地道にやってみます!

2017年12月15日金曜日 21時14分59秒 UTC+9 Ahn John:
2番目の方法ですが、単純に学習データ内のy=0のデータをコピペで増やしてみてはいかがでしょうか。

Mayu

unread,
Dec 19, 2017, 7:30:05 PM12/19/17
to Neural Network Console Users (JP)
ネットワーク構成図まで用意して頂いてありがとうございます!
やりたかった事が出来そうなので応用して色々と試してみたいと思います。

2017年12月18日月曜日 15時09分01秒 UTC+9 小林由幸:

S W

unread,
Sep 20, 2020, 10:14:43 PM9/20/20
to Neural Network Console Users (JP)
小林様、皆様

いつもご教授ありがとうございます。不均衡データのソリューションとして、こちらのスレッドを参考に対処をしたしました(ネットワーク図Fig1)。実行の結果、

・Fig2に示すように、Traning,Validationは調子よく誤差が小さくなった。
=>ご助言どおり、成功した。
・しかし、Evaluationで、Fig3のように、対処前と変わらず、少ないデータの判別精度がよくない
=>学習結果がネットワークに反映されていない?

これは、どこかの設定が間違っていたりするでしょうか?たとえば、Runtimeでネットワークの設計に工夫をするなどが必要だったりしますでしょうか?

ご教授いただけますと幸甚です。

SW

2017年12月20日水曜日 9:30:05 UTC+9 Mayu:
fig2_learning curve.png
fig1_network.png
fig3_confusion matrix.png

小林由幸

unread,
Oct 13, 2020, 3:48:12 AM10/13/20
to Neural Network Console Users (JP)
ネットワークを拝見したところ、ロスの重みづけについては正しく実装できているようです(クラス0が0.1倍、クラス1が1倍)。

この重みづけを行わなかった場合と比較すると、クラス0のロスが1/10になっている分、学習曲線で表示されるTrain、Validationロスはかなり(クラス0のデータの割合が大きいほど)小さくなることが考えられます。
誤差が小さく見えるのはこの影響かと思います。

Confusion Matrixを見るとすべてのデータがクラス1に分類されているようですので、クラス0の重みを小さくしすぎた可能性があります。
クラス0に対する重みを変更しながら、最適な精度が得られるポイントを探っていくことになるかと思います。
2020年9月21日月曜日 11:14:43 UTC+9 ymo...@hotmail.com:

whatchan whatchan

unread,
Oct 21, 2020, 11:05:49 PM10/21/20
to 小林由幸, Neural Network Console Users (JP)
小林様、お礼が遅れてしまい申し訳ありません。お忙しいところ、教授いただき、大変助かりました。ご指摘いただいた方法で、改善いたしました。ありがとうございます。SW


差出人: neural_network_...@googlegroups.com <neural_network_...@googlegroups.com> が 小林由幸 <yoshiyuki....@gmail.com> の代理で送信
送信日時: 2020年10月13日 16:48
宛先: Neural Network Console Users (JP) <neural_network_...@googlegroups.com>
件名: Re: 不均衡データをクラス分類
 
--
このメールは Google グループのグループ「Neural Network Console Users (JP)」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには neural_network_consol...@googlegroups.com にメールを送信してください。
このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/neural_network_console_users_jp/7d4ed92d-38b6-424c-ba71-de4565636924n%40googlegroups.com にアクセスしてください。
Reply all
Reply to author
Forward
0 new messages