クラス重み付けの説明をする前に、imbalanced classificationが起こる原因についてまとめます。
基本的に機械学習(ニューラルネットワーク含む)の学習処理は(1)モデル、(2)コスト関数、(3)オプティマイザーで構成されます。このimbalanced classificationは、クラスの不均衡がコスト関数に起因してオプティマイザーがうまく機能させない状況のことをいいます。
このコスト関数ですが、2値分類におけるクロスエントロピー誤差を例にいうと、以下のようにコストが計算されます。
(1)クラス0を対象に1件づつコスト(精度の悪さ)を計算して合計を算出
(2)クラス1を対象に上記の同様の計算を実施
(3)上記の(1)と(2)を合算してコストの総計を算出
クラス間に大きな不均衡がある場合、少数派の1件あたりのコストの平均が多数派よりも大きくても件数の大きさに引きずられて総コストにあまり影響を与えません。オプティマイザーは、このコスト関数の出力をもとにパラメータの更新を行うことになるので、結果としてコストに大きな影響を与える多数派の精度を高めるようにパラメータの調整を進めることになります。
これが、imbalanced classificationが起きる原因です。
クラス重み付けとは、上記の説明におけるコスト関数そのものを調整することと同義です。
少数派の件数の少なさをウェイトによって調整することで、少数派のコストが総コストに与える影響をより大きくしようということです。こうすることでオプティマイザーは少数派と多数派をイーブンに扱ってパラメータ調整を進めるようになるとことです。先の処理の説明でいうと、(1)または(2)のうち少数派のほうに所定のウェイトを乗算すればいいことになります。
skitlearnの関数の場合、クラス重み付けはオプションパラメータを設定すれば、後は関数の内部でうまく処理してくれます。一方、tensorflowを使ったニューラルネットワークの場合は、コスト関数を自前で記述する必要がある(もしかすると関数があるかもしれませんが、私はコードを書いているので、そういうことにしておきます)ので、適宜、記述する必要があります。
なお、このクラス重み付けは必ずしも分類の不正確性をなくすものではありません。あくまでも少数派の分類精度を高めるようになるだけです。与えられたデータやウェイトのかけ方によっては多数派の分類精度を犠牲にすることも起こりえます。このあたりはやってみないと分からないというのが実態ではないでしょうか。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/24 04:45