GCP AutoML Tablesでバイナリ分類するなら知っておいたほうが良いこと

AutoML Tables を使うなら **Google Cloud 公式ドキュメントの[AutoML Tables 初心者向けガイド](https://cloud.google.com/automl-tables/docs/beginners-guide?hl=ja)がとても親切なのでこれを読めば良い**です。

...が、適合率と再現率の詳細が[解説へのリンク貼ってあるだけ](https://developers.google.com/machine-learning/crash-course/classification/precision-and-recall?hl=ja&_ga=2.115486022.-1367171491.1575197518)でちょっと突き放した感があるので、この辺について自分用に調べた時のメモです。

具体的には、↓この画面の見方についてです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/d9035b3b-e188-5c7d-b7b4-182618617eb4.png)

なお本稿のスクリーンショットには[AutoML Tables のクイックスタート](https://cloud.google.com/automl-tables/docs/quickstart?hl=ja)にある[Bank marketing Dataset](https://datahub.io/machine-learning/bank-marketing) の deposit の予測結果を使っています。実際に試してみると似たような結果が出ると思いますが、AutoMLは結果にブレがあるので必ずしもスクリーンショット通りの結果が出るとは限りません。

## GCP AutoML Tablesとは何か
**機械学習モデルをほとんど自動で作ってくれるクラウドサービス**です。

「モデル」が何なのか分かりづらい場合「数式」と読み替えれば、少しはイメージしやすくなると思います。

$売上 - 費用 = 利益$

↑みたいなのが、数式です。この利益算出の数式は誰がどう見ても自明ですが、もっともっと難しくて数学的に(演繹的に)求められないようなふわふわした数式を色々な技術でがんばって作り出すのが、機械学習です。


機械学習をするには本来、様々な工程が必要になります。そのほとんどの工程を自動でやってくれてモデルを作ってくれるサービスが**GCP AutoML**です。類似サービスに [Microsoft Azure Custom Vision Service](https://azure.microsoft.com/ja-jp/services/cognitive-services/custom-vision-service/) 等があります。

GCP AutoMLにはいくつか種類がありますが、**GCP AutoML Tables**は、Tablesの名の通り「表」に対する機械学習モデルを作ります。表というのは、エクセルとかCSVとかGoogleスプレッドシートみたいな物のことです。

AutoMLは多くのことを自動でやってくれますが、完成したモデルがビジネスに適用可能かどうか**意思決定する**のは、自動化できず人間がやらなければなりません。意思決定するために知っておかなければならない指標がいくつかあります。

## モデルを評価するとき知っておいたほうが良いこと
本稿では**バイナリ分類**について説明します。「商品を買うか、買わないか予測」のような2値の分類です。

予測をすると、モデルによって例えば下記のような結果が得られます。

|名前|予測スコア|実際の行動|
|:--|:--|:--|
|Aさん|80%の確率で買う|買った|
|Bさん|60%の確率で買う|買った|
|Cさん|40%の確率で買う|買わなかった|
|Dさん|20%の確率で買う|買わなかった|

この予測結果を実際のビジネスにどう使うかを考えます。「商品を買う確率が高い人に絞って広告を出したい」と考えると、パッと見はAさんとBさんに広告を出せば良いような気がします。ですがBさんが買う確率は60%と微妙ですし、逆にCさんは確率40%なのでもしかしたら買うかも知れません。

予測結果がもっと際どい「49%の確率で買う」みたいな人がいた場合、この人には強気に広告を出していくのか、それとも広告を出さないのか、どう扱うかという問題です。AutoMLは「49%の確率で買う」というスコアを出してくれますが、この結果を見て広告を打つかどうか意思決定するのは人間です。

広告を売った人がみんな商品を買ってくれて、広告を打たなかった人には誰も商品を買うユーザーはいなかった状態が、「良い状態」です。良い状態を導く「良いモデル」が何かを定量的に表現するための指標について説明します。

## 用語
### TP, TN, FP, FN

|略称|名称|日本語|解説|
|:--|:--|:--|:--|
|TP|True Positive|真陽性|Positiveだと予測されて、<br/>本当にPositiveだった|
|TN|True Negative|真陰性|Negativeだと予測されて、<br/>本当にNegativeだった|
|FP|False Positive|偽陽性|Positiveだと予測されたけど間違いで、<br/>実際にはNegativeだった|
|FN|False Negative|偽陰性|Negativeだと予測されたけど間違いで、<br/>実際にはPositiveだった|

今回は、商品を買うと予測されることを「Positive(陽性)」買わないと予測されることを「Negative(陰性)」としましょう。

TPとTN (True XXXXXXXX) が予測結果正解で、多いほうが良い数字です。
FPとFN (False XXXXXXXX) は、少ないほうが良い数字です。

### 混同行列 (Confusion Matrix)
TF,TP,FP,FNそれぞれの割合を並べたものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/0dd55699-7155-090c-33b1-851f5eea1062.png)
↑こういうのです。

「実際に商品を購入したユーザのうち、商品を購入すると予想された・予想できなかった割合」
「実際に商品を購入しなかったユーザのうち、商品を購入すると予想された・予想できなかった割合」

を並べて行列にしたものです。

予測値と実際の結果が同一のセル(TPとTN。左上と右下)の数字が大きいほうが、良いモデルです。

### しきい値 (Classification Threshold)
予測スコアがどれくらいでTPと判断するかのしきい値です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/77a2c729-ab2a-eac2-5e55-93a36e2dedba.png)
↑AutoML Tablesの画面ではこう表現されていて、つまみを操作するとしきい値を変更できます。

たとえば「49%の確率で商品を購入する」と予測されたユーザがいた場合、このユーザをPositiveと判断して広告を打つか、それともNegativeと判断するか、のしきい値です。

## 真陽性率と偽陽性率
### 真陽性率 (True Positive Rate, TPR)
実際Positiveだった物のうち、本当にPositiveと予測的中できた物の割合です。
高いほど"良い"です。低いとPositiveと判断できなかったもの(FN)が多くなっています。

数式にするとこうなります。

```math
TPR = \frac{TP}{TP + FN}
```

### 偽陽性率 (False Positive Rate, FPR)
実際Negativeだった物のうち、ミスってPositiveと予測してしまった物の割合です。
低いほど"良い"です。

```math
FPR = \frac{FP}{FP+TN}
```

### ROC曲線 (Receiver Operating Characteristic curve)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/a9ad0a46-a987-f547-ad00-e3a9f1b1ece6.png)
横軸にFPR、縦軸にTPRをプロットしたグラフです。

TPRとFPRはしきい値によって変動します。しきい値を高くするほど基準が厳しくなり、Positiveと判定される量が減るのでTPRは減少し、Negativeと判定される量は増えるのでFPRも減少します。

FPRが少ないしきい値にした時でもTPRが多いほうが良いわけです。左上に向かって膨らんでいて、FPRが低い値でもTPRが高くなっている箇所があるグラフが、良いモデルです。

## 適合率と再現率
### 適合率 (Precision)
```math
Precision = \frac{TP}{TP + FP}
```

予測の的中率です。
Positiveと予測された物のうち、本当にPositiveだった物の割合です。
高いほど"良い"数値です。低い場合は予測が外れたもの(FP)が多いです。

### 再現率 (Recall)
```math
Recall = \frac{TP}{TP + FN}
```

予測の漏れの少なさです。
本当にPositiveだった物のうち、Positiveと予測された物の割合です。
高いほど"良い"数値です。低い場合は、予測で漏れてしまったデータ(FN)が多いです。

再現率は、先程の「真陽性率」と同じものです。

### 適合率再現率曲線 (Precision Recall, PR)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/b8efdc64-380f-3e2d-f613-80001575ba08.png)
横軸に再現率、縦軸に適合率をプロットしたグラフです。

しきい値を上げると予測はよく当たるようになるので適合率は上がり、漏れは増えるので再現率は下がります。逆にしきい値を下げると、適合率が下がり、再現率は上がります。

しきい値に対して、適合率と再現率がどれくらいになるかを表したグラフがROC曲線です。右上に向かって膨らんでいて、再現率を上げても適合率が高い値を保っているグラフが良いモデルです。

## AUC (Area Under the Curve)
ROC,PRいずれも「上に向かって膨らんでいる方が良いモデル」としてきましたが、それを数値で表したものです。このAUCが高いほうが良いモデルです。

|ROC|PR|
|:--:|:--:|
|偽陽性率・真陽性率|再現率・適合率|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/a9ad0a46-a987-f547-ad00-e3a9f1b1ece6.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/b8efdc64-380f-3e2d-f613-80001575ba08.png)|
|ROC 0.935|ROC 0.611|

AUCというのはArea Under the Curveの略で、単なる「曲線の下の面積」です。詳しい説明は省きますが**各曲線の平均値**だと思ってもらえればだいたい合っています。さまざまなしきい値をとった時の、真陽性率や適合率の平均値です。

様々な予測を試して、AUCが高いモデルほど「良いモデル」となります。


以上です。
なお「[機械学習ツールを掘り下げるアドベントカレンダー2019](https://qiita.com/advent-calendar/2019/machine-learning-02)」の枠がまだ空いていたので本稿を登録してみました。

## 参考文献
- [機械学習の評価指標 – ROC曲線とAUC \| GMOアドパートナーズグループ TECH BLOG byGMO](https://techblog.gmo-ap.jp/2018/12/14/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E8%A9%95%E4%BE%A1%E6%8C%87%E6%A8%99-roc%E6%9B%B2%E7%B7%9A%E3%81%A8auc/)
- [Machine Learning Glossary  \|  Google Developers](https://developers.google.com/machine-learning/glossary?hl=ja#precision)
- [【ROC曲線とAUC】機械学習の評価指標についての基礎講座 \- Np\-Urのデータ分析教室](https://www.randpy.tokyo/entry/roc_auc)
- [O'Reilly Japan \- Pythonではじめる機械学習](https://www.oreilly.co.jp/books/9784873117980/)