クロの制作日記

二値分類における不均衡データへの対処方法~pAUC(partial AUC)最大化~

二値分類における評価指標に関する記事はこちら ↓
kurora-shumpei.hatenablog.com




目的関数に評価指標を用いる

これまで色々な評価指標を紹介してきましたが、ここからは、その評価指標を元に分類器の精度を向上する手法を紹介していきます。

今回の記事で紹介するのは以下の論文で用いられている手法です。
Partial AUC Maximization via Nonlinear Scoring Functions

この手法は、先ほど説明したAUCの派生バージョンであるparcial AUCを最大化するものとなっています。

また、この手法が真価を発揮するのは二値分類の対象が不均衡データのときです。

ここでいう不均衡データとは、例えば、猫の画像(Positiveデータ)が100個あるのに対し、猫以外の画像(Negativeデータ)が1万個くらいあるようなデータのことです。このような不均衡データの場合、猫のデータが少ないので、猫の特徴を上手く学習することができず、猫を精度よく分類することは中々難しくなります。

f:id:kurora-shumpei:20191113011803p:plain
不均衡データ
なぜ、この手法が不均衡データに対応できるかを上の例で説明すると、猫以外の画像から分類が難しいデータを抽出することで、不均衡を解消し、効率よく学習を行うからです。

なぜそうなるかは追って説明していきます。

parcial AUC(pAUC)

parcial AUCとは、AUCのx軸であるFalse Positive Rateに制限をつけたものです。どういう風に制限をつけるかというと、False Positive Rateの0~0.2(α~β)の間のAUCしか計算しない!といった感じです。

f:id:kurora-shumpei:20191107234112p:plain
paricial AUC (0~0.2)

なぜこういった考えを取り入れたかというと、AUCではなくpAUCを最大化したほうが、分類器の精度を効率よく向上させることができるからです。

pAUC最大化の考え方①

AUCを最大化させたいというのは要するに、False Positive Rateの値に依存せず、True Positive Rateの値を高くしたいということです。

そこで、ROC曲線の性質を思い出して欲しいのですが、分類性能がいまいちの時は、False Positive Rateが低いときはTrue Positive Rateも低いのですが、False Positive Rateが高い時はTrue Positive Rateも高いのです。

f:id:kurora-shumpei:20191108000059p:plain
AUCとFPR、TPRの関係性
ということは、AUCを最大化させたいのなら、False Postive Rateが低い部分のTrue Positive Rateを高くすれば、より効率よくAUCを最大化することができるはずです。

それが、AUCではなくpAUCを最大化する理由です。

pAUC最大化の考え方②

ここでは、上記の説明を少し掘り下げて、なぜpAUCを最大化すれば、不均衡データに対応することができるのかを説明します。

pAUC最大化はFalse Positive Rateをα~βまでに制限したAUCであるpAUCを最大化することでした。これは言い換えると、False Positive Rateがα~βまでのデータを抽出して分類器を学習することになります。

もっと言い換えると、「分類が難しいデータを抽出して分類器を学習する」ということになります。

分類が難しいデータとは

今回言っている分類が難しいデータとは、「Negativeデータを分類器に入力した際にPositiveデータに分類してしまうデータ」になります。

なぜ、False Positive Rateがα~βまでのデータがそのようなデータになるかというのはROC曲線の性質から説明できます。

グラフの右上のFalse Positive RateもTrue Positive Rateも1になっている箇所というのは、すべての予測値が1になっていることであり、閾値がとても低い値(0に近い)に設定されていることになります。逆に、グラフの左下のFalse Positive RateもTrue Positive Rateも0になっている箇所は、すべての予測値が0になっており、閾値がとても高い値(1に近い)に設定されていることになります。

f:id:kurora-shumpei:20191108011529p:plain
右上に行けば閾値が低い、左下に行けば閾値が高い

また、ROC曲線は分類器が出力した予測値を閾値に設定したときのグラフです。ということは、閾値が低い or 高いということは、低い or 高い予測値を閾値に用いていることになります。

f:id:kurora-shumpei:20191111100922p:plain
予測値が閾値に対応

これから、False Positive Rateがα~βまでのデータというのは、閾値が高いデータ、要するに、高いスコア(1に近い)を出力するようなデータであることがわかります。そして、高いスコアを出力した結果、True Positive Rateが低いということは、その予測結果が間違えているということになります。

したがって、高いスコアを出力して間違えているということは、実際はNegativeデータを入力しているということなので、「Negativeデータを分類器に入力した際にPositiveデータに分類してしまうデータ」になります。

抽出するとデータ不均衡が解消される理由

これで分類が難しいデータが何かはわかりました。また、上記で言っているように、分類が難しいデータというのは実際にはNegativeデータを入力していることになるので、分類が難しいデータを抽出するというのは、分類が難しいNegativeデータのみを抽出することになり、Positiveデータは抽出せずに全て用います。

ここで、不均衡データというのは、Positiveデータが少なく、Negativeデータが多いデータとなっていることを思い出してください。そうすると、Negativeデータの一部の分類が難しいデータを抽出し、Positiveデータは全て用いるということは、学習時にはPositiveデータとNegativeデータの比率は1:1に近くなっており、データの不均衡をある程度解消することができます。

f:id:kurora-shumpei:20191112230533p:plain
分類が難しいNegativeデータを抽出

よって、pAUC最大化はデータの多いNegativeデータから分類が難しいデータ(学習に効果的なデータ)を抽出することで、データ不均衡を学習時に解消するような手法ということになります。

pAUCの式

実際にpAUCの式を見てましょう。

f:id:kurora-shumpei:20191113000120p:plain
pAUCの式

式に含まれている s(x^+, x^-, ; θ)の式は以下のシグモイド関数です。

f:id:kurora-shumpei:20190601172630p:plain
シグモイド関数

論文からのスクリーンショットで申し訳ありませんが、Texでこれを数式に起こすのは大変なので勘弁してください。また暇があれば書き直します。

pAUCの式の構造を軽く説明します。そのためには、元となっているAUCの式をまず確認してみましょう。

AUCの式とその意味

AUC = P[f(x^{+}) > f(x^{-})]

AUCというのはこのようにf(x^{+})のスコアがf(x^{-})のスコアより大きい確率で表すことができます。ここでのf(x)というのは分類器で、x^{+}はPositiveデータ、x^{-}はNegativeデータになっています。そうなると、f(x^{+})f(x^{-})よりスコアが大きいというのは正しく分類ができており、逆の場合は分類を間違えていることになります。なので、AUCの式は正しく分類できている確率という風に言い換えることができます。

そこから、シグマを用いて式を変換すると以下のようになります。

f:id:kurora-shumpei:20191112235344p:plain
AUCの式

ここでのI(x)といのはヘビサイド関数で、入力xの条件がTrueなら1で、Falseなら0になるような関数です。

2つのシグマを用いてPositiveデータとNegativeデータのすべての組み合わせを考え、分類が正しいもの(f(x^{+}) > f(x^{-}))の総数を計算。そして、その総数をすべての組み合わせの数で割ることで確率を求める、こういった構造の数式となっています。

pAUCの式と意味

AUCの式を確認したところで、pAUCの式をもう一度確認してみましょう。pAUCはこのAUCを元にしているので、基本的な構造は同じです。

f:id:kurora-shumpei:20191113000120p:plain
pAUCの式

ただ、異なる点が3つあります。

ビサイド関数がシグモイド関数

一つ目は、ヘビサイド関数がシグモイド関数になっている点です。なぜ変更しているかというと、微分ができないからです。機械学習では、基本的に勾配降下法を用いてパラメータを学習していくので、微分ができない式だと学習を行うことができません。なので、微分可能なシグモイド関数に変更しています。

Negativeデータを抽出

2つ目は、pAUCは先ほど解説したように分類が難しいNegativeデータを抽出するので、Negativeデータは一部のデータしか使わないようになっている点です。二つ目のシグマを見ると、j_{α}+1からj_{β}までのデータを使用しているのがわかるかと思います。ここでのj_{α}j_{β}はそれぞれ、αn^{-}の切り上げ、βn^{-}の切り下げとなっています。それらの変数の意味は、FalsePositiveRateがα、βになるデータのインデックスです。切り上げ、切り下げすることで、小数から整数に変更させています。

誤差を解消する項

3つ目は、一つ目のシグマと二つ目のシグマの後ろの項です。これらは、j_{α}j_{β}を求める際の切り上げ、切り下げで発生した誤差を解消するためのものです。

scikit-learnで実装

前回の記事で、roc_auc_scoreという関数でAUCを求めましたが、この関数でpAUCを計算することができます。計算の仕方は引数max_fprに上限値を渡すだけです。

scikit-learn.org

>>> from sklearn.metrics import roc_auc_score
>>> true_data = [1,1,1,1,1,1,0,1,1,1] # 1:poisitive 0:negative
>>> prediction_data = [1,1,1,1,1,1,1,1,1,1]
>>> roc_auc_score(true_data, prediction_dat, max_fpr=0.05)




まとめ

長くなりましたが、今回の記事ではpAUC最大化の解説を行いました。pAUC最大化を行えば、分類が難しいデータを抽出し、不均衡データの場合でも効率的に学習を行うことできます。

次回があるかはわかりませんが、やる気があれば実際に不均衡データを用いてpAUC最大化が一般的に用いられる交差エントロピー最小化より効果があることを確認してみようかと思います。