謎指標?AUCの銀行顧客ターゲティングにおける意味とは

前回は、銀行の顧客ターゲティングにおいて機械学習を用いるにあたり、ビジネスのゴール・分析のゴールについて、自分なりに考えてみました。

今回は、実際のSIGNATEの評価指標である「AUC」について、それが高いとビジネス上どういう意味を持つのか、自分なりに考えてみたいと、思います。

そもそもAUCとは何なのか

AUCとは、「Area Under the Curve」の略、あるグラフ(曲線=Curve)の、曲線の下の部分の面積、という意味になります。

機械学習で、特に何も断りもせずに「AUC」とだけ言った場合、「ROC曲線の」AUC(ROC AUC)になるみたいです。イメージ的には、以下の図1における、グラフ(黒い太線)の下の、青い部分の面積のことになります。

f:id:tatsu_mk2:20190420140147p:plain
図1 AUCのイメージ

横軸が偽陽性率(確率なので、0~1)で、縦軸が真陽性率(同じく、0~1)。故に、AUCの最大値は1になります。

じゃあ、真陽性とか偽陽性とかって何なのかというと、こちらをご覧ください。

AIがTrueと予測 AIがFalseと予測
実際にTrueだった顧客 True Positive(TP) False Negative(FN)
実際にFalseだった顧客 False Positive(FP) True Negative(TN)


前回ご紹介させていただいた、二項分類問題における正解・不正解のマトリックスになります。「陽性」というのはつまり「True」のことで、「陰性」というのは「False」のことになります。

即ち、真陽性率とは、「実際に陽性(True)だったもののうち、AIが正しく陽性(True)と判定出来た割合」=TP/(TP+FN)、要するにRecallと同じです。

偽陽性率とは、「実際は陰性(False)だったのに、AIが誤って陽性(True)と判定してしまった割合」、つまり「FP/(FP + TN)」になります。

この、真陽性率を縦軸に、偽陽性率を横軸にグラフを描くとは、一体どういうことなのでしょう?

閾値と真陽性率・偽陽性率の変化

本、銀行の顧客ターゲティングのような二項分類問題は、Trueか/Falseかを予測する問題です。が、より正確には、まず確率を予測することになります。どういうことかといいますと、

顧客 優良顧客である確率(0~1) 優良顧客であるか否か(True/False)
顧客A 0.51 True
顧客B 0.41 False
顧客C 0.9 True
顧客D 0.1 False

まず顧客が優良顧客である確率を予測し、一定確率を超えていたら、優良顧客であると判断するような、アルゴリズムになります。この境界となる一定の値のことを、閾値といい、上記の表は0.5を閾値として、True/Falseに振り分けています。

この、閾値を変えてみると、どうなりますでしょうか?例えば、上記の表で、閾値を0.4に変えると、以下のようになります。

顧客 優良顧客である確率(0~1) 優良顧客であるか否か(閾値0.4)
顧客A 0.51 True
顧客B 0.41 True ←←← 注目!!
顧客C 0.9 True
顧客D 0.1 False


優良顧客が増えました!このように、閾値を変えればTrue/Falseの判定が変ります。Trueに判定が変わった顧客が、本当にTrueと限りませんので、当然、真陽性率・偽陽性率も、変わります。

真陽性率を縦軸に、偽陽性率を横軸にグラフを描くとは即ち、閾値を0~1の間で変化させつつ、そのときの真陽性率・偽陽性率をグラフにプロットすることに、なります。

AUCが1に近いことの意味

AIが完璧に予測できる場合

仮に、あるAIが、ある閾値において、完璧にTrueを予測できるとします。このAIのROC曲線を描くにあたり、まず、閾値を1に設定すると、Trueと予測されるものはゼロになりますので、真陽性率・偽陽性率ともに、ゼロになります。この点を、グラフにプロットしてみます。

f:id:tatsu_mk2:20190420150532p:plain
図2 閾値1の場合の真陽性率・偽陽性率(共に0)

ここから少しずつ閾値を下げていきます。例えば、閾値を0.9にすると、AIが「優良顧客である確率が90%」と判定したものが、True(陽性)になり、90%未満は、False(陰性)になります。このAIは、「ある閾値において、完璧にTrueを予測できる」としているので、その「ある閾値に到達するまで」は、AIがTrueと予測した顧客は、実際にTrueです。すなわち、閾値を下げていってしばらくは、真陽性率は上がり続けるものの、偽陽性率は上がらない状態が、続きます。このイメージを、プロットしてみます。

f:id:tatsu_mk2:20190420152147p:plain
図3 閾値を徐々に下げていった場合のAUC

ここで、「ある閾値」に到達して、実際にTrueである顧客を、AIがTrueと検出しつくしたとします。図3でいうところの、一番左上のプロット点ですね。ここに達してもなお閾値を下げると、検出されるTrueは増えますが、それは全て偽陽性になります。なので、ここにきてようやく、偽陽性率が上がり始めます。

f:id:tatsu_mk2:20190420153743p:plain
図4 なお閾値を下げ続ける

真陽性率は既に1に到達していますので、そこから偽陽性率が上がり続け、最終的に、真陽性率・偽陽性率とも、1に到達します。ということで、AIが完璧にTrueを予測できるなら、AUCは1になることが、分かりました。

AIが完璧に予測でない場合

完璧にTrueを予測できないAIの場合、閾値を徐々に下げていくと、真陽性率が1に到達する前に、本当ならば陰性のものを、間違えて陽性と判定してしまうことになります。仮に、真陽性率が1に到達する直前で、惜しくも判定を間違ってしまった場合、以下のようなグラフに、なります。

f:id:tatsu_mk2:20190420154759p:plain
図5 おしくも偽陽性が出てしまった場合のAUC

曲線下の面積(AUC)が、わずかに1より下がったことが、分かるかと思います。一方、閾値を下げ始めた早い段階で、偽陽性が出てしまうと・・・

f:id:tatsu_mk2:20190420155532p:plain
図6 早い段階で偽陽性が出た場合

先ほどより、AUCの面積が、小さくなることが、分かるかと思います。

AUCの意味を考える

というわけで、AUCが高いほど、真陽性と偽陽性を綺麗に分けられるということに、なるかと思います。もう少し言うと、閾値を1から徐々に下げていったときに、なるべく偽陽性を出さずに、真陽性を検出出来るということに、なるかと思います。つまり・・・1偽陽性当たりの真陽性の数が多いということになって、即ちPrecisionが高いということに、なるような気がしました。

単純にPrecisionだけを指標にすると、真陽性が1個、偽陽性が0個でも、Precisionは1(100%)に、なります。銀行の顧客ターゲティングに例えると、確かに無駄な営業は省けますが、その代わり優良顧客も、ほぼ検出出来ていません。一方、AUCが高いと、無駄な営業を省きつつ(Precisionが高い)、なるべくたくさんの優良顧客(真陽性)を検出できるということが、出来そうな気がしました。

即ち、F-scoreが、Recall(優良顧客をたくさん検出するが無駄打ちもあるかもしれない)と、Precision(なるべく無駄打ちをしないがあまり優良顧客を検出出来ないかもしれない)を、同じ比重でバランスを取った指標であるのに対して、AUCは、Precision寄りでバランスが取れる指標なのではないか、という気がしてきました。つまり、ビジネス的には、AUCを指標にすると、なるべく費用対効果の高い顧客ターゲティングが、出来るように思います。

それでも分かりづらいAUC

それでもAUCがなんか分かりづらい気がするのは・・・確率ではないからのような、気がします。AUCが1なら、真陽性と偽陽性を、100%分離できることは、分かりました。しかし、AUCが0.9だと、90%分離できるというわけでは、ありません。ビジネス的に目標を立てるには、やっぱり確率じゃないと分かりづらい気がします。

というわけで、AIを調整する際には、AUCを指標にして調整したとしても、最終的にユーザーにお話しする際には、いくつかの具体的な閾値を元に、いくつかのPrecision/Recallのバリエーションを提示して、ビジネス目標に合致する閾値/Recall/Precisionを決める方が、分かりやすい気がしました。

おまけ:もう一つのAUC

ここまで、AUC=ROC AUCということで、自分なりの考えをまとめてきましたが・・・機械学習におけるAUCにはもう一つ、PR AUCというものが、あるかと思います。横軸に真陽性=Recall、縦軸にPrecisionをプロットするので、Precision-Recall曲線というわけみたいです。なんですが・・・Pythonのscikit-learnだと、標準でPR-AUCを計算できる関数が、ない?ROC-AUCは、「sklearn.metrics.roc_auc_score()」という関数で、簡単に計算できますが、「pr_auc_score()」という関数は、ないみたいです。

体感的に、PR-AUCの方が、上げるのが難しく、指標として信頼できる気がするのですが・・・一旦、考察はまたの機会にしたいと、思います。

終わりに

というわけで、実際のSIGNATEの評価指標である「AUC」についても、なんとなく理解できました。次回こそはいよいよ、機械学習していって、予測AIを作ってみたいと、思います。最後まで読んでいただいて、ありがとうございました。

「AUCって何が嬉しいのか良くわかんねぇ」という方の、何かしらの参考にでもなりましたら、幸いでございます。混乱になりましたら、すみません。