Featured image of post 混同行列について

混同行列について

目次

1.背景

機械学習でも頻出する話題である混同行列について改めてまとめる。

2.前提

2.1.分類の全体像

まず、分類には付けるlabelが単数か複数(単数もしくは複数)かによって、大きく2つの型がある。 その上で、今回は単数のSingle-label classificationを扱う。

  1. Single-label classification
  • 二値分類(Binary Classification)
    • 0か1などのように2つに分類するパターン
  • 多クラス分類(Multi Class Classification=MCC)
    • 1つのインスタンスに複数のクラスから1つのクラスが付くパターン
    • 物体検知などで利用される
  1. multi-label classification
  • 1つのオブジェクトに複数のラベルが付くパターン
  • LLMなどでトークンのNER(Named Entity Recognition)分類などに使われる

2.2.マルチラベルとマルチクラスの違い

ややこしい為まとめると、次のように、マルチラベルとマルチクラスの違いがある。 一般的に、Single-labelのみ混合行列が適用可能になる。

特徴マルチラベル分類マルチクラス分類
クラス割り当て各インスタンスに複数のラベルを割り当てる各インスタンスを一つのクラスに割り当てる
ラベルの数インスタンスごとに異なる数のラベル各インスタンスは一つのラベルのみを持つ
典型的な使用例映画のジャンル分類(例:アクション、ロマンス)動物の種類分類(例:犬、猫、鳥)
混同行列の使用伝統的な混同行列は適用しにくいが、適応された方法が使用される直接使用可能
評価指標ハミング損失、ラベルごとの精度・再現率・F1スコア全体の精度、クラスごとの精度・再現率・F1スコア

2.3.ラベルとクラスの違い

微妙なニュアンスの違いがある。

  • ラベル(Label):
    • 個々のデータポイントに割り当てられる具体的なカテゴリ
    • 例: メールが「スパム」や「非スパム」とラベル付けされる
  • クラス(Class):
    • 分類タスクにおける全ての可能なカテゴリのセットを指す
    • 例: スパムメール分類タスクにおいて、可能なクラスは「スパム」と「非スパム」の2つ

つまり、ラベルはラベリングというように、個々の事例に焦点を当てており、 クラスはが識別することができる全てのカテゴリの集合を意味する。

ちなみに、オブジェクトとインスタンスも混合しがちだが、分類の文脈ではインスタンスが適切である。

2.4.混同行列とは

混同行列(Confusion Matrix)とは、機械学習の2値分類問題の分類結果をまとめた行列。 予測とその予想の正解かどうかの組み分けを表にまとめたもの。

3.二値分類

3.1.犬と猫の例

一目で分かりやすいのが次の画像。 次のマトリックスになっている。

  • 行を正解ラベル
  • 列を予測結果

3.2.評価指標

3.2.1.陽性 / 正例 (Positive)、 陰性 / 負例(Negative)

機械学習では正例 / 負例の翻訳をよく使う。 これは予測とGrand-Truthの予測ラベルにおけるPositive / Negativeの事を意味する。

  • 陽性 / 正例(Positive): 予測対象の特定の状態または属性(例えば病気である、スパムであるなど)が存在する場合
  • 陰性 / 負例(Negative): 予測対象の特定の状態または属性が存在しない場合

3.2.2.真陽性(TP) / 偽陽性(FP) / 偽陰性(FN) / 真陰性(TN)

予測結果と実際の正解ラベルを基にマトリックスを作ったのが、TP / FP / FN / TNである。

  • 真陽性(TP, True Positive): モデルが陽性と予測し、実際に陽性であるケース
  • 偽陽性(FP, False Positive): モデルが陽性と予測したが、実際には陰性であるケース
  • 偽陰性(FN, False Negative): モデルが陰性と予測したが、実際には陽性であるケース
  • 真陰性(TN, True Negative): モデルが陰性と予測し、実際に陰性であるケース

また、その割合はRateを付けて、TPR(陽性率)などと表現する。

3.2.3.正解率(Accuracy)

正解率は、全てのケースの中で正しく予測されたケース(TPとTN)の割合。

Accuracy=(TP+TN)(TP+FP+FN+TN) Accuracy = \frac{(TP+TN)}{(TP+FP+FN+TN)}

3.2.4.誤答率(Error rate)

誤答率は、全てのケースの中で誤って予測されたケース(FPとFN)の割合。

Error Rate=1Accuracy \text{Error Rate} = 1 - Accuracy

3.2.5.適合率 / 精度(Precision)

適合率は、陽性と予測されたケースの中で、実際に陽性である割合。

Precision=TP(TP+FP) Precision = \frac{TP}{(TP+FP)}

3.2.6.再現率(Recall)/ 感度(Sensitivity)

再現率は、実際に陽性であるケースの中で、正しく陽性と予測された割合。

Recall=TP(TP+FN) Recall = \frac{TP}{(TP+FN)}

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

  • 適合率(Precision)と再現率(Recall)にはトレードオフの関係がある
  • 簡単に言えば、スナイパーライフルとマシンガンの戦略の違いのようなもの

3.2.8.特異度(Specificity)

  • 特異度は、実際に陰性であるケースの中で、正しく陰性と予測された割合。
  • つまり、適合度のNegative版ということ

Specificity=TN(TN+FP) Specificity = \frac{TN}{(TN+FP)}

3.2.9.特異度と感度のトレードオフ

  • 特異度と感度(適合率)もまたトレードオフである

3.2.10.F値 (F-measure)/ F1スコア(F1-score)

適合率と再現率のトレードオフ関係に着目し、調和平均を算出した値がF値(F-measure)。

F1=2×Precision×RecallPrecision+Recall F_{1} = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}

3.2.11.重み付きF値(Weighted F-measure)/ Fβスコア(Fβ-score)

  • F値 / F1スコアは調和平均で、適合率と再現率をどちらも同じように扱った
  • それのバランス調整をするのが、重み付きF値

Fβ=Precision×Recall×(β+1)Precision+Recall×β2 F_{\beta} = \frac{\text{Precision} \times \text{Recall} \times (\beta + 1)}{\text{Precision} + \text{Recall} \times \beta^{2}}

3.2.12.LogLoss(Binary Logarithmic Loss)

分類の正確さ(Accuracy)よりも、確率の高さ(Probability)を評価スコアとして取得したい場合に利用する。

  • つまり、0, 1のカテゴリカル変数ではなく、[0, 1]の範囲と閾値を基にした確率的な評価スコアと言う事
  • LogLossは[0, -∞]までの値域

  • また、交差エントロピー誤差(Cross entropy error)と考え方は一緒
  • 平均二乗誤差(MSE:Mean Squared Error)との比較が次の画像
  • 図の通り、両端の扱いが違う

  • 上記図の指数関数的な変化を-log(p)としてマイナス自然対数を使う
  • すると、pを確率、-log(p)を正解との誤差に利用している
  • 0は不正解で、1は正解である

  • 下のloglossはクロスエントロピー誤差である
  • nはクラス数、y_iは正解ラベル、p_iは予測結果を示している

LogLoss=1ni=1n(yilogpi+(1yi)log(1pi))) LogLoss = - \frac{1}{n} \sum_{i=1}^n (y_i log p_i + (1- y_i) log(1-p_i)))

3.3.ポイント系

3.3.1.カットオフポイント(cutoff point)

  • PR曲線やROC曲線を出すのに閾値を複数用いて評価スコアを算出し、総合的にモデルの性能の評価をする必要がある
  • その閾値の事をカットオフポイントと言う
  • 例えば、閾値の数が200個なら、ある閾値のレンジを200分割し、それぞれを閾値(カットオフポイント)として利用する

  • データの分布とカットオフ値の関係を上に示す
  • モデルが完全にPositiveとNegativeを予測できない限り、Grand-truthのPositiveとNegativeの分布は重なる
  • カットオフより+はPositiveと予測し、カットオフより-はNegativeと予測している事を意味する

  • 分布をベン図で示すと上になる

3.3.2.ブレイクイブンポイント

  • ブレイクイブンポイント(BEP)は、適合率と再現率が等しくなる点を指す
  • この点は、モデルが偽陽性と偽陰性を同じ程度に重視している状態を示し、PR曲線上で見つけることができる
  • BEPはモデルの全体的なバランスを理解するのに役立つ

3.4.AUC系

3.4.1.AUCの目的

  • 機械学習モデルの性能を比較するためなど、モデルの精度(=性能)をより汎用的に計測したい場合に利用する
  • 正解率よりも優れている利点としては、AUCはしきい値の影響を受けないことが挙げられる
  • 正解率は、デフォルトで0.5をしきい値として、予測値は0.5以上なら1、0.5未満なら0という形で評価値が決まる
  • つまり、このしきい値は変えることもできるが、その場合、評価値も変わってしまうという問題があると言う事

3.4.2.AUCは二種類ある

  • 通常の、ROC曲線を使ったAUC
  • PR曲線を使ったPR-AUC(Area Under the Precision-Recall Curve、AUC-PR)

通常はROC曲線を使ったAUCをAUCと表記する。

3.4.3.AUC(Area Under the ROC Curve)

  • AUC(Area Under the Curve)はROC曲線(Receiver Operating Characteristic curve)の下の面積
  • 値域は[0, 1]で、高いほどいい精度を示す
  • AUCは特に不均衡なデータセットでのモデルの性能を評価するのに有効

3.4.4.ROC曲線(Receiver Operating Characteristic curve:受信者操作特性曲線)とAUC

  • ROC曲線は、異なるしきい値における真陽性率(TPR)と偽陽性率(FPR)の関係をプロットしたグラフ
  • 曲線が左上に近づくほどモデルの性能が高いと評価される
  • ROC曲線は、特にバイナリ分類問題においてモデルの診断能力を評価するのに役立つ

  • AUCグラフは、X軸はFPR、Y軸はTPRで成り立つ
  • 上図の水色の領域の面積がAUCの値
  • ランダムに推測(random guess)するモデルだと、基本的にAUCは0.5となる

意味は次になる。

  • 0.9~1.0: 非常によい(excellent)
  • 0.8~0.9: よい(good)
  • 0.7~0.8: まあまあ(fair)
  • 0.6~0.7: よくない(poor)
  • 0.5~0.6: 失敗(fail)

ROC曲線の描き方。

  • 閾値を変えてTPRとFPRを計測する
  • 元々、感度や特異度では分類判定のしきい値を指定していた
  • しかし、AUCの真陽性率&偽陽性率では0.0~1.0の範囲でしきい値を細かく指定していく
  • この閾値を(threshold value=カットオフポイント:cutoff points(分割点))と言う
  • 例えば、cutoff pointsを200とすると、[0, 1]を200分割して計測してグラフを描写することになる
  • 下の画像はその一例となる

3.4.5.PR曲線とPR-AUC(Area Under the Precision-Recall Curve、AUC-PR)

  • PR曲線(Precision-Recall curve)は、適合率(Precision)と再現率(Recall)の関係をプロットしたグラフ
  • 特に陽性クラスのサンプルが少ない不均衡なデータセットにおいて、モデルの性能を評価するのにPR-AUCは有効
  • PR曲線では、曲線が右上に近づくほどモデルの性能が良いとされる

  • PR-AUCグラフは、X軸は適合率(Precision)、Y軸は再現率(Recall)で成り立つ
  • PR曲線はROC曲線と同じように閾値を変更してプロットする形になる

そもそも適合率と再現率はトレードオフ関係にあり、再現率(x軸)の数値が大きくなるにつれて、適合率(y軸)は小さくなる。

3.4.6.ROC曲線とPR-ROC曲線の違い

  • ROC曲線では、ランダムに推測(random guess)すると、基本的にAUCは0.5
  • 他方、PR-ROC曲線はランダムに予測しても、陽性と陰性のデータ数の割合によって数値が変わる
  • よってPR-AUCは、ROC曲線のAUCと比べて「モデルの汎用的な精度の測定や比較という用途にはあまり向いていない」ともいえる

3.5.値系

3.5.1.閾値

  • モデルの分類スコアをベースに属するか属さないかを決める為のスコア

3.5.2.評価スコア

  • これはTPRやAUCなど、性能の評価として取った代表値の総称の事

3.5.3.分類スコア

  • 分類スコアは、分類モデルが特定のクラスに属する確率を示す数値
  • このスコアは、モデルがどの程度自信を持って、予測を行っているかを示している
  • しきい値を調整することで分類の精度を変えることができる

3.6.Average Precision系

3.6.1.適合率 / AP(Average Precision)

  • 平均適合率(AP)は、異なるしきい値で計算された適合率の平均を意味する
  • APはPR曲線の下の面積としても解釈され、モデルの平均的な適合率の性能を示す
  • 不均衡データで有効

3.6.2.平均適合率 / mAP(mean Average Precision)

  • mAP(mean Average Precision)は、複数のクラスまたは複数の検出タスクに対するモデルの平均適合率の平均
  • これは、特にオブジェクト検出やマルチクラス分類問題でよく使用される指標で、モデルが全体的にどれだけうまく機能しているのかを判断する指標

4.多クラスの混同行列

4.1.分かりやすい例

  • 下の画像が一番わかりやすい
  • 多クラス分類の場合でも、二値分類の場合と同様にTP / FP / FN / TNを計算できる
  • ただし、クラス毎に計算する

  • 上の例では、犬を陽性とするバージョンと同様に、猫を陽性とするバージョンと、熊を陽性とするバージョンの計3パターンを考える必要がある
  • つまり、クラスの数だけ「二値分類の混同行列」を作るという事
  • また、全体的な評価方法として、マクロ平均とマイクロ平均がある
  • 例えば、F1スコアもMicro-F1スコアやMacro F1スコアなどのように分かれる

4.2.マクロ平均(Macro Average)

  • 各クラスごとに指標を計算し、その後でこれらの平均を取る
  • つまり、これは各クラスを同等に扱うことを意味する
  • 故に、不均衡データにおいては、マクロ平均を使った方が良い

4.3.マイクロ平均(Micro Average)

  • 全クラスにわたって集計された真陽性(TP)、偽陽性(FP)、偽陰性(FN)の値を使用して指標を計算する
  • つまり、個々のクラスよりも全体のパフォーマンスに焦点を当てるアプローチ

4.4.マクロ平均とマイクロ平均の使い分け

  • マイクロはクラス毎のTF / FP / FN / TPなどを計算し合算して評価スコアを出す
  • 故に、少数のデータしかないクラスのでーたががあったとしてもそれは反映されにくい
  • 逆に、マクロ平均はTP / TN / FP / FNなどをクラスごとに計算して代表値を出しその平均を取る
  • 故に、マクロ平均は少数のデータでも代表値を出し別のクラスと同様に扱うため、不均衡データに適する

5.バイアス

5.1.特徴選択のバイアス

5.1.1.みにくいアヒルの子の定理(Ugly Duckling theorem)

  • 事前の知識や仮定がなければ、あらゆる物事は同程度に似ている(または異なっている)というもの
  • つまり、特定の特徴や属性を重視するかどうかは、その特徴がどのように重要視されるか(または無視されるか)によって決まる
  • つまり、特徴選択(Feature Selection)というバイアス(人間の主観性)によって、前提が決まると言う事を示している

5.2.学習のバイアス

5.2.1.Inductive Bias

  • 機械学習における学習アルゴリズムが、学習データから一般化する際に持つ、事前の仮定や傾向を指す
  • 別言い方だと、アルゴリズムが未知のデータに適用された際にどのような予測を行うかに影響を与える、アルゴリズム固有のバイアス
  • inductive biasは過度な単純化や過学習(Overfitting)を起こす

5.3.データのバイアス

5.3.1.不均衡データの問題

データセット内の異なるクラス(カテゴリー)が非常に不均等な割合で存在する状態の事。

  • クレジットカードの不正使用検出のようなケースでは、
  • 不正なトランザクション(異常)は正常なトランザクションに比べて非常に少なく、データセットは不均衡になる
  • この場合、単純な精度(Accuracy)だけでモデルを評価すると誤解を招く可能性がある
  • なぜなら、モデルがすべてのトランザクションを「正常」と予測しても高い精度を示すから

5.3.2.オーバーサンプリング、アンダーサンプリング

  • オーバーサンプリングは、少数派クラスのデータポイントを増やすことでクラス間の不均衡を解消する
  • アンダーサンプリングは、多数派クラスのデータポイントを減らすことでバランスを取る

5.3.3.合成データ生成(Synthetic Data Generation)

主に次の3つの手法を利用する。

  1. データ拡張(Data Augmentation)
  2. GANsで生成
  3. 統計的シミュレーション

5.4.試験者によるバイアス

5.4.1.ブラインド検査(Blind Testing)

  • 主観的なバイアスを排除するための検査方法
  • 実験の被験者や評価者がどのサンプルや治療を受けているかを知らない状態で行う検査

5.4.2.ランダム比較試験(RCT: Randomized Controlled Trial)

RCTは医学や心理学、教育学など多くの分野で用いられる、科学的な研究の手法。

  • コアは被験者をランダムに対照群(コントロールグループ)と実験群(治療群または介入群)に割り当てること
  • これにより、他の変数が結果に与える影響を最小限に抑え、介入の効果をより正確に評価することができる

5.4.3.ランダムサンプリング

  • 母集団からランダムサンプリングしないデータはbiasedなデータになる
  • 恣意的にデータを選択しないようにするため、分割や抽出はランダムに行う

6.その他

6.1.TP FPなどの覚え方

TP/FPなどは、次のように考えると分かりやすい。

予測が正しいかどうかで次の2つ。

  • True
  • False

予測結果は次の2つ。

  • Positive
  • Negative

それを組み合わせると次になる。

  • TP // 正しくPositiveと予測(正解はPositive)
  • FP // 間違ってPositiveと予測(正解はNegative)
  • FN // 間違ってNegativeと予測(正解はPositive)
  • TN // 正しくNegativeと予測(正解はNegative)

6.2.AccuracyとPrevisionのトレードオフ

下の図が一番わかりやすい。

  • Accuracyは真値からの分布全体のズレ
  • Precisionは分布のばらつき度合

6.3.算術平均と調和平均

  • 調和平均(Harmonic Mean)
    • の平均を算出するのに適している。
  • 算術平均(Arithmetic mean)
    • の平均を算出するのに適している

例:

ある車が100キロメートルの距離を行く際には時速50キロメートル、 帰る際には時速100キロメートルで移動した時、往復の平均速度は何キロメートル/hか?

  • 算術平均 = (50+100)2=75\frac{(50 + 100)}{2} = 75
  • 調和平均 = 2150+1100=66.67\frac{2}{\frac{1}{50}+\frac{1}{100}}=66.67

6.4.Scikit-learn

6.4.1.利用するMatrixの関数

混合行列を作る時に、scikit-learnではそれぞれ次の関数を使う。

  • 二値分類の場合:
    • sklearn.metrics.confusion_matrix()
  • 多クラス分類の混同行列の場合:
    • sklearn.metrics.multilabel_confusion_matrix()関数

6.4.2.Scikit-learnでの例

二値分類の場合のScikit-learnでの例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from sklearn.metrics import precision_score, recall_score, confusion_matrix, accuracy_score
import numpy as np

# 関数定義
def f_measure(precision, recall, beta=1.0):
    return (1 + beta**2) * (precision * recall) / (beta**2 * precision + recall)

# サンプルデータの作成
y_true = np.array([0, 1, 1, 0, 1, 1, 1, 0, 0, 0])
y_pred = np.array([0, 1, 0, 0, 0, 1, 1, 1, 0, 0])

# 適合率と再現率の計算
precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)

# 混同行列の計算
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()

# 特異値(Specificity)と誤答率(False Positive Rate, FPR)の計算
specificity = tn / (tn + fp)
fpr = fp / (tn + fp)

# 正確度(Accuracy)の計算
accuracy = accuracy_score(y_true, y_pred)

# 重み(Fβスコアの場合)
beta = 2.0

# F値(Fβスコア)の計算結果
score = f_measure(precision, recall, beta)

precision, recall, specificity, fpr, accuracy, score

7.参考文献

Built with Hugo
テーマ StackJimmy によって設計されています。