ML評価ツール比較

機械学習の分類モデル評価における混同行列の活用法とscikit-learnでの実装

Tags: 機械学習, 分類モデル, モデル評価, 混同行列, scikit-learn, Python

はじめに

機械学習モデルの開発において、モデルの性能を正しく評価することは非常に重要です。特に分類モデルの場合、単純な正解率(Accuracy)だけではモデルの振る舞いを十分に理解できないことがあります。例えば、特定のクラスを識別する能力に偏りがあったり、誤分類のタイプによって影響の大きさが異なったりする場合です。

本稿では、分類モデルの評価において基本となる「混同行列(Confusion Matrix)」の概念を解説し、混同行列からどのように様々な評価指標(適合率、再現率、F1スコアなど)が導き出されるかをご紹介します。さらに、Pythonの標準的な機械学習ライブラリであるscikit-learnを使用して、実際に混同行列を作成し、評価指標を計算する方法を具体的なコード例と共に示します。

この記事を通じて、読者の皆様が分類モデルの評価において混同行列を効果的に活用し、より深くモデルの性能を理解するための一助となれば幸いです。

混同行列(Confusion Matrix)とは

混同行列は、分類モデルの予測結果と実際の正解ラベルの関係をまとめた表です。特に二値分類(例: スパムか非スパムか、陽性か陰性か)の状況でよく用いられますが、多クラス分類にも拡張できます。

二値分類の場合、混同行列は通常、以下の4つの要素で構成されます。ここでは、ポジティブ(Positive)クラスとネガティブ(Negative)クラスがあると仮定します。

これらの要素をまとめると、以下のような表として表現できます。

| | 予測結果: ポジティブ | 予測結果: ネガティブ | | :-------------- | :--------------------- | :--------------------- | | 実際のラベル: ポジティブ | 真陽性 (TP) | 偽陰性 (FN) | | 実際のラベル: ネガティブ | 偽陽性 (FP) | 真陰性 (TN) |

この行列を見ることで、モデルがどのクラスで正しく予測し、どのクラスで誤分類が多いのかを具体的に把握できます。

混同行列から導かれる評価指標

混同行列の各要素(TP, TN, FP, FN)を用いることで、正解率だけでは捉えきれないモデルの様々な側面を評価するための指標を計算できます。代表的なものをいくつか紹介します。

  1. 正解率(Accuracy): 全ての予測のうち、正しく分類できた割合。 Accuracy = (TP + TN) / (TP + TN + FP + FN) データセットがバランスしている場合には有用ですが、不均衡データでは誤った判断を招く可能性があります。

  2. 適合率(Precision): モデルがポジティブと予測したケースのうち、実際にポジティブであった割合。「陽性と予測した中に、どれだけ本物が含まれているか」を示します。 Precision = TP / (TP + FP) 偽陽性を少なくしたい場合に重要な指標です(例: スパムメールフィルタで重要なメールを誤ってスパムと判定したくない場合)。

  3. 再現率(Recall) または 感度(Sensitivity): 実際にポジティブであるケースのうち、モデルがポジティブと正しく予測できた割合。「実際の陽性のうち、どれだけを取りこぼさなかったか」を示します。 Recall = TP / (TP + FN) 偽陰性を少なくしたい場合に重要な指標です(例: 疾患の診断で、実際は陽性である患者を見落としたくない場合)。

  4. 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などは、多クラス分類の場合や、二値分類でもポジティブクラスの定義を変更したい場合に、averagepos_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(クラスごとのサンプル数で重み付けした平均)が含まれます。

混同行列と評価指標の適切な使い方

混同行列とそれから導かれる評価指標は、モデルの性能を多角的に評価するための強力なツールですが、その解釈には注意が必要です。

まとめ

本稿では、機械学習の分類モデル評価における混同行列の重要性と、それを用いた評価指標(正解率、適合率、再現率、F1スコア)の概念について解説しました。また、Pythonのscikit-learnライブラリを使用して、これらの評価を実際に行う方法を具体的なコード例と共に紹介しました。

混同行列は、モデルの予測結果を詳細に分析するための基本的なツールです。単に正解率を見るだけでなく、混同行列を理解し、適合率や再現率といった様々な指標を適切に参照することで、モデルがどのような種類の誤りを犯しやすいか、そしてそれが解決しようとしている問題に対して許容できるものなのかどうかを深く洞察することができます。

機械学習プロジェクトを進める上で、モデルの訓練と同様にその評価・検証は欠かせないステップです。今回ご紹介した混同行列とscikit-learnの機能を活用し、開発するモデルの性能をより正確に把握し、改善に繋げていただければ幸いです。