01Overall Concept
ไอเดียหลัก — Lasso Regression เป็น Linear Regression ที่มีงบจำกัดสำหรับน้ำหนักของตัวแปร เมื่อมีตัวแปรมาก โมเดลจะเลือกเก็บเฉพาะตัวที่ช่วยจริง และอาจลดน้ำหนักของตัวที่ไม่จำเป็นให้เหลือศูนย์ จึงช่วยทำนายและคัดตัวแปรไปพร้อมกัน
ลองนึกภาพว่า — ลองนึกว่าต้องจัดกระเป๋าไปทัศนศึกษาแต่ใส่ของได้จำกัด เราจะเลือกของที่จำเป็นที่สุด ส่วนของที่แทบไม่ได้ใช้จะถูกวางไว้ที่บ้าน
ตัวอย่างการนำไปใช้ — คัดคำสำคัญจากข้อความ เลือกปัจจัยที่เกี่ยวกับยอดขาย หรือทำโมเดลที่อ่านง่ายขึ้นจากตารางที่มีคอลัมน์จำนวนมาก
02อธิบายภาษาคนเข้าใจง่ายๆ
Lasso คล้าย Ridge แต่บุคลิกต่างกันพอสมควร
Ridge บอกว่า
ทุกคนอยู่ต่อได้ แต่ลดเสียงลงหน่อย
ส่วน Lasso บอกว่า
คนไหนไม่มีประโยชน์จริงๆ ออกจากห้องประชุมไปได้เลย
สมมติเรามีตัวแปร 100 ตัวเพื่อทำนายยอดขาย แต่จริงๆ แล้วมีเพียง 10–15 ตัวที่สำคัญ เช่น ราคา โปรโมชัน จำนวนลูกค้าเดิม และฤดูกาล
Lasso สามารถลดน้ำหนักของตัวแปรบางตัวจนกลายเป็น ศูนย์ ซึ่งในทางปฏิบัติเท่ากับโมเดลไม่ใช้ตัวแปรนั้นแล้ว
ดังนั้น Lasso มีประโยชน์สองอย่างพร้อมกัน คือช่วยทำนาย และช่วยเราหาว่า อะไรสำคัญ
สมมติเราใส่ข้อมูลพฤติกรรมลูกค้า 80 อย่างเข้าไป แล้ว Lasso เหลือจริงๆ แค่ 12 ตัว นั่นช่วยให้เราเห็นภาพว่าอะไรเป็นปัจจัยหลักโดยไม่ต้องไล่ดูเองทั้งหมด
แต่ก็ต้องระวังว่า ถ้ามีตัวแปรหลายตัวที่คล้ายกันมาก เช่น รายได้ต่อเดือนกับรายได้ต่อปี Lasso อาจเลือกเก็บตัวหนึ่งแล้วโยนอีกตัวทิ้ง แม้ว่าจริงๆ แล้วทั้งสองตัวก็มีความหมาย
ภาพจำ: ประชุม 100 คน แล้ว Lasso บอกว่า “เอาเฉพาะคนที่จำเป็นจริงๆ อยู่ต่อ”
03How it works
ค่อยๆ ทำไปด้วยกัน ตั้งแต่ข้อมูลแถวแรกจนถึงการตรวจคำตอบ
ให้โมเดลคัดปัจจัยจากตารางยอดขาย
เตรียม X เป็นราคา ส่วนลด จำนวนลูกค้าเดิม และตัวแปรอื่นที่รู้ก่อนเริ่มขาย ส่วน y คือยอดขายจริง แบ่งข้อมูลก่อน หากเป็นรายเดือนให้เก็บเดือนหลังไว้ทดสอบ จากนั้นแปลงหมวดหมู่และใช้ StandardScaler ใน Pipeline เพื่อให้เปรียบเทียบน้ำหนักของทุกคอลัมน์ได้เหมาะสม
คิดค่าปรับแบบที่ตัดคนออกได้
Lasso ยังทำนายด้วยผลรวมน้ำหนักคูณ feature แต่เพิ่มค่าปรับตามผลรวมค่าสัมบูรณ์ของน้ำหนัก ใน sklearn เป้าหมายคือผลรวม error² หารด้วย 2n แล้วบวก alpha × ผลรวม |w| เมื่อประโยชน์ของคอลัมน์หนึ่งไม่คุ้มค่าปรับ น้ำหนักอาจถูกดันเป็นศูนย์ จึงหายออกจากสูตรทำนายโดยปริยาย
เริ่มฝึกด้วยปุ่มที่ควบคุมการคัด
ใช้ make_pipeline(StandardScaler(), Lasso(alpha=0.1, max_iter=10000)) แล้ว fit(X_train, y_train) ค่า alpha นี้เป็นเพียงจุดเริ่ม ลองค่าที่เล็กและใหญ่กว่านี้หลายระดับ ยิ่ง alpha สูงโดยทั่วไปยิ่งเหลือน้ำหนักไม่เป็นศูนย์น้อยลง ส่วน max_iter คือจำนวนรอบที่อนุญาตให้หาคำตอบ และ tol คือเกณฑ์ความละเอียดในการหยุด
เปิดดูว่าใครได้อยู่ต่อ
หลังฝึกดู coef_ ของ Lasso ใน Pipeline แล้วจับคู่กับชื่อคอลัมน์หลังแปลงข้อมูล ลองนับค่าน้ำหนักที่ไม่เป็นศูนย์พร้อมเรียก predict(X_test) ถ้าเพิ่ม alpha แล้วเหลือจาก 80 ตัวเป็น 12 ตัวแต่ยังทายได้ดีพอ เราอาจได้สูตรที่ดูแลง่ายขึ้น ถ้าเหลือศูนย์ทุกตัว แปลว่าโมเดลแทบตอบด้วยค่าคงที่
เลือกจากผลทดสอบ ไม่ใช่จำนวนที่ตัดได้
เลือก alpha ด้วย cross-validation ในชุดฝึก แล้วรายงาน MAE หรือ RMSE บนชุดทดสอบ หากมีคำเตือนว่าคำนวณยังไม่ลู่เข้า ให้ตรวจสเกลและเพิ่ม max_iter ตัวแปรที่ถูกตัดไม่ได้แปลว่าไม่มีประโยชน์ในโลกจริงเสมอ โดยเฉพาะเมื่อหลายคอลัมน์ซ้ำความหมายกัน ลอง Elastic Net หากอยากให้กลุ่มตัวแปรเหล่านี้อยู่ร่วมกันได้มากขึ้น
ข้อมูล พารามิเตอร์ และภาพรวมการคำนวณ
alphamax_itertolข้อมูลที่รับเข้ามา
รับ X เป็นตารางตัวเลขและ y เป็นค่าต่อเนื่อง มักใช้กับข้อมูลที่มี feature จำนวนมาก หลังปรับสเกลแล้ว
X = [ราคา, ส่วนลด, ลูกค้าเดิม, …] · y = ยอดขายพารามิเตอร์ที่ใช้
- alpha
- แรงค่าปรับ L1 ลองหลายระดับ: ค่าสูงมักทำให้น้ำหนักเป็นศูนย์มากขึ้น
- max_iter
- จำนวนรอบสูงสุดที่อนุญาตให้ปรับน้ำหนัก
- tol
- ความเปลี่ยนแปลงต่ำสุดที่ถือว่าคำตอบนิ่งแล้ว
ผลลัพธ์ที่ได้
ได้ค่าทำนายตัวเลขและชุด coefficients ซึ่งบางตำแหน่งเป็น 0 จึงใช้ดู feature ที่ถูกเลือกได้
ดู coef_ ที่ไม่เป็นศูนย์ควบคู่กับ RMSE บนชุดทดสอบคำนวณทีละขั้น
- 01
สร้างค่าทำนายแบบเส้นตรงจากน้ำหนักของ feature ทุกตัว
- 02
ใน sklearn ลดผลรวม error² / (2n) + alpha × ผลรวม |w| โดย n คือจำนวนแถวฝึก
- 03
ปรับทีละน้ำหนักจนค่ารวมต่ำที่สุด น้ำหนักที่ไม่คุ้มมักถูกดันให้เป็นศูนย์
ควรรู้อีกนิด — เมื่อ feature สัมพันธ์กันมาก Lasso อาจเลือกเพียงตัวใดตัวหนึ่งอย่างไม่เสถียร และ alpha สูงอาจตัดสัญญาณจริงทิ้ง
04Make it yours
# ติดตั้ง: pip install numpy scikit-learn matplotlibfrom sklearn.linear_model import Lassofrom sklearn.metrics import mean_squared_error import numpy as npfrom sklearn.model_selection import train_test_split rng = np.random.default_rng(42)X = np.linspace(-1, 1, 60).reshape(-1, 1)y = 0.1 + 0.55*X[:, 0] + 0.55*np.sin(3.4*X[:, 0])y += rng.normal(0, 0.14, len(y))X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42) model = Lasso(alpha=0.15)model.fit(X_train, y_train)pred = model.predict(X_test)print("RMSE:", mean_squared_error(y_test, pred) ** 0.5)โค้ดเปลี่ยนตามค่าที่เลือกใน Playground · แต่ละภาษาใช้ข้อมูลตัวอย่างตามที่ระบุในโค้ด
05Learn by playing
ปรับ alpha (L1) แล้วสังเกตรูปแบบคำทำนายและตัวชี้วัดที่คำนวณใหม่ทันที
Playground เป็น implementation เพื่อการเรียนรู้ที่คำนวณในเบราว์เซอร์ ส่วนโค้ด Python ใช้ scikit-learn จึงอาจให้ค่าต่างกันเล็กน้อยจากรายละเอียดการ optimize และค่าเริ่มต้นของไลบรารี ผลนี้ไม่ใช่ benchmark บนข้อมูลจริง