まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

クラス分類の評価手法あれこれ

評価手法

クラス分類の評価手法について書く。

学習元は引き続き「Pythonではじめる機械学習」。

knknkn.hatenablog.com

以下では、探している結果を陽性、探していない結果を陰性と呼び、予測と実際に対する組み合わせを以下のように記載する。

予測 実際 組合わせ種類
陽性 陽性 真陽性(TP)
陽性 陰性 偽陽性(FP)
陰性 陰性 真陰性(TN)
陰性 陽性 偽陽性(FN)

※T:True, F:False, P:Positive, N:Negativeの略

精度

精度は「どれくらい陽性を陽性として(TP)、陰性を陰性として(TF)予測できたか」という評価手法。そのため、単純に「予測の正しさ」だけを評価したいときの尺度となる。

 精度 = \frac{TP + TF}{TP + FP + TN + FN}

適合率

適合率(pricision)は「陽性であるという予測で、実際に陽性であった率」を指す。

 適合率 = \frac{TP}{TP + FP}

適合率は、偽陽性の数を制限したい場合に性能基準として用いられる。
例えば、陽性という予測をおこなった人に臨床試験をする場合を考える。臨床試験は高価なので、本当に陽性(TP)の人にしか試験をしたくない。このような場合には偽陽性をあまり起こさないモデル、つまり適合率の高いモデルが評価尺度として適している。

再現率

再現率(recall)は「実際に陽性な中で、陽性と予測できた率」を指す。

 再現率 = \frac{TP}{TP + FN}

再現率は、陽性を陽性だと判断したい、逆にいえば偽陽性を避けたい場合に性能基準として用いられる。 例えば、癌に対して 「実際は癌ではないが、癌だと予測する(FN)」は重大な問題ではないが「実際は癌だが、癌ではないと予測する(FN)」といったような命の危機に関する誤りの場合に適した評価尺度となる。

適合率と再現率の適応トレードオフ

式からわかるように、極論では全て陽性と判断すれば再現率は上がる。しかし、その場合偽陽性(FT)が大量に発生するので適用率は下がる。
逆に、確信的な部分のみ陽性とし、他は全て陰性としたら適用率は上がる。しかし、その場合偽陰性(FN)が大量に発生するので再現率は下がる。

このように、適合率と再現率はトレードオフの関係になっている。そのため、全容を重視したい場合は、それぞれの調和平均を用いたf値(fスコア)を用いる(※F検定などのf値とは別)。  f値 = 2 * \frac{適合率 * 再現率}{適合率 + 再現率}

scikitlearnのclassification_reportを用いるとこれらをまとめて表示できる。 sklearn.metrics.classification_report(y_true, y_pred, labels=None, target_names=None, sample_weight=None, digits=2, output_dict=False)[source]

y_true:テストデータの値 y_pred:テストデータの予測結果 labels, target_names:出力結果のラベル sample_weight:サンプルに対する重み digits:出漁結果

sklearn.metrics.classification_report — scikit-learn 0.24.0 documentation

スレッショルド

陰陽の分類は例えば「陽の確率が50%以上のとき陽と予測し、49%以下の場合は陰と予測」といったような判断基準でおこなわれる。 このときの50%という閾値スレッショルドという。 再現率を上げたい(偽陽性が増えても真陽性を増やしたい)場合、真陽性となる予測数が増やすためスレッショルドを小さくすることで実現する。なお、このとき偽陽性は増えるので適合率は下がる。

適合率-再現率曲線

「再現率90%」のように、目標を設定することを「作動ポイントを設定する」という。このとき、作動ポイントをどこにすればいいか判断するためには、すべての可能なスレッショルド、つまりすべての可能な適合率と再現率の組合せを同時に見ることが役に立つ。

sklearn.metlicsモジュールにある適合率-再現率カーブ(recision-recall curve)を計算する関数precision_recall_curveを用いると可視化される。 自動的にモデルを比較するには、このカーブに含まれている情報を、特定のスレッショルドによらずに要約する方法の1つに、カーブの下の領域(AUC:Area Under the Cover)を積分する方法である。これは、平均適合率(averageprecision)と呼ぶ。

ROC曲線

適合率-再現率曲線の他に、ROC曲線(受信者動作特性カーブ:Receiver Operating Characteristics curve)という手法もある。
これは、偽陽性率 - 真陽性率(再現性)の曲線となる。これはroc_curve関数を用いると可視化できる。 適合率-再現率曲線と同様にAUCを計算すると内容を要約できる。

どのモデルを使うか

作動ポイントが決まっている場合はそれを基準にするが、それ以外の場合目的に応じて評価基準を最もよくするモデルを選ぶべき。
また、例えば前述の癌の場合、再現率が重要となるがスレッショルドを変えると複数モデルで同じ再現率を達成するモデルが作成できる。このような場合は、「同じ再現率のモデルの中で、トレードオフとなる適合率が最も高いモデル」を一般的に選ぶこととなる(ROC曲線でも同様)。
また、「(適合率-再現率か、ROCが)平均的に良い値」を尺度としたい場合はただ単にAUCで評価する場合もある。

cross_val_scoreを用いる場合、デフォルトでは精度(accuracy)が出力されるが、scoringオプションに出力したい予測評価尺度を指定すると出力結果が変わる(AUCの場合はroc_auc、など)。

追記(2019/08/25)

以下がわかりやすかった。

pompom168.hatenablog.com

www.procrasist.com

qiita.com