見出し画像

混同行列、精度、再現率、正解率、F1スコア

今記事では、以下の評価値を簡単に説明します。

  • 混同行列(confusion matrix)

  • 精度(precision)

  • 再現率(recall)

  • 正解率(accuracy)

  • F1スコア(f1-score)

このような評価値は機械学習のツールを使うと簡単に計算できます。

例えば、scikit-learnの混合行列(classification_report)を使って、ロジスティック回帰のモデルを評価してみます。

なお、ここでは、このプログラム自体は重要ではないのでスキップしても結果だけ見ても記事の内容は理解できます。scikit-learnについてより理解したい方は、こちらのシリーズがあります。

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

# 訓練データとテストデータに分割する
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.2, random_state=42)

# まず、訓練データから平均と標準偏差を計算する
scaler = StandardScaler()
scaler.fit(X_train)

# スケーラ(scaler)を使って、訓練データとテストデータを正規化する
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

# モデルを訓練データに適合させる
model = LogisticRegression()
model.fit(X_train, y_train)

# テストデータで予測させる
y_pred = model.predict(X_test)

# 予測したデータを正解データと照らし合わせて評価する
print(classification_report(y_test, y_pred))

ここではscikit-learnの乳癌にゅうがんのデータセットを扱っています。目的は、各患者に対して30個ある数値の入力データからその人が悪性の癌を患っているのかどうかを予測することです。つまり、ロジスティック回帰を使って悪性のガンである確率を予測します。

結果は以下となりました。

サポート(support)は、それぞれのクラス(0:悪性、1:良性)の数です。悪性が43個あり、良性が71個で、合計114個となっています。

たくさんの評価値が表示されています。これらを1つずつ解説します。


混同行列(confusion matrix)

上述の結果を解説するために、まずは、下の図を眺めてください。

これは混同行列(confusion matrix)と呼ばれる表で、各用語の説明は次のようになります。ここでは、クラス0(悪性)が陽性(Positive)で、クラス1(良性)が陰性(Negative)として解説します。

  • TPTrue Positive、真陽性)は、陽性を予測して、実際に陽性だった場合の数です。例えば、クラス0(悪性)を予測して、実際にそうだった数です。簡単にいうと、陽性を予測して正解だった数になります。

  • TNTrue Negative、真陰性)は、陰性を予測して、実際に陰性だった場合の数です。例えば、クラス1(良性)を予測して、実際にそうだった数です。簡単にいうと、陰性を予測して正解だった数になります。

  • FPFalse Positive、偽陽性)は、陽性を予測して、実際には陰性だった場合の数です。例えば、クラス0(悪性)を予測したのに、実際にはクラス1(良性)だった場合の数です。簡単にいうと陽性を予測して間違えた数になります。

  • FNFalse Negative、偽陰性)は、陰性を予測して、実際には陽性だった場合の数です。例えば、クラス1(良性)を予測したのに、実際にはクラス0(悪性)だった場合の数です。簡単にいうと陰性を予測して間違えた数になります。

このでの陽性と陰性は定義の仕方によって決まるので、逆に、クラス0(悪性)が陰性(Negative)で、クラス1(良性)が陽性(Positive)と定義することもできます。この場合は、クラス1を予測しているというスタンスで問題を眺めていることになります。

以上の定義を使って精度、再現率、F1スコアを解説します。

精度(precision)

精度は、モデルがあるクラスを予測したうち、実際にそのクラスだった割合です。例えば、0(悪性)と予測して、実際に悪性だったのが98%あるということです。逆にいうと、良性なケースに対して悪性と予測したのが2%あったということになります。精度は適合率とも呼びます

精度を式で表現すると以下になります。

$$
\text{precision} = \dfrac{\text{TF}}{\text{TF} + \text{FP}}
$$

なお、ここでは、クラス0(悪性)を陽性として捉えています。もちろん、クラス1(良性)を陽性として精度を計算することができますし、その結果として、クラス0とクラス1の両方の精度が評価の出力に含まれています。

再現率(recall)

再現率は、あるクラスの総数に対して、モデルがそのクラスを正しく予測した割合です。例えば、43個ある悪性のケースに対して95%を正確に予測したことになります。43個の悪性ケースの5%は見逃したことになります。

再現率を式で表現すると以下になります。

$$
\text{recall} = \dfrac{\text{TP}}{\text{TP} + \text{FN}}
$$

ここでも、クラス0(悪性)を陽性として捉えています。また、逆にクラス1(良性)を陽性として再現率を計算することもできます。よって、クラス0とクラス1の両方の再現率が評価の出力に含まれています。

なお、再現率は、真陽性率(True Positive Rate)とも呼ばれます。いろいろな呼び名が登場しますが、再現率がなにを意味するのかを理解すれば誤解が少なくなるでしょう。

F1スコア(f1-score)

病気の診断の予測では、再現率がなるべく高い方が良いでしょう。なぜなら悪性の腫瘍を見逃したくはないからです。

しかし、再現率を上げたいだけなら、全てのケースを悪性と予測して再現率を100%にすることもできます。ただし、この場合は精度が悪くなってしまいます。逆に精度を上げようとして、自信が高い時だけ悪性の予測すると再現率が下がることになりかねません。そこで精度と再現率を組み合わせた指標がF1スコアとなります。

F1スコアは、精度(precision)と再現率(recall)の調和平均で次のように定義されます。

$$
\text{F1スコア} = \dfrac{2 \times \text{precision} \times \text{recall}}{\text{precision} + \text{recall}}
$$

これを次のように表現した方が、理解しやすいかもしれません。

$$
\text{F1スコア} = \dfrac{\text{precision} \times \text{recall}}{\frac{\text{precision} + \text{recall}}{2}}
$$

つまり、精度と再現率を掛けたものを、精度と再現率の平均で割ったものになります。精度と再現率が両方とも100%ならばF1スコアも100%になります。

しかし、精度あるいは再現率のどちらか、あるいは両方とも低い値になると分子の方が掛け算の効果によってより小さくなります。よってF1スコアも小さくなります。つまり、精度と再現率の両方が1に近づくほどF1スコアが1に近づくことになるので、F1スコアを見ると両方の値がバランスよく高い値になっているかどうかを確認できます。

以上を踏まえて、精度、再現率、F1スコアを見てみると、このモデルの予測は、クラス0とクラス1の両方に対してある程度は良い評価になっているのがわかります。

ただし、クラス0(悪性)の再現率がやや低めなのが気にはなります。

正解率(accuracy)

正解率は陰性と陽性の予測全体に対しての正解の割合で、次のように定義されます。

$$
\text{accuracy} = \dfrac{\text{TP} + \text{TN}}{\text{TP} + \text{TN} + \text{FP} + \text{FN}}
$$

ここで、$${\text{TP} + \text{TN}}$$は、正解した全体の数です。また、$${\text{TP} + \text{TN} + \text{FP} + \text{FN}}$$は、全体の個数です。なので、意味としては次のようになります。

$$
\text{正解率} = \dfrac{正解した数}{全体の数}
$$

よって、正解率は最もわかりやすい評価の指標です。ただし、正解率だけでは問題が生じることがあります。例えば、陰性の数が極端に少ないなどクラス間でバランスが大きく崩れている場合です。仮に、100個のデータがあって、陰性が1個だけだとすると、常に陽性を予測すれば正解率は99%になります。しかし、これだと再現率は0なので好ましくありません。よって、再現率などを含めて総合的にモデルを評価する必要があります。

この結果では、全体の正解率は97%ですが、クラス0(悪性)の再現率は95%です。よって、正解率だけで評価すると再現率が比較的に低いことを見逃す可能性があります。

マクロ平均(macro average)

マクロ平均は、すべてのクラスからの単純平均を計算する方法です。精度、再現率、F1スコアに対してそれぞれ計算されます。

$$
\begin{aligned}
& \\
\text{精度のマクロ平均} &= \dfrac{\text{0の精度} + \text{1の精度}}{2}
\end{aligned}
$$

$$
\begin{aligned}
& \\
\text{再現率のマクロ平均} &= \dfrac{\text{0の再現率} + \text{1の再現率}}{2}
\end{aligned}
$$

$$
\begin{aligned}
& \\
\text{F1スコアのマクロ平均} &= \dfrac{\text{0のF1スコア} + \text{1のF1スコア}}{2}
\end{aligned}
$$

なお、式を短くするために、クラス0、クラス1を省略して0と1で表現しています。

精度、再現率、F1スコアのマクロ平均は下図に示したところで確認できます。

マクロ平均は、クラスのバランスが悪い(つまり、クラス間でサンプルサイズに大きな違いがある)時に特に有効です。なぜなら、マクロ平均はすべてのクラスを等しく扱うため、少数派のクラスが持つ性能も大多数派のクラスと同様に評価に影響を与えるからです。

このデータセットでは、クラス0(悪性)の方が少数派ですが、両方に対して精度、再現率、F1スコアがある程度高いのであまり違いは観測できません。

加重平均(weighted average)

加重平均は、クラスのサポート(つまりサンプルサイズ)に基づいて各クラスの評価値(精度、再現率、F1スコア)に重みを付けて平均を取ります。よって、サンプルサイズが大きいクラスは、平均値に大きな影響を与えます。

$$
\begin{aligned}
& \\
\text{精度の加重平均} &= \dfrac{\text{0の精度} \times \text{数} + \text{1の精度} \times \text{数}}{\text{0の数} + \text{1の数}}
\end{aligned}
$$

$$
\begin{aligned}
& \\
\text{再現率の加重平均} &= \dfrac{\text{0の再現率} \times \text{数} + \text{1の再現率}\times \text{数}}{\text{0の数} + \text{1の数}}
\end{aligned}
$$

$$
\begin{aligned}
& \\
\text{F1スコアの加重平均} &= \dfrac{\text{0のF1スコア} \times \text{数} + \text{1のF1スコア}\times \text{数}}{\text{0の数} + \text{1の数}}
\end{aligned}
$$

加重平均も、ある意味、クラスの不均衡がある場合に役立ちます。各クラスの重みがそのサポート(クラスのサンプルサイズ)に基づいているため、サンプルサイズが大きいクラスが全体の評価により大きな影響を与えます。つまり、少数派のクラスをある程度無視して良い場合には加重平均は良い指標となります。つまり、特定のクラスが多数を占め、そのクラスにおける良好なパフォーマンスが全体的な目標にとって重要な場合、加重平均はそのクラスの影響を適切に反映します。

なお、クラス間の数のバランスがほぼ等しい場合は、加重平均とマクロ平均はほぼ同じ値となります。

今回のデータセットでは、少数派であるクラス0(悪性)の予測が重要なのでマクロ平均の方が重要な指標となります。なぜなら、医療の文脈では、偽陰性(実際には悪性であるが、良性と予測されるケース)を最小限に抑えることが非常に重要だからです。悪性のケースを見逃すことは、患者にとって重大な健康上のリスクをもたらすため、マクロ平均は全てのクラスの予測性能を均等に評価し、特に少数派クラスのパフォーマンスを適切に反映することで、このタイプのエラーに対するモデルの感度を測定します。

関連記事

ここから先は

0字

キカベン・読み放題

¥1,000 / 月
初月無料
このメンバーシップの詳細

この記事が気に入ったらチップで応援してみませんか?