機械学習の分類モデル評価における混同行列の活用法とscikit-learnでの実装
はじめに
機械学習モデルの開発において、モデルの性能を正しく評価することは非常に重要です。特に分類モデルの場合、単純な正解率(Accuracy)だけではモデルの振る舞いを十分に理解できないことがあります。例えば、特定のクラスを識別する能力に偏りがあったり、誤分類のタイプによって影響の大きさが異なったりする場合です。
本稿では、分類モデルの評価において基本となる「混同行列(Confusion Matrix)」の概念を解説し、混同行列からどのように様々な評価指標(適合率、再現率、F1スコアなど)が導き出されるかをご紹介します。さらに、Pythonの標準的な機械学習ライブラリであるscikit-learnを使用して、実際に混同行列を作成し、評価指標を計算する方法を具体的なコード例と共に示します。
この記事を通じて、読者の皆様が分類モデルの評価において混同行列を効果的に活用し、より深くモデルの性能を理解するための一助となれば幸いです。
混同行列(Confusion Matrix)とは
混同行列は、分類モデルの予測結果と実際の正解ラベルの関係をまとめた表です。特に二値分類(例: スパムか非スパムか、陽性か陰性か)の状況でよく用いられますが、多クラス分類にも拡張できます。
二値分類の場合、混同行列は通常、以下の4つの要素で構成されます。ここでは、ポジティブ(Positive)クラスとネガティブ(Negative)クラスがあると仮定します。
- 真陽性(True Positive, TP): 実際にはポジティブであり、モデルもポジティブと予測したケース数。
- 真陰性(True Negative, TN): 実際にはネガティブであり、モデルもネガティブと予測したケース数。
- 偽陽性(False Positive, FP): 実際にはネガティブでありながら、モデルがポジティブと誤って予測したケース数(タイプIエラー)。
- 偽陰性(False Negative, FN): 実際にはポジティブでありながら、モデルがネガティブと誤って予測したケース数(タイプIIエラー)。
これらの要素をまとめると、以下のような表として表現できます。
| | 予測結果: ポジティブ | 予測結果: ネガティブ | | :-------------- | :--------------------- | :--------------------- | | 実際のラベル: ポジティブ | 真陽性 (TP) | 偽陰性 (FN) | | 実際のラベル: ネガティブ | 偽陽性 (FP) | 真陰性 (TN) |
この行列を見ることで、モデルがどのクラスで正しく予測し、どのクラスで誤分類が多いのかを具体的に把握できます。
混同行列から導かれる評価指標
混同行列の各要素(TP, TN, FP, FN)を用いることで、正解率だけでは捉えきれないモデルの様々な側面を評価するための指標を計算できます。代表的なものをいくつか紹介します。
-
正解率(Accuracy): 全ての予測のうち、正しく分類できた割合。
Accuracy = (TP + TN) / (TP + TN + FP + FN)
データセットがバランスしている場合には有用ですが、不均衡データでは誤った判断を招く可能性があります。 -
適合率(Precision): モデルがポジティブと予測したケースのうち、実際にポジティブであった割合。「陽性と予測した中に、どれだけ本物が含まれているか」を示します。
Precision = TP / (TP + FP)
偽陽性を少なくしたい場合に重要な指標です(例: スパムメールフィルタで重要なメールを誤ってスパムと判定したくない場合)。 -
再現率(Recall) または 感度(Sensitivity): 実際にポジティブであるケースのうち、モデルがポジティブと正しく予測できた割合。「実際の陽性のうち、どれだけを取りこぼさなかったか」を示します。
Recall = TP / (TP + FN)
偽陰性を少なくしたい場合に重要な指標です(例: 疾患の診断で、実際は陽性である患者を見落としたくない場合)。 -
F1スコア(F1-score): 適合率と再現率の調和平均です。適合率と再現率のバランスを取りたい場合に用いられます。
F1-score = 2 * (Precision * Recall) / (Precision + Recall)
適合率と再現率のどちらか一方が極端に低い場合、F1スコアも低くなります。
これらの指標は、モデルの利用目的やデータセットの特性に応じて、どれを重視すべきかが異なります。
scikit-learnを用いた混同行列と評価指標の実装
Pythonで機械学習モデルを開発する際に広く利用されるscikit-learnライブラリは、混同行列の生成や様々な評価指標の計算機能を提供しています。
以下に、scikit-learnのconfusion_matrix
関数と、主要な評価指標を計算する関数の使用例を示します。
まず、必要なライブラリをインポートします。
from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, classification_report
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
import numpy as np
次に、簡単なダミーデータを作成し、分類モデルを訓練して予測を行います。
# ダミーデータの生成
X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_redundant=5,
weights=[0.9, 0.1], flip_y=0.01, random_state=42) # 不均衡データを模倣
# 訓練データとテストデータに分割
X_train, X_test, y_true, y_pred_dummy = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
# 簡単な分類モデルの訓練
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
※上記のコード例では、わかりやすさのためにy_pred_dummy
を生成していますが、混同行列や評価指標の計算にはモデルによる実際の予測結果y_pred
を使用します。
混同行列の生成
confusion_matrix
関数に実際の正解ラベル(y_true
)とモデルの予測結果(y_pred
)を渡すことで、混同行列を取得できます。
# 混同行列の計算
cm = confusion_matrix(y_true, y_pred)
print("混同行列:")
print(cm)
出力される混同行列は、以下の形式になります(二値分類の場合)。
[[TN, FP],
[FN, TP]]
主要な評価指標の計算
scikit-learnには、各評価指標を直接計算するための関数が用意されています。
# 個別の評価指標の計算
accuracy = accuracy_score(y_true, y_pred)
precision = precision_score(y_true, y_pred) # デフォルトではポジティブクラスに対する適合率
recall = recall_score(y_true, y_pred) # デフォルトではポジティブクラスに対する再現率
f1 = f1_score(y_true, y_pred) # デフォルトではポジティブクラスに対するF1スコア
print(f"\n正解率 (Accuracy): {accuracy:.4f}")
print(f"適合率 (Precision): {precision:.4f}")
print(f"再現率 (Recall): {recall:.4f}")
print(f"F1スコア (F1-score): {f1:.4f}")
precision_score
, recall_score
, f1_score
などは、多クラス分類の場合や、二値分類でもポジティブクラスの定義を変更したい場合に、average
やpos_label
といった引数で計算方法を指定できます。デフォルトでは、二値分類の場合はラベルが1のクラス(多くの場合ポジティブクラスとみなされる)に対する指標を計算します。
classification_reportの活用
classification_report
関数を使用すると、主要な評価指標(適合率、再現率、F1スコア、各クラスのサンプル数)をまとめて表示でき、非常に便利です。特に多クラス分類の場合に各クラスごとの指標を確認するのに役立ちます。
# classification_reportによるまとめて評価
report = classification_report(y_true, y_pred)
print("\nClassification Report:")
print(report)
classification_report
の出力には、各クラスの適合率、再現率、F1スコアに加えて、support
(各クラスのサンプル数)、accuracy
(全体の正解率)、macro avg
(クラスごとの指標の単純平均)、weighted avg
(クラスごとのサンプル数で重み付けした平均)が含まれます。
混同行列と評価指標の適切な使い方
混同行列とそれから導かれる評価指標は、モデルの性能を多角的に評価するための強力なツールですが、その解釈には注意が必要です。
- 不均衡データ: データセット内のクラス間に大きな偏りがある場合(例: 全サンプルの95%がネガティブクラス)、モデルが常にネガティブと予測するだけでも高い正解率が得られてしまいます。このような場合、正解率だけでなく、適合率、再現率、F1スコアを確認することが不可欠です。特に、少数派であるポジティブクラスに対する再現率(取りこぼしがないか)や適合率(誤って陽性と判定していないか)が重要になります。
- コストの違い: 誤分類のタイプ(偽陽性 vs 偽陰性)によって、ビジネス上や社会的に発生するコストが異なる場合があります。例えば、医療診断で偽陰性(実際は病気なのに健康と診断)は偽陽性(実際は健康なのに病気と診断)よりも重大な結果を招く可能性があります。このようなケースでは、再現率(偽陰性を減らす)を重視し、必要に応じて適合率とのトレードオフを考慮しながらモデルを調整する必要があります。
- 閾値の調整: 分類モデル、特に確率を出力するモデルの場合、クラスを決定するための確率の閾値を調整することで、適合率と再現率のバランスを変えることができます。混同行列やROC曲線(Receiver Operating Characteristic Curve)などを分析することで、目的に合った最適な閾値を選択することが可能です。
まとめ
本稿では、機械学習の分類モデル評価における混同行列の重要性と、それを用いた評価指標(正解率、適合率、再現率、F1スコア)の概念について解説しました。また、Pythonのscikit-learnライブラリを使用して、これらの評価を実際に行う方法を具体的なコード例と共に紹介しました。
混同行列は、モデルの予測結果を詳細に分析するための基本的なツールです。単に正解率を見るだけでなく、混同行列を理解し、適合率や再現率といった様々な指標を適切に参照することで、モデルがどのような種類の誤りを犯しやすいか、そしてそれが解決しようとしている問題に対して許容できるものなのかどうかを深く洞察することができます。
機械学習プロジェクトを進める上で、モデルの訓練と同様にその評価・検証は欠かせないステップです。今回ご紹介した混同行列とscikit-learnの機能を活用し、開発するモデルの性能をより正確に把握し、改善に繋げていただければ幸いです。