Machine Learning › พื้นฐาน ML และ scikit-learn
workflow ของ ML และ baseline
ประมาณ 25 นาที
เป้าหมายของบท
- อธิบาย workflow ของ supervised learning: features (X) กับ target (y)
- แบ่งข้อมูล train/test ให้ถูก (random_state, stratify)
- เทียบโมเดลกับ baseline เสมอ และสังเกต data leakage ได้
ML แบบ supervised คืออะไร
โมเดลเรียนรู้จากตัวอย่างที่ “รู้คำตอบแล้ว” เพื่อทำนายกรณีใหม่ — ข้อมูลแบ่งเป็นสองส่วน:
- features (X) — ข้อมูลที่ใช้ทำนาย เช่น ช่องทางสมัคร เมือง มูลค่าออเดอร์แรก
- target (y) — สิ่งที่อยากทำนาย เช่น
repeated(ลูกค้าคนนี้จะกลับมาซื้อซ้ำไหม 1/0)
ตลอดสาย ML ใช้ตาราง data/ml_customers.csv — หนึ่งแถวต่อลูกค้าที่เคยสั่งซื้อ (2,839 คน) โดย feature ทุกตัวรู้ได้ ณ ตอนที่ลูกค้า
สั่งออเดอร์แรก ส่วน repeated คือ 1 ถ้าต่อมาลูกค้ามีออเดอร์รวมตั้งแต่ 2 ครั้งขึ้นไป
import pandas as pd
df = pd.read_csv("data/ml_customers.csv")
X = pd.get_dummies(df.drop(columns=['customer_id', 'repeated', 'first_order_value']), drop_first=True)
y = df['repeated']
get_dummies แปลงคอลัมน์ข้อความ (เมือง ช่องทาง ฯลฯ) เป็นตัวเลข 0/1 เพื่อให้โมเดลใช้ได้ (บท Feature engineering จะลงรายละเอียด)
แบ่ง train/test
โมเดลที่ดีต้องทำนายข้อมูล ที่ไม่เคยเห็น ได้ จึงกันข้อมูลส่วนหนึ่งไว้ทดสอบ ห้ามเอาไปเทรน:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42, stratify=y)
random_state=42— ให้สุ่มแบบเดิมทุกครั้ง ผลลัพธ์ถึงทำซ้ำได้stratify=y— รักษาสัดส่วน 0/1 ของ target ให้เท่ากันทั้งชุด train และ test
baseline: ต้องชนะอะไรถึงเรียกว่า “ดี”
ก่อนดูความแม่นยำของโมเดล ให้ถามก่อนว่า ถ้าทายแบบโง่ที่สุดจะได้เท่าไร — เช่นทายคลาสที่พบบ่อยที่สุดทุกแถว (majority baseline) ถ้าโมเดลไม่ชนะ baseline แปลว่ายังไม่มีประโยชน์ ตัวเลข accuracy ลอยๆ (เช่น 64%) บอกอะไรไม่ได้
data leakage
Leakage คือข้อมูลที่ “ไม่ควรรู้ ณ ตอนทำนายจริง” หลุดเข้ามาเป็น feature เช่น จำนวนออเดอร์ทั้งหมดของลูกค้า (ซึ่งรู้ได้ก็ต่อเมื่อลูกค้าซื้อซ้ำไปแล้ว) ผลบนชุดทดสอบจะสวยเกินจริง (เกือบ 100%) แต่ใช้งานจริงไม่ได้เลย — ตัวเลขที่ดีเกินไปมักเป็นสัญญาณให้สงสัย leakage ก่อนดีใจ
ตัวอย่างแก้โจทย์
กด "ขั้นต่อไป" ทีละขั้น ลองรันและแก้โค้ดในแต่ละขั้นได้
สร้าง X/y และแบ่ง train/test
เตรียมข้อมูลลูกค้าให้พร้อมเทรนโมเดลทำนายว่าลูกค้าจะซื้อซ้ำไหม
แยก features (X) กับ target (y) — get_dummies แปลงคอลัมน์ข้อความเป็น 0/1
เทียบโมเดลกับ baseline
โมเดลที่ได้ accuracy 64% ถือว่าดีไหม?
หา majority baseline — ทายว่า "ซื้อซ้ำ" ทุกแถว (คลาสที่พบมากกว่า) ได้กี่ %
เติมช่องว่าง
แทน ___ ด้วยโค้ดที่ถูกต้อง แล้วกดตรวจคำตอบ
แบ่งข้อมูลเป็น train/test สัดส่วน 75/25 แบบ stratify ตาม y เก็บจำนวนแถว train ไว้ในตัวแปร n_train เติม ___ ให้ครบ
แบบฝึกท้ายบท
บทนี้จะนับว่าเสร็จเมื่อผ่านข้อพื้นฐานและประยุกต์ครบ ข้อท้าทายได้ดาวเพิ่ม
🟢 พื้นฐาน
ตาราง ml_customers.csv มีกี่แถวและกี่คอลัมน์ เก็บไว้ในตัวแปร n_rows, n_cols
สัดส่วนลูกค้าที่ซื้อซ้ำ (repeated = 1) ปัดเป็นทศนิยม 4 ตำแหน่ง เก็บไว้ในตัวแปร repeat_rate
แบ่ง train/test (test_size=0.25, random_state=42, stratify=y) แล้วเก็บจำนวนแถวชุด train และ test ไว้ในตัวแปร n_train, n_test
majority baseline: accuracy บนชุดทดสอบถ้าทายคลาสที่พบมากกว่าทุกแถว ปัดทศนิยม 4 ตำแหน่ง เก็บไว้ในตัวแปร baseline_acc
🟡 ประยุกต์
หลัง get_dummies(drop_first=True) จะมี feature ทั้งหมดกี่คอลัมน์ (ไม่รวม customer_id, repeated, first_order_value) เก็บไว้ในตัวแปร n_features
เทรน LogisticRegression(max_iter=2000) บน train แล้ววัด accuracy บนชุดทดสอบ (ปัด 4 ตำแหน่ง) เก็บไว้ในตัวแปร test_acc
โมเดลดีกว่า majority baseline กี่จุดเปอร์เซ็นต์ (test_acc − baseline_acc คูณ 100 ปัด 2 ตำแหน่ง) เก็บไว้ในตัวแปร gain_pp
🔴 ท้าทาย
ลองเพิ่ม feature "จำนวนออเดอร์ทั้งหมดของลูกค้า" (n_orders นับจาก data/orders.csv) เข้าไปแล้วเทรนใหม่ (แบ่งข้อมูลแบบเดิม) เก็บ accuracy บนชุดทดสอบไว้ในตัวแปร leaky_acc
ผลจากข้อ e8 ดีจนน่าสงสัยไหม ตอบเป็น True/False โดยถือว่า accuracy > 0.95 คือน่าสงสัยว่ามี leakage เก็บไว้ในตัวแปร is_leaky
Quiz
สรุป
- supervised learning ใช้ features (X) ทำนาย target (y) โดยต้องแบ่ง train/test เพื่อวัดผลกับข้อมูลที่ไม่เคยเห็น
- ตั้ง random_state และ stratify เพื่อให้ผลทำซ้ำได้และสัดส่วนคลาสไม่เพี้ยน
- เทียบกับ baseline เสมอ (ในข้อมูลนี้ทายว่าซื้อซ้ำทุกคนก็ได้ ~59%) และระวังผลที่ดีเกินจริง — มักเป็น leakage
คำถามสัมภาษณ์
อธิบาย data leakage พร้อมยกตัวอย่าง และบอกวิธีสังเกต
leakage คือการที่ข้อมูลจากอนาคตหรือข้อมูลที่ไม่มีตอนทำนายจริงหลุดเข้ามาเป็น feature เช่น ใช้ "จำนวนออเดอร์ทั้งหมดของลูกค้า" ทำนายว่าลูกค้าจะซื้อซ้ำไหม ซึ่งรู้ได้ก็ต่อเมื่อลูกค้าซื้อซ้ำไปแล้ว
วิธีสังเกต: ผลบนชุดทดสอบดีเกินจริง (เช่น accuracy ใกล้ 100% ในโจทย์ที่ควรยาก) หรือ feature ตัวหนึ่งมีอิทธิพลสูงผิดปกติ — ให้ไล่ถามทีละ feature ว่า "ตอนใช้งานจริงเรารู้ค่านี้ ณ เวลาที่ต้องทำนายไหม"
ทำไมผลลัพธ์ของโมเดลถึงต้องเทียบกับ baseline เสมอ
เพราะตัวเลขอย่าง accuracy 64% ไม่มีความหมายถ้าไม่รู้ว่าวิธีที่ง่ายที่สุดได้เท่าไร ในโจทย์ที่คลาสไม่สมดุล การทายคลาสส่วนใหญ่ก็อาจได้สูงอยู่แล้ว (ในข้อมูลนี้ ~59%) baseline บอกว่าโมเดลเพิ่มมูลค่าจริงเท่าไร และช่วยตัดสินว่าคุ้มกับความซับซ้อนที่เพิ่มขึ้นหรือไม่