はじめに
機械学習モデルを構築するとき、「確率を重視して評価するか」「最終的なラベル判定を重視するか」 によって選ぶ指標が変わります。本記事では、CatBoostを例に、目的関数(loss_function)、評価関数(eval_metric)、そしてテスト後の最終評価をどのように使い分けるべきかを整理します。
1. 目的関数(loss_function)
- モデル学習時に最小化を目指す関数
- 常に確率予測の精度向上を目的 として設定
- 二値分類:
Logloss
- 多クラス分類:
MultiClass
(/MultiClassOneVsAll
)
- 二値分類:
- ラベル判定用の指標(F1やAccuracy)は、学習の最適化対象には通常選びません
from catboost import CatBoostClassifier
model = CatBoostClassifier(
loss_function='Logloss', # or 'MultiClass'
iterations=500,
learning_rate=0.1,
verbose=100
)
2. 評価関数(eval_metric)
- 学習中のモニタリングや早期停止に利用
- 確率重視:
Logloss
/AUC
(ROC-AUC) - ラベル重視:
F1
/Accuracy
model = CatBoostClassifier(
loss_function='Logloss',
eval_metric='AUC', # 確率のランキング能力を監視
early_stopping_rounds=50
)
# ラベル判定のモニタリング例
model = CatBoostClassifier(
loss_function='Logloss',
eval_metric='F1',
early_stopping_rounds=50
)
3. 最終評価
- テストセットでレポートする指標
- 確率そのものの評価:Logloss、AUC
- ラベル判定の評価:混同行列から算出するPrecision/Recall/F1/Accuracy
from sklearn.metrics import log_loss, roc_auc_score, f1_score, accuracy_score
# 確率評価
y_prob = model.predict_proba(X_test)[:, 1]
print("Logloss:", log_loss(y_true, y_prob))
print("AUC :", roc_auc_score(y_true, y_prob))
# ラベル評価
y_pred = (y_prob >= 0.5).astype(int)
print("F1 :", f1_score(y_true, y_pred))
print("Acc :", accuracy_score(y_true, y_pred))
4. 用途別まとめ
項目 | 確率重視 | ラベル重視 |
---|---|---|
目的関数 | Logloss /MultiClass | (確率最適化のまま) |
評価関数 | Logloss /AUC | F1 /Accuracy |
最終評価 | Logloss、AUC | Precision/Recall/F1/Accuracy |
判定方法 | 出力確率そのまま | 閾値(通常0.5)で二値化 |
まとめ
- 目的関数 は常に「確率をいかに正しく予測できるか」を最適化するものを選ぶ。
- 評価関数 と 最終評価 では、確率そのものの精度(Logloss/AUC)と、閾値で切ったあとのラベル判定精度(F1/Accuracy)を用途に応じて使い分けましょう。
- この区別を意識することで、モデルの学習目的と評価軸がブレず、より適切なチューニングが可能になります。
ぜひ自分のタスクに合わせて指標を設定し、モデルの性能を多角的に把握してみてください!