Machine Learning › พื้นฐาน ML และ scikit-learn

Linear regression และ metric ของ regression

ประมาณ 30 นาที

เป้าหมายของบท

  • ใช้ LinearRegression ทำนาย target ที่เป็นตัวเลข
  • วัดผลด้วย MAE, RMSE และ R² เทียบกับ baseline ค่าเฉลี่ย
  • อ่านค่า coefficient อย่างระวัง และรู้จักการแปลง log กับ target ที่เบ้

regression คือการทำนายตัวเลข

เมื่อ target เป็นตัวเลขต่อเนื่อง (เช่น มูลค่าออเดอร์แรกเป็นบาท) เรียกว่าโจทย์ regression — โมเดลเริ่มต้นที่ควรรู้จักที่สุดคือ LinearRegression ซึ่งหาสมการเส้นตรง ทำนาย = intercept + w1·x1 + w2·x2 + …

from sklearn.linear_model import LinearRegression

model = LinearRegression().fit(X_train, y_train)
pred = model.predict(X_test)

ตัวอย่างในบทนี้ใช้ first_order_value เป็น target (ไม่ stratify เพราะไม่ใช่คลาส) และ feature ชุดเดิมจากบทที่แล้ว

metric ที่ใช้วัด

metric ความหมาย
MAE (mean_absolute_error) ค่าคลาดเคลื่อนเฉลี่ย เป็นหน่วยเดียวกับ target (บาท) อ่านง่ายที่สุด
RMSE (mean_squared_error(...) ** 0.5) เหมือน MAE แต่ลงโทษความผิดพลาดใหญ่หนักกว่า
R² (r2_score) สัดส่วนความแปรปรวนที่โมเดลอธิบายได้ (0 = ไม่ดีกว่าทายค่าเฉลี่ย, 1 = สมบูรณ์แบบ)

baseline ของ regression: ทายค่าเฉลี่ย

โมเดลที่ทายค่าเฉลี่ยของ target ในชุด train ทุกแถวคือ baseline (ได้ R² ≈ 0) — โมเดลจริงต้องมี MAE ต่ำกว่านี้ถึงจะมีประโยชน์

อ่านค่า coefficient

model.coef_ บอกว่าเมื่อ feature นั้นเพิ่มขึ้น 1 หน่วย โดย feature อื่นคงที่ ค่าทำนายเปลี่ยนไปเท่าไร ส่วน model.intercept_ คือค่าทำนายเมื่อทุก feature เป็น 0 coefficient อธิบาย ความสัมพันธ์ในข้อมูล ไม่ได้พิสูจน์ว่าเป็นเหตุเป็นผล (จำบทสหสัมพันธ์กับเหตุผลในสายสถิติ)

target ที่เบ้ขวา: ลอง log

มูลค่าออเดอร์เบ้ขวามาก (skew ≈ 3.3) การทำนาย np.log1p(y) แล้วแปลงกลับด้วย np.expm1 มักช่วยให้โมเดลเส้นตรงเข้ากับข้อมูลได้ดีขึ้น แต่ต้องระวังว่า R² ที่ได้อยู่บนสเกล log ไม่ใช่สเกลบาท จึงเทียบกับ R² เดิมตรงๆ ไม่ได้

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

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

เทียบโมเดลกับ baseline ด้วย MAE

ทำนายมูลค่าออเดอร์แรกของลูกค้า แล้ววัดว่าดีกว่าทายค่าเฉลี่ยแค่ไหน

  1. baseline: ทายค่าเฉลี่ยของชุด train ทุกแถว แล้ววัด MAE บนชุดทดสอบ

    Python

อ่านค่า coefficient

feature ไหนมีผลต่อมูลค่าออเดอร์แรกมากที่สุดตามโมเดล

  1. เรียง coefficient ตามขนาด (ค่าสัมบูรณ์) — first_has_electronics (มีสินค้า Electronics ในออเดอร์) มีผลมากที่สุด

    Python

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

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

ยังไม่ได้ทำ

วัด MAE ของโมเดลบนชุดทดสอบ เก็บไว้ในตัวแปร model_mae เติม ___ ให้ครบ

แบบฝึกท้ายบท

บทนี้จะนับว่าเสร็จเมื่อผ่านข้อพื้นฐานและประยุกต์ครบ ข้อท้าทายได้ดาวเพิ่ม

🟢 พื้นฐาน

🟢 พื้นฐานยังไม่ได้ทำ

MAE ของ baseline (ทายค่าเฉลี่ยของ y_train ทุกแถว) บนชุดทดสอบ ปัด 2 ตำแหน่ง เก็บไว้ในตัวแปร baseline_mae

🟢 พื้นฐานยังไม่ได้ทำ

MAE ของ LinearRegression บนชุดทดสอบ ปัด 2 ตำแหน่ง เก็บไว้ในตัวแปร model_mae

🟢 พื้นฐานยังไม่ได้ทำ

RMSE ของโมเดลบนชุดทดสอบ ปัด 2 ตำแหน่ง เก็บไว้ในตัวแปร rmse

🟢 พื้นฐานยังไม่ได้ทำ

R² ของโมเดลบนชุดทดสอบ ปัด 4 ตำแหน่ง เก็บไว้ในตัวแปร r2

🟡 ประยุกต์

🟡 ประยุกต์ยังไม่ได้ทำ

intercept ของโมเดล ปัด 2 ตำแหน่ง เก็บไว้ในตัวแปร intercept

🟡 ประยุกต์ยังไม่ได้ทำ

coefficient ของ feature first_n_items (ปัด 1 ตำแหน่ง) เก็บไว้ในตัวแปร coef_n_items

🟡 ประยุกต์ยังไม่ได้ทำ

มูลค่าที่โมเดลทำนายสำหรับลูกค้าแถวแรกของชุดทดสอบ ปัด 2 ตำแหน่ง เก็บไว้ในตัวแปร first_pred

🔴 ท้าทาย

🔴 ท้าทายยังไม่ได้ทำ

โมเดลลด MAE จาก baseline กี่เปอร์เซ็นต์ (baseline_mae − model_mae) / baseline_mae × 100 ปัด 1 ตำแหน่ง เก็บไว้ในตัวแปร improvement_pct

🔴 ท้าทายยังไม่ได้ทำ

ลองเทรนบน log1p ของ target (np.log1p(y_train)) แล้ววัด R² บนสเกล log (เทียบกับ np.log1p(y_test)) และ MAE ที่แปลงกลับเป็นบาทด้วย np.expm1 (ปัดทั้งคู่: r2_log 4 ตำแหน่ง, mae_back 2 ตำแหน่ง) เก็บไว้ในตัวแปร r2_log, mae_back

Quiz

1. MAE บอกอะไร
2. โมเดลที่ทายค่าเฉลี่ยของ y_train ทุกแถว ควรได้ R² ประมาณเท่าไรบนชุดทดสอบ
3. ทำไม RMSE มักมากกว่าหรือเท่ากับ MAE เสมอ
4. ข้อไหนตีความ coefficient ของ linear regression ได้ถูกต้อง

สรุป

  • regression ทำนายตัวเลข: เทียบ MAE/RMSE/R² กับ baseline ที่ทายค่าเฉลี่ยเสมอ
  • ในข้อมูลนี้ LinearRegression ลด MAE ลงมากจาก baseline แต่ R² ยังแค่ ~0.30 — ทำนายมูลค่าออเดอร์แรกได้แค่พอสมควร
  • coefficient อธิบายความสัมพันธ์ ไม่ใช่เหตุและผล และ R² บนสเกล log เทียบกับสเกลเดิมตรงๆ ไม่ได้

คำถามสัมภาษณ์

อธิบายผลของโมเดล regression ให้ผู้บริหารที่ไม่รู้ ML ฟัง (ใช้ MAE และ R² )

ใช้ MAE เล่าเป็นหน่วยที่คนเข้าใจ: "โมเดลทำนายมูลค่าออเดอร์แรกคลาดเคลื่อนเฉลี่ย ~3,800 บาท ดีกว่าการทายค่าเฉลี่ยที่คลาดเคลื่อน ~5,000 บาท" แล้วใช้ R² เสริมว่าอธิบายความผันผวนของมูลค่าได้ราว 30% ที่เหลือเป็นปัจจัยที่ยังไม่มีในข้อมูล จากนั้นบอกข้อจำกัดชัดเจนว่าโมเดลยังไม่แม่นพอจะใช้ตัดสินใจรายบุคคล

ทำไมบางครั้งควรทำนาย log ของ target แทนค่าตรงๆ

เมื่อ target เบ้ขวามาก (ค่าสูงมากไม่กี่ตัวดึงเส้นถดถอย) การแปลง log ทำให้การกระจายสมมาตรขึ้น โมเดลเส้นตรงเข้ากับข้อมูลได้ดีขึ้น แต่ต้องแปลงคำทำนายกลับก่อนรายงาน และระวังว่า metric บนสเกล log ไม่เท่ากับสเกลเดิม จึงควรเทียบผลบนสเกลบาทเสมอ