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
ทำนายมูลค่าออเดอร์แรกของลูกค้า แล้ววัดว่าดีกว่าทายค่าเฉลี่ยแค่ไหน
baseline: ทายค่าเฉลี่ยของชุด train ทุกแถว แล้ววัด MAE บนชุดทดสอบ
อ่านค่า coefficient
feature ไหนมีผลต่อมูลค่าออเดอร์แรกมากที่สุดตามโมเดล
เรียง coefficient ตามขนาด (ค่าสัมบูรณ์) — first_has_electronics (มีสินค้า Electronics ในออเดอร์) มีผลมากที่สุด
เติมช่องว่าง
แทน ___ ด้วยโค้ดที่ถูกต้อง แล้วกดตรวจคำตอบ
วัด 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
สรุป
- 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 ไม่เท่ากับสเกลเดิม จึงควรเทียบผลบนสเกลบาทเสมอ