まとめ
- สรุปตัวชี้วัดหลักสำหรับงานจำแนก และความต่างของ binary, multi-class, multi-label
- มองภาพรวมตัวชี้วัดจาก confusion matrix, การปรับ threshold, ความน่าเชื่อถือของความน่าจะเป็น และ ranking
- แนะแนวการเลือกชุดตัวชี้วัดและการรายงานผลให้สอดคล้องกับธุรกิจ
Chapter 3 #
ภาพรวมตัวชี้วัดการจำแนก #
การประเมินโมเดลจำแนกขึ้นอยู่กับสมดุลของคลาส การตั้ง threshold ความน่าเชื่อถือของความน่าจะเป็น และคุณภาพของอันดับบนสุด ในส่วนนี้เรารวบรวมกลุ่มตัวชี้วัดหลักและแนวทางเลือกใช้ตามงาน
หมวดของตัวชี้วัด #
1. กลุ่มที่อิง confusion matrix #
- Accuracy (Accuracy): ความแม่นยำรวม แต่หลอกตาเมื่อข้อมูลไม่สมดุล
- Precision / Recall / F1 (Precision-Recall, F1): เลือกตามต้นทุนของความผิดพลาด
- Specificity / Sensitivity (Sensitivity/Specificity): สำคัญในงานแพทย์หรือคัดกรอง
- Macro / Micro / Weighted averaging (Averaging strategies): วิธีรวมผลในงานหลายคลาส
2. การปรับ threshold และ ranking #
- Precision-Recall curve / PR-AUC (PR): เหมาะเมื่อคลาสบวกมีน้อย
- ROC curve / ROC-AUC (ROC-AUC): วัดความสามารถในการแยกคลาสโดยรวม
- Top-k Accuracy / Hit Rate (Top-k Accuracy, Hit Rate): งานแนะนำหรือค้นหาที่ดูแค่ผลลัพธ์บนสุด
3. ความน่าจะเป็นและการคาลิเบรต #
- Log Loss (Log Loss): ให้รางวัลกับความน่าจะเป็นที่แม่นยำ
- Brier Score (Brier Score): ใช้คู่กับ calibration curve เพื่อตรวจความน่าเชื่อถือ
- Calibration curves: เปรียบเทียบความน่าจะเป็นทำนายกับความถี่จริง
4. ตัวชี้วัดช่วยงานคลาสไม่สมดุล #
- Balanced Accuracy (Balanced Accuracy): เฉลี่ย recall ต่อคลาส
- Cohen’s Kappa / MCC (Cohen’s κ, MCC): ทนทานต่อความไม่สมดุล
การเปลี่ยนแปลงของตัวชี้วัดเมื่อปรับ threshold #
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_score, f1_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X, y = make_classification(
n_samples=2000,
n_features=12,
n_informative=4,
weights=[0.85, 0.15],
random_state=42,
)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, stratify=y, random_state=42
)
scaler = StandardScaler()
model = LogisticRegression(max_iter=2000)
model.fit(scaler.fit_transform(X_train), y_train)
prob = model.predict_proba(scaler.transform(X_test))[:, 1]
thresholds = np.linspace(0.05, 0.95, 19)
precision, recall, f1 = [], [], []
for t in thresholds:
y_pred = (prob >= t).astype(int)
precision.append(precision_score(y_test, y_pred, zero_division=0))
recall.append(recall_score(y_test, y_pred, zero_division=0))
f1.append(f1_score(y_test, y_pred, zero_division=0))
fig, ax = plt.subplots(figsize=(6.8, 4))
ax.plot(thresholds, precision, label="Precision", color="#2563eb")
ax.plot(thresholds, recall, label="Recall", color="#dc2626")
ax.plot(thresholds, f1, label="F1", color="#0d9488")
ax.set_xlabel("Threshold")
ax.set_ylabel("Score")
ax.set_title("Effect of threshold on classification metrics")
ax.set_ylim(0, 1.05)
ax.grid(alpha=0.3)
ax.legend()
plt.tight_layout()

เมื่อ threshold ลดลง recall จะเพิ่มขึ้น แต่ precision จะลดลง สามารถเลือกจุดที่ F1 สูงสุดเป็นจุดสมดุลได้
ประเด็นสำหรับรายงานและการใช้งานจริง #
- แนบ confusion matrix เสมอ
เห็นรูปแบบความผิดพลาดต่อคลาสชัดเจน - อธิบายเหตุผลของ threshold
ใช้ PR curve หรือกราฟ threshold-score ประกอบ - ตรวจสอบการคาลิเบรตของความน่าจะเป็น
หากใช้ความน่าจะเป็นในการตัดสินใจให้ดู Brier Score - คำนึงถึงคลาสไม่สมดุล
ใช้ Balanced Accuracy หรือ MCC ร่วมกับ Accuracy - เฝ้าระวัง drift
ติดตาม Precision/Recall, PR-AUC, ROC-AUC ตามเวลา
Quick reference #
| มุมมอง | ตัวชี้วัด | หน้าที่เกี่ยวข้อง | หมายเหตุ |
|---|---|---|---|
| ความแม่นยำรวม | Accuracy / Balanced Accuracy | Accuracy / Balanced Accuracy | คลาสไม่สมดุลควรรายงาน Balanced Accuracy |
| FP vs FN | Precision / Recall / Fβ | Precision-Recall / F1 | ใช้ร่วมกับการเลือก threshold |
| คุณภาพ ranking | PR-AUC / ROC-AUC / Top-k | PR curve / ROC-AUC / Top-k Accuracy | เหมาะกับงานแนะนำและคลาสหายาก |
| การคาลิเบรต | Log Loss / Brier Score | Log Loss / Brier Score | ใช้เมื่อความน่าจะเป็นมีผลต่อการตัดสินใจ |
| ความทนทาน | MCC / Cohen’s κ | MCC / Cohen’s κ | เสถียรเมื่อคลาสไม่สมดุล |
Checklist #
- ใช้ตัวชี้วัดสำหรับคลาสไม่สมดุลร่วมกัน
- อธิบายเหตุผลของ threshold (PR/ROC, ต้นทุน)
- ตรวจสอบการคาลิเบรตของความน่าจะเป็น
- เทียบการกระจายของข้อมูลระหว่าง valid กับ production
- กำหนด metric หลักสำหรับการเปรียบเทียบในอนาคต