Machine Learning › ML Capstone
ML Capstone: โปรเจกต์ end-to-end
ประมาณ 20 นาที
เป้าหมายของบท
- ทำโปรเจกต์ ML แบบ end-to-end ที่ทำนายการซื้อซ้ำ โดยมี baseline, CV และการทดสอบครั้งสุดท้ายที่ซื่อตรง
- ใช้ rubric ตรวจงานตัวเอง (leakage, pipeline, การเทียบกับ baseline, ข้อจำกัด) ก่อนเผยแพร่
- เผยแพร่ notebook พร้อม README บน GitHub
Notebook
งานหลักของบทนี้ทำใน Jupyter notebook ไม่ใช่ในเว็บ — โหลดไฟล์ไปเปิดในเครื่อง หรือเปิดตรงบน Google Colab ก็ได้
โจทย์ของ ML capstone
ใช้ตาราง ml_customers (ลูกค้า 2,839 คน; 1 แถวต่อลูกค้า) ทำนายว่าลูกค้า จะซื้อซ้ำหรือไม่ (repeated) โดยใช้ข้อมูลของการสั่งซื้อครั้งแรกและช่องทางที่สมัคร
(ทางเลือกที่ยากกว่า: ทำนายมูลค่าคำสั่งซื้อแรก first_order_value แบบ regression)
เป้าหมายไม่ใช่ตัวเลขที่สูงที่สุด แต่คือ กระบวนการที่เชื่อถือได้ และการสื่อสารผลตามจริง — สิ่งที่คนสัมภาษณ์มองหา
ลำดับงานที่คาดหวัง
- เข้าใจโจทย์และ baseline: อัตราซื้อซ้ำเท่าไร โมเดล “เดาคนส่วนใหญ่” ได้ accuracy เท่าไร (≈ 0.59) — ทุกโมเดลต้องเอาชนะตัวนี้
- แบ่งข้อมูลและกัน test ไว้ก่อน (
train_test_split,stratify=y,random_state) แล้วแตะ test แค่ครั้งเดียวตอนท้าย - เตรียมข้อมูลใน Pipeline (
ColumnTransformer: scale ตัวเลข, one-hot ตัวหมวด) — ตรวจว่า feature ทุกตัวรู้ได้ ณ เวลาที่ต้องทำนาย (ไม่มี leakage) - เทียบอย่างน้อย 3 โมเดล ด้วย
StratifiedKFold(shuffle=True): logistic regression, ต้นไม้/forest/gradient boosting, และ (ถ้าอยากลอง) MLP รายงาน mean ± std ของ AUC และ accuracy เทียบ baseline - จูนเล็กน้อย ด้วย
GridSearchCVบน train เท่านั้น - อธิบาย: permutation importance บน test และ/หรือ coefficient — feature ไหนที่โมเดลพึ่ง
- ทดสอบครั้งสุดท้าย บน test แล้ว สรุปตามจริง พร้อมข้อจำกัด
สิ่งที่ควรคาดหวังจากข้อมูลนี้ (ตามที่เราเห็นในบทก่อนๆ)
- สัญญาณที่แรงมีอย่างเดียว คือช่องทาง
promo(ลูกค้าจาก promo ซื้อซ้ำน้อยกว่า) - logistic regression, ต้นไม้ตื้น, forest และ boosting ได้ AUC ราว 0.62–0.66 และ accuracy 0.64–0.66 (MLP มักแย่กว่า) (baseline ≈ 0.59) — ต่างกันไม่กี่ร้อยส่วน
- ตัวเลขที่ได้ “ปานกลาง” เป็นเรื่องปกติของข้อมูลจริงที่สัญญาณอ่อน: การรายงานตรงๆ ว่าโมเดลดีกว่า baseline แค่ไหน และไม่ควรเชื่อถือเกินกว่านั้น สำคัญกว่าตัวเลขสวย
Rubric ตรวจงานตัวเอง
- มี baseline และผลโมเดลทุกตัวถูกเทียบกับ baseline
- แบ่ง train/test ก่อนทำอะไรอื่น; test ถูกใช้ครั้งเดียวตอนท้าย
- การเตรียมข้อมูลอยู่ใน Pipeline (fit บน train เท่านั้น) และไม่มี feature ที่รั่วข้อมูลจากอนาคต
- เลือกโมเดล/hyperparameter ด้วย cross-validation ที่ shuffle แล้ว (รายงาน mean ± std)
- metric เหมาะกับโจทย์ (AUC + accuracy) และอธิบายว่าตัวเลขหมายถึงอะไรทางธุรกิจ
- มีส่วน “ข้อจำกัด” (ข้อมูลน้อย สัญญาณอ่อน ผลขึ้นกับ seed ฯลฯ) และ “ทำอะไรต่อ”
- notebook รันได้ทั้งไฟล์จากบนลงล่างโดยไม่ error
เผยแพร่บน GitHub
เหมือน capstone สาย DA: repo สาธารณะ + notebook + README.md สั้นๆ (โจทย์, วิธีรัน, ผลสรุป 2–3 บรรทัด พร้อมข้อจำกัดของผล) แล้วแปะลิงก์ใน resume/LinkedIn
แบบฝึกท้ายบท
บทนี้จะนับว่าเสร็จเมื่อผ่านข้อพื้นฐานและประยุกต์ครบ ข้อท้าทายได้ดาวเพิ่ม
🟢 พื้นฐาน
โหลด data/ml_customers.csv แล้วเก็บจำนวนแถวไว้ใน n_customers และอัตราซื้อซ้ำ (ค่าเฉลี่ยของ repeated ปัด 4 ตำแหน่ง) ไว้ใน repeat_rate — ตัวเลขตั้งต้นของโปรเจกต์
baseline: accuracy ที่ได้จากการเดาคลาสส่วนใหญ่เสมอ = สัดส่วนของคลาสที่พบมากกว่าใน repeated (ปัด 4 ตำแหน่ง) เก็บไว้ในตัวแปร baseline_acc — ทุกโมเดลต้องเอาชนะค่านี้
🟡 ประยุกต์
ใช้ X, y มาตรฐาน (get_dummies drop_first=True) แล้ววัด ROC-AUC เฉลี่ยของ pipeline StandardScaler + LogisticRegression(max_iter=2000) ด้วย StratifiedKFold(5, shuffle=True, random_state=42) ปัด 4 ตำแหน่ง เก็บไว้ในตัวแปร logreg_cv_auc — ผลอ้างอิงเริ่มต้นสำหรับเทียบโมเดลอื่น
สรุป
- ML capstone = baseline → split → pipeline → เทียบ ≥3 โมเดลด้วย CV → จูนบน train → อธิบาย → ทดสอบครั้งเดียว → สรุปตามจริง
- ข้อมูลนี้สัญญาณอ่อน (แทบมีแค่ promo) ผลจะอยู่ราว AUC 0.62–0.66 — รายงานว่าดีกว่า baseline ≈ 0.59 แค่ไหนและข้อจำกัดอย่างตรงไปตรงมา
- ใช้ notebook เริ่มต้นและ rubric ในบทนี้ แล้วเผยแพร่พร้อม README
คำถามสัมภาษณ์
เล่าโปรเจกต์ ML ของคุณใน 1 นาที ให้คนสัมภาษณ์ฟัง
โครง: โจทย์ธุรกิจและ metric (ทำไมเลือก AUC/accuracy) → baseline → วิธีแบ่งข้อมูลและป้องกัน leakage → โมเดลที่เทียบและผล CV (mean ± std) → โมเดลที่เลือกและเหตุผล → ผลบน test ครั้งเดียว → ข้อจำกัดและขั้นต่อไป การพูดถึงข้อจำกัดอย่างตรงไปตรงมาทำให้น่าเชื่อถือกว่าการโชว์ตัวเลขสวย