この記事は、書籍『Kaggleではじめる大規模言語モデル入門』の輪読会で学んだテーマを、自分の言葉で整理・深掘りしたものです。
はじめに
分類は機械学習で最も基本的なタスクですが、評価指標は交差エントロピー、AUC、Accuracy、Precision、Recall、F1……と種類が多く、「どれをいつ使うのか」が混乱しがちです。
Kaggle などのコンペでも、評価指標の理解が浅いまま取り組むと、指標に合わない最適化をして順位を落とすことになります。
この記事では、分類タスクの評価指標を 「連続値のまま評価する系統」と「ラベルを割り当ててから評価する系統」の2系統 に分けて整理します。
特に混乱しやすい多クラス F1 のマクロ / マイクロ / 加重平均は、同じ数値例で違いを確認します。
分類タスクは想像以上に多様
「分類」と聞くとニュース記事のトピック分類やスパム判定を思い浮かべますが、実際には入力の粒度と出力の形式の両面でバリエーションがあります。
入力の粒度によるバリエーション
- 文章の分類 :レビュー全体がポジティブかネガティブか
- 文の分類 :長い文書を文単位に分割し、各文が「重要な文かどうか」を判定する。モデルが扱える系列長には上限があるため、長文からノイズとなる文を除去する用途で応用範囲が広い
- 単語の分類 :固有表現抽出(NER)が代表例。文中の人名・組織名・地名などを抽出する。個人情報のマスキング(匿名化)に使えるため、「顧客データをそのまま LLM に渡せない」場面での前処理としても重要
出力の形式によるバリエーション
| 多値(マルチクラス)分類 | マルチラベル分類 | |
|---|---|---|
| 出力 | 複数クラスから 1つだけ 選ぶ | 該当するラベルを いくつでも 付与 |
| 例 | 記事を政治/経済/スポーツのどれかに分類 | 技術記事に「Python」「機械学習」「Web」を同時付与 |
| 実装 | softmax + 1つの分類器 | ラベルごとの sigmoid(二値分類の束) |
評価指標の2系統
分類モデルの出力は通常、いきなりラベルではなく 連続値(確率やスコア) です。
評価指標は、この連続値をどう扱うかで2系統に分かれます。
- 連続値のまま評価する :交差エントロピー(log loss)、AUC
- 閾値でラベルに変換してから評価する :Accuracy、Precision、Recall、F1
まずはこの2つに分けて考えると、各評価指標の役割や違いが理解しやすくなります。
系統①-a:交差エントロピー(log loss)
多クラス分類の学習で最も広く使われる損失であり、評価指標としても使われます。
クラス重み付きの一般形は次のとおりです。
\mathit{loss}_n = -\sum_{c=1}^{C} w_c \, y_{n,c} \log \hat{y}_{n,c}, \qquad \hat{y}_{n,c} = \frac{\exp(x_{n,c})}{\sum_{i=1}^{C}\exp(x_{n,i})}
- $x_{n,c}$:サンプル $n$ のクラス $c$ に対するモデル出力(ロジット)
- $\hat{y}_{n,c}$:softmax で確率に変換した予測値
- $y_{n,c}$:正解クラスなら 1、それ以外は 0(one-hot)
- $w_c$:クラスごとの重み(省略時は 1)
二値・重みなしにすると、いわゆる 対数損失(log loss) になります。
\mathit{loss}_n = -\bigl(\, y_n \log \hat{y}_n + (1-y_n)\log(1-\hat{y}_n) \,\bigr)
直感:自信満々に外すと大ダメージ
不正クレジットカード取引の検知(不正=1)を例に、予測確率と損失の関係を見てみます。
| 真のラベル | 予測確率 $\hat{y}$ | loss |
|---|---|---|
| 1(不正) | 0.80 | $-\log 0.80 = 0.223$ |
| 1(不正) | 0.20 | $-\log 0.20 = 1.609$ |
| 0(正常) | 0.05 | $-\log 0.95 = 0.051$ |
| 0(正常) | 0.95 | $-\log 0.05 = 2.996$ |
正解に近いほど損失は小さく、 高い確信度で外すと損失が急激に跳ね上がる のが特徴です。
横軸が「正解クラスに対する予測確率 $p$」、縦軸が損失 $-\log p$ です。$p$ が 0 に近づく(=自信を持って間違える)ほど、損失が急激に発散していくのが分かります。
- メリット :予測の確信度を評価に反映できる
- デメリット : 不均衡データに弱い 。不正取引のように正例が極端に少ないと、「全部 0 付近を予測する」だけで損失が小さくなってしまい、モデルが実質何も学ばないことがある。対策としてクラス重み $w_c$ を付ける(少数クラスの誤りに大きなペナルティを課す)のが定石
系統①-b:AUC(ROC-AUC)
二値分類でよく使われるもう1つの連続値ベースの指標です。
理解には混同行列が必要なので、先に説明します。
混同行列
予測ラベルと真のラベルの組み合わせは4通りあります。
| 予測: Positive | 予測: Negative | |
|---|---|---|
| 実際: Positive | TP(真陽性) | FN(偽陰性) |
| 実際: Negative | FP(偽陽性) | TN(真陰性) |
この4要素から2つの率を定義します。
\mathrm{TPR} = \frac{TP}{TP + FN}, \qquad \mathrm{FPR} = \frac{FP}{FP + TN}
- TPR(真陽性率) :実際に Positive のものを、どれだけ拾えたか
- FPR(偽陽性率) :実際は Negative なのに、誤って Positive と判定した割合
ROC曲線とAUC
予測確率をラベルに変換する閾値を 1 から 0 まで動かすと、(FPR, TPR) の点が軌跡を描きます。
これが ROC 曲線 で、その下側の面積が AUC(Area Under the Curve) です。
- 完全ランダムな予測 → ROC 曲線は対角線に一致し AUC = 0.5
- 完璧な予測 → 曲線は左上に張り付き AUC = 1.0
青い線が ROC 曲線で、その下側の面積が AUC(この例では 0.97)です。
曲線が左上に張り付くほど「FPR を低く抑えたまま TPR を稼げている」=良いモデルだと読み取れます。
AUC には「ランダムに選んだ正例と負例のペアについて、正例のほうに高いスコアを付けている確率」という確率的な解釈もあります。
AUC の本質:値の大きさではなく「順序」
AUC が見ているのは予測値の絶対的な大きさではなく、 正例と負例のスコアの順序関係だけ です。
たとえば 1,000 件中 正例が 20 件のデータで、予測値が全体として 0〜0.1 の狭い範囲に収まっていたとしても、正例 20 件のスコアがすべて負例より上に並んでいれば AUC は 1.0 です。この性質から、
- 予測値のスケールやキャリブレーションに神経質にならなくてよい
- 複数モデルの予測値を平均する アンサンブルと相性が良い (順序さえ改善されればスコアが上がる)
という実務上の利点があります。
系統②:ラベル割り当て後の指標
閾値(例: 0.5)で連続値をラベルに変換したあと、混同行列から計算する指標群です。
\mathrm{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN}, \quad \mathrm{Precision} = \frac{TP}{TP + FP}, \quad \mathrm{Recall} = \frac{TP}{TP + FN}
Accuracy の弱点
Accuracy(正解率)は直感的ですが、 ラベル不均衡に極端に弱い という致命的な弱点があります。1,000 件中不正が 10 件のデータなら、「全部正常」と答えるだけで Accuracy は 0.99 です。
数字は立派でも、このモデルは何の役にも立ちません。
Precision と Recall のトレードオフ
- Precision(適合率) :Positive と予測したもののうち、本当に Positive だった割合
- Recall(再現率) :実際の Positive のうち、拾えた割合
この2つは片方だけなら簡単に最大化できてしまいます。
- 全件を Positive と予測する → Recall = 1.0(ただし Precision は最悪)
- 最も自信のある1件だけ Positive と予測する → Precision はほぼ 1.0(ただし Recall は最悪)
つまり両者は トレードオフ の関係にあり、タスクの性質に応じてどちらを重視するかを決める必要があります。
がん検診のスクリーニングなら見落としが致命的なので Recall 重視、誤検知のたびに人手調査が発生する不正検知アラートなら Precision も重要、といった具合です。
Fβスコア:トレードオフをパラメータ化する
重視の度合いを $\beta$ で調整できるのが Fβスコア です。
F_\beta = (1+\beta^2)\cdot\frac{\mathrm{Precision}\cdot\mathrm{Recall}}{\beta^2\cdot\mathrm{Precision} + \mathrm{Recall}}
- $0 < \beta < 1$:Precision 重視(例: $F_{0.5}$)
- $\beta > 1$:Recall 重視(例: $F_2$)
- $\beta = 1$:両者の調和平均 = F1スコア
F_1 = 2\cdot\frac{\mathrm{Precision}\cdot\mathrm{Recall}}{\mathrm{Precision} + \mathrm{Recall}}
調和平均は算術平均と違って「低いほうの値に強く引っ張られる」ため、Precision と Recall の両方がそこそこ高くないと F1 は上がりません。
多クラスF1:マクロ / マイクロ / 加重平均
多クラス分類で F1 を1つの値にまとめる方法は3つあり、 「どこで平均をとるか」 が違います。scikit-learn の average 引数そのものです。
| 平均 | 計算の仕方 | 重視されるもの |
|---|---|---|
| マクロ(macro) | クラス別 F1 の単純平均 | 各クラスを平等に扱う(少数クラス重視) |
| マイクロ(micro) | 全クラスの TP/FP/FN を合算してから計算 | 1サンプル1票(多数クラス重視) |
| 加重(weighted) | クラス別 F1 をサンプル数で加重平均 | 両者の中間(クラス構成比を反映) |
F_{1,\text{macro}} = \frac{1}{C}\sum_{c=1}^{C} F_{1,c}, \qquad F_{1,\text{weighted}} = \sum_{c=1}^{C} \frac{n_c}{N} F_{1,c}
マイクロ平均は TP/FP/FN を合算してから Precision / Recall を計算します。
各サンプルがちょうど1クラスに属するマルチクラス分類では、 マイクロ F1 は Accuracy と一致 します。
同じ数値例で3つを比較する
3クラス・合計100件の不均衡データで、クラス別 F1 が次のとおりだったとします(全体の正解数は 81 件とします)。
| クラス | 件数 | クラス別 F1 |
|---|---|---|
| A(多数派) | 60 | 0.90 |
| B | 30 | 0.60 |
| C(少数派) | 10 | 0.75 |
| 平均 | 計算 | 値 |
|---|---|---|
| マクロ | $(0.90 + 0.60 + 0.75)/3$ | 0.75 |
| 加重 | $0.6 \times 0.90 + 0.3 \times 0.60 + 0.1 \times 0.75$ | 0.80 |
| マイクロ | $81/100$(= Accuracy) | 0.81 |
- マクロだけ低い :件数の少ないクラス B の悪さ(0.60)が、件数に関係なく 1/3 の重みで効くため
- マイクロと加重は近い :どちらも件数の多いクラス A(0.90)に引っ張られるため
不均衡データのコンペでマクロ F1 が採用されることが多いのは、「少数クラスもきちんと当てるモデル」を評価したいからです。
逆に言えば、マクロ F1 のコンペで多数クラスばかり当てても点になりません。 指標がどの平均かを最初に確認する のが重要です。
scikit-learn では average 引数を変えるだけで確認できます。
from sklearn.metrics import f1_score
f1_score(y_true, y_pred, average="macro") # クラス平等
f1_score(y_true, y_pred, average="micro") # = accuracy(マルチクラス時)
f1_score(y_true, y_pred, average="weighted") # クラス構成比で加重
まとめ
- 分類の評価指標は「連続値のまま評価(交差エントロピー・AUC)」と「ラベル割り当て後に評価(Accuracy・Precision・Recall・F1)」の2系統で整理できる
- 交差エントロピーは確信度を評価できるが不均衡に弱い。クラス重みで対処する
- AUC は予測値の順序だけを見る指標で、スケールに鈍感なためアンサンブルと相性が良い
- Precision と Recall はトレードオフ。タスクに応じて Fβ の β を選ぶ
- 多クラス F1 はマクロ / マイクロ / 加重で意味が大きく変わる。不均衡データではまずどの平均が使われているかを確認する
次回は、回帰・生成・検索/推薦タスクの評価指標と、「損失関数と評価指標はなぜ一致しないのか」を扱います。
参考
シリーズの他の記事

