マルチラベル分類問題 - 性能評価指標 AUC(Area Under the Curve)の適用
Kaggle初心者向けPlayground Seriesで、今回のテーマはマルチラベル分類。AUCの考え方がよくわからなくてChatGPTに教えてもらったのでメモ。
AUC(Area Under the Curve)
マルチラベル分類では、一つのインスタンスが複数のクラスに属することがあります。この問題に対して、モデルの性能を評価する際には、通常の方法とは異なるアプローチが必要です。
ダミーデータの作成
make_multilabel_classification関数を使用し、マルチラベルのデータセットを生成します。
from sklearn.datasets import make_multilabel_classification
from sklearn.model_selection import train_test_split
# マルチラベルのダミーデータ生成
X, y = make_multilabel_classification(n_samples=1000, n_features=20, n_classes=3, n_labels=2, random_state=42)
# データをトレーニングセットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
モデルのトレーニングと予測
OneVsRestClassifierを用いて、各ラベルに対して独立した分類器をトレーニングし、テストデータに対する予測を行います。
from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier
# OneVsRestClassifierでロジスティック回帰モデルを初期化し、トレーニング
model = OneVsRestClassifier(LogisticRegression(max_iter=1000, random_state=42))
model.fit(X_train, y_train)
グローバルAUCの算出とグラフの描画
全クラスの予測確率と実際のラベルを一つの大きなデータセットとして扱い、ROC曲線を描画します。これにより、マルチラベル分類問題全体としてのモデルの性能を評価することができます。
from sklearn.metrics import roc_curve, auc
import numpy as np
import matplotlib.pyplot as plt
# 予測確率の計算
y_pred_proba = model.predict_proba(X_test)
# 予測確率と実際のラベルを平坦化
y_true_combined = np.ravel(y_test)
y_pred_combined = np.ravel(y_pred_proba)
# ROC曲線とAUCの計算
fpr, tpr, thresholds = roc_curve(y_true_combined, y_pred_combined)
global_auc = auc(fpr, tpr)
# ROC曲線の描画
plt.figure()
plt.plot(fpr, tpr, label=f'Global AUC = {global_auc:.2f}')
plt.plot([0, 1], [0, 1], 'k--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Global ROC Curve')
plt.legend(loc="lower right")
plt.show()
マイクロ平均とマクロ平均
マイクロ平均は、特にクラスの不均衡が大きいデータセットにおいて重要な指標です。一方、マクロ平均は、全てのクラスを等しく扱うため、全体的な性能のバランスを評価するのに適しています。
マイクロ平均AUCは、全クラスの真陽性数、偽陽性数、偽陰性数の合計から計算され、クラスのサンプルサイズを考慮します。
マクロ平均AUCでは、各クラスについてAUCを計算し、それらの平均を取ります。これにより、全クラスが等しく扱われます。
from sklearn.metrics import roc_auc_score
# マイクロ平均AUCの計算
micro_auc = roc_auc_score(y_test, y_pred_proba, average='micro')
print(f"Micro-average AUC: {micro_auc:.3f}")
# マクロ平均AUCの計算
macro_auc = roc_auc_score(y_test, y_pred_proba, average='macro')
print(f"Macro-average AUC: {macro_auc:.3f}")
マイクロ平均AUCが高いがマクロ平均AUCが低い場合、大きいクラスでの高性能と小さいクラスでの性能不足が示されます。これは、クラス間での性能のバランスが取れていないことを意味します。
この記事が気に入ったらサポートをしてみませんか?