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% ของช่องทางอ้างอิง เมื่อปัจจัยอื่นคงที่)

ตัวอย่างแก้โจทย์

กด "ขั้นต่อไป" ทีละขั้น ลองรันและแก้โค้ดในแต่ละขั้นได้

เทรนและดูความน่าจะเป็น

ทำนายว่าลูกค้าจะซื้อซ้ำไหม และดูว่าโมเดลมั่นใจแค่ไหน

  1. เทรน LogisticRegression แล้ววัด accuracy บนชุดทดสอบ

    Python

ขยับ threshold

ถ้าเปลี่ยนเกณฑ์ตัดสินจาก 0.5 จะเกิดอะไรขึ้น

  1. นับจำนวนที่ทำนายว่าซื้อซ้ำและ accuracy ที่เกณฑ์ 0.5 / 0.6 / 0.7 — ยิ่งเกณฑ์สูง จำนวนที่ทำนายเป็นคลาส 1 ยิ่งน้อยลง

    Python

เติมช่องว่าง

แทน ___ ด้วยโค้ดที่ถูกต้อง แล้วกดตรวจคำตอบ

ยังไม่ได้ทำ

นับจำนวนลูกค้าที่โมเดลทำนายว่าจะซื้อซ้ำเมื่อใช้เกณฑ์ 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

1. predict_proba ให้อะไร
2. ถ้าเพิ่ม threshold จาก 0.5 เป็น 0.7 จำนวนที่ถูกทำนายเป็นคลาส 1 จะเป็นอย่างไร
3. odds ratio ของ feature = 0.11 แปลว่าอะไร
4. ทำไมไม่ควรยึดเกณฑ์ 0.5 เสมอ

สรุป

  • 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 ดึงลูกค้ามาก แต่ส่วนใหญ่ไม่กลับมา