Machine Learning › พื้นฐาน ML และ scikit-learn
Logistic regression และ classification
ประมาณ 30 นาที
เป้าหมายของบท
- ใช้ LogisticRegression ทำนายคลาส และแยกความต่างของ predict กับ predict_proba
- ปรับ threshold และเข้าใจว่าเกณฑ์เปลี่ยนผลอย่างไร
- อ่าน coefficient เป็น odds ratio
classification คือการทำนายคลาส
เมื่อ target เป็นคลาส (0/1 เช่น ซื้อซ้ำ/ไม่ซื้อซ้ำ) เรียกว่าโจทย์ classification — LogisticRegression เป็นโมเดลเริ่มต้นที่ใช้บ่อย
(ชื่อมี “regression” แต่ใช้ทำนายคลาส) โมเดลคำนวณ ความน่าจะเป็น ของคลาส 1 ก่อน แล้วค่อยตัดสินเป็น 0/1
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(max_iter=2000).fit(X_train, y_train)
model.predict(X_test) # คลาสที่ทำนาย (0/1)
model.predict_proba(X_test)[:, 1] # ความน่าจะเป็นของคลาส 1
model.score(X_test, y_test) # accuracy
predict กับ predict_proba
predict เป็นแค่ 0/1 — ซ่อนความมั่นใจของโมเดลไว้ ส่วน predict_proba ให้ความน่าจะเป็นจริง ซึ่งนำไปจัดอันดับลูกค้าหรือปรับเกณฑ์ได้
threshold: เกณฑ์ตัดสินใจ
predict ใช้เกณฑ์ 0.5 เป็นค่าเริ่มต้น (ความน่าจะเป็น ≥ 0.5 → คลาส 1) แต่ 0.5 ไม่ใช่กฎตายตัว:
proba = model.predict_proba(X_test)[:, 1]
pred_strict = (proba >= 0.7).astype(int)
ยิ่งตั้งเกณฑ์สูง จำนวนที่ทำนายเป็นคลาส 1 ยิ่งน้อยลง — เลือกเกณฑ์ตามต้นทุนของความผิดพลาดแต่ละแบบในงานจริง (บทถัดไปจะเรื่อง precision/recall)
อ่าน coefficient เป็น odds ratio
coefficient ของ logistic regression อยู่ในหน่วย log-odds — ยกด้วย exp จะได้ odds ratio: ค่ามากกว่า 1 แปลว่า feature นั้นเพิ่มโอกาส (odds) ของคลาส 1
น้อยกว่า 1 แปลว่าลดโอกาส เช่น channel_promo มี coefficient ≈ −2.19 → odds ratio ≈ 0.11 (ลูกค้าจากช่องทาง promo มี odds ซื้อซ้ำเหลือราว 11% ของช่องทางอ้างอิง เมื่อปัจจัยอื่นคงที่)
ตัวอย่างแก้โจทย์
กด "ขั้นต่อไป" ทีละขั้น ลองรันและแก้โค้ดในแต่ละขั้นได้
เทรนและดูความน่าจะเป็น
ทำนายว่าลูกค้าจะซื้อซ้ำไหม และดูว่าโมเดลมั่นใจแค่ไหน
เทรน LogisticRegression แล้ววัด accuracy บนชุดทดสอบ
ขยับ threshold
ถ้าเปลี่ยนเกณฑ์ตัดสินจาก 0.5 จะเกิดอะไรขึ้น
นับจำนวนที่ทำนายว่าซื้อซ้ำและ accuracy ที่เกณฑ์ 0.5 / 0.6 / 0.7 — ยิ่งเกณฑ์สูง จำนวนที่ทำนายเป็นคลาส 1 ยิ่งน้อยลง
เติมช่องว่าง
แทน ___ ด้วยโค้ดที่ถูกต้อง แล้วกดตรวจคำตอบ
นับจำนวนลูกค้าที่โมเดลทำนายว่าจะซื้อซ้ำเมื่อใช้เกณฑ์ 0.7 เก็บไว้ในตัวแปร n_pos_07 เติม ___ ให้ครบ
แบบฝึกท้ายบท
บทนี้จะนับว่าเสร็จเมื่อผ่านข้อพื้นฐานและประยุกต์ครบ ข้อท้าทายได้ดาวเพิ่ม
🟢 พื้นฐาน
accuracy ของ LogisticRegression(max_iter=2000) บนชุดทดสอบ ปัด 4 ตำแหน่ง เก็บไว้ในตัวแปร test_acc
ความน่าจะเป็นที่จะซื้อซ้ำของลูกค้าแถวแรกในชุดทดสอบ ปัด 4 ตำแหน่ง เก็บไว้ในตัวแปร first_proba
จำนวนลูกค้าในชุดทดสอบที่โมเดลทำนายว่าจะซื้อซ้ำเมื่อใช้เกณฑ์ 0.5 (proba >= 0.5) เก็บไว้ในตัวแปร n_pos_05
จำนวนที่ทำนายว่าจะซื้อซ้ำเมื่อใช้เกณฑ์ 0.7 เก็บไว้ในตัวแปร n_pos_07
🟡 ประยุกต์
accuracy บนชุดทดสอบเมื่อใช้เกณฑ์ 0.6 ปัด 4 ตำแหน่ง เก็บไว้ในตัวแปร acc_06
coefficient ของ feature channel_promo (ปัด 3 ตำแหน่ง) เก็บไว้ในตัวแปร coef_promo
odds ratio ของ channel_promo = exp(coefficient) ปัด 3 ตำแหน่ง เก็บไว้ในตัวแปร odds_ratio_promo
🔴 ท้าทาย
ลองเกณฑ์ 0.3, 0.4, 0.5, 0.6, 0.7 แล้วหาเกณฑ์ที่ให้ accuracy สูงสุด (ถ้าเท่ากันเลือกเกณฑ์ที่น้อยกว่า) เก็บไว้ในตัวแปร best_threshold
accuracy ที่เกณฑ์ดีที่สุดจากข้อ e8 (ปัด 4 ตำแหน่ง) เก็บไว้ในตัวแปร best_acc
Quiz
สรุป
- LogisticRegression คำนวณความน่าจะเป็นของคลาส 1 แล้วตัดสินด้วย threshold (ค่าเริ่มต้น 0.5)
- เกณฑ์สูงขึ้น = ทำนายคลาส 1 น้อยลง — เลือกตามต้นทุนของความผิดพลาดในงานจริง
- exp(coefficient) คือ odds ratio: ช่องทาง promo ลด odds ซื้อซ้ำเหลือราว 0.11 เท่าเมื่อปัจจัยอื่นคงที่
คำถามสัมภาษณ์
อธิบายความต่างระหว่าง predict และ predict_proba และเมื่อไรควรใช้ตัวไหน
predict ให้คลาสสุดท้าย (0/1) ที่ตัดสินด้วยเกณฑ์ 0.5 ส่วน predict_proba ให้ความน่าจะเป็นจริง ใช้ predict_proba เมื่ออยากจัดอันดับลูกค้า (ติดต่อคนที่มีโอกาสสูงสุดก่อน) หรืออยากปรับเกณฑ์ตัดสินให้เหมาะกับต้นทุนของงาน และใช้ predict เมื่อต้องการคำตอบสุดท้ายที่ใช้เกณฑ์มาตรฐานแล้ว
อธิบาย odds ratio ของ channel_promo ที่เท่ากับ ~0.11 ให้ทีมการตลาดฟัง
ลูกค้าที่มาจากช่องทาง promo มีโอกาส (odds) ซื้อซ้ำต่ำกว่าช่องทางอ้างอิง (ads) มาก — เหลือประมาณ 11% ของ odds เมื่อเทียบกันโดยปัจจัยอื่นเหมือนกัน ซึ่งสอดคล้องกับที่เห็นจากข้อมูลว่าลูกค้า promo ซื้อซ้ำไม่ถึง 13% เทียบกับกว่า 60% ของช่องทางอื่น สรุปได้ว่าแคมเปญ promo ดึงลูกค้ามาก แต่ส่วนใหญ่ไม่กลับมา