---
name: ml-baseline
description: เริ่มโปรเจกต์ ML อย่างถูกวินัย — เลือก metric ให้ตรงราคาความผิดพลาดจริง, split ข้อมูลไม่ให้รั่ว (time-based / group-based), สร้าง baseline ที่โง่ที่สุดเป็นโค้ดจริงก่อน แล้วค่อยอนุญาตให้โมเดลซับซ้อน — ทุก run วัดด้วย eval harness ตัวเดียวกัน Trigger on "เริ่มโปรเจกต์ ml", "ทำ baseline", "วาง eval", "ml baseline", or when the user starts any new ML/prediction project.
---

# ml-baseline — โมเดลหรูที่แพ้ค่าเฉลี่ย มีอยู่จริงและเยอะกว่าที่คิด

ลำดับนี้**บังคับ** — แต่ละขั้นกันความผิดพลาดที่ย้อนกลับมาแก้แพงมาก ห้ามข้าม:

## 1. โจทย์ + Metric (ก่อนแตะข้อมูล)

- ถามให้ได้ว่า **ตัวเลขไหนที่คนใช้งานสนจริง** และ**ความผิดพลาดแบบไหนแพงกว่า** — FP กับ FN ราคาเท่ากันแทบไม่มีจริง
- เลือก metric ตามราคานั้น: imbalanced → PR-AUC / F-beta (ไม่ใช่ accuracy — กับดักอันดับหนึ่ง: 99% accuracy บนข้อมูลที่ positive มี 1% = โมเดลตอบ "ไม่" ทุกข้อ), regression → ดูว่า outlier ควรลงโทษแรงไหม (RMSE vs MAE), ranking → metric ที่ตัดที่ K จริงของ product
- ตั้ง**เป้าขั้นต่ำที่คุ้มใช้งาน**ไว้ก่อนเห็นผล — กัน "ได้เท่าไหร่ก็บอกว่าดี"

## 2. Split ก่อนสำรวจ

- กันข้อมูล test ออก**ก่อน** EDA ลึก — ตาเห็น test set ก็รั่วแล้ว
- มีมิติเวลา → **time-based split** (train อดีต วัด อนาคต) — random split บนข้อมูล temporal คือ leakage เงียบที่พบบ่อยสุด
- entity เดิมโผล่หลายแถว (user, คนไข้, ร้าน) → **group split** — entity เดียวกันห้ามคร่อม train/test
- test set แตะ**ครั้งเดียวตอนจบ** — ระหว่างพัฒนาใช้ validation/CV เท่านั้น

## 3. Baseline โง่ (นี่คือพื้นของทั้งโปรเจกต์)

- Classification → ทายคลาสใหญ่สุด / regression → ทายค่าเฉลี่ย-มัธยฐาน / time series → ทายค่าเมื่อวาน (naive last-value — ชนะยากกว่าที่คิดมาก) / มี rule ธุรกิจเดิม → rule นั้นแหละคือ baseline
- **เขียนเป็นโค้ดจริง รันจริง ได้ตัวเลขจริง** — ไม่ใช่พูดปากเปล่า

## 4. Baseline ฉลาดขึ้นหนึ่งขั้น

- Linear/logistic regression หรือ gradient boosting เล็กๆ บน features ตรงไปตรงมา
- ช่องว่างระหว่างขั้น 3 กับขั้น 4 บอกว่า **signal อยู่ใน data แค่ไหน** — ถ้าขั้น 4 ชนะขั้น 3 นิดเดียว โมเดลใหญ่กว่านี้ก็มักช่วยได้อีกนิดเดียว ปัญหาอยู่ที่ data/features ไม่ใช่โมเดล

## 5. Eval harness หนึ่งเดียว

- สคริปต์เดียว (`src/eval.py` หรือเทียบเท่า) ที่รับ predictions → คืน metrics ครบ — **ทุกโมเดลผ่านทางนี้เท่านั้น** ห้ามใครคำนวณ metric เอง
- Seed คงที่ทุกจุด, split ถูก save/fix ไว้ ไม่ re-split ต่อ run
- เริ่ม `EXPERIMENTS.md` ที่ root ด้วยผล baseline ทั้งสองขั้น — จากนี้ทุกการทดลองเทียบกับเลขนี้ (ส่งไม้ต่อสกิล experiment-log)

## กติกา

- User ขอข้ามไป deep model เลย → เตือน**หนึ่งครั้ง**พร้อมเหตุผล (ไม่มี baseline = ไม่มีทางรู้ว่าความซับซ้อนซื้ออะไรมา) แล้วทำตามที่เขายืนยัน — เถียงรอบเดียวพอ
- ทุกขั้นจบด้วยโค้ดที่รันได้จริงใน repo ไม่ใช่คำอธิบาย
