ml/ library Learn by doing
ALGORITHM 18 · PYTHON / JAVASCRIPT

Lasso Regression

บีบน้ำหนักบางตัวให้เป็นศูนย์

LEARNING LEVEL2
ต่อยอดโดยตรงควรรู้มาก่อน · Linear Regression และ L1 regularization
ลองใน Playground

01Overall Concept

OVERALL CONCEPT

ไอเดียหลัก — Lasso Regression เป็น Linear Regression ที่มีงบจำกัดสำหรับน้ำหนักของตัวแปร เมื่อมีตัวแปรมาก โมเดลจะเลือกเก็บเฉพาะตัวที่ช่วยจริง และอาจลดน้ำหนักของตัวที่ไม่จำเป็นให้เหลือศูนย์ จึงช่วยทำนายและคัดตัวแปรไปพร้อมกัน

ลองนึกภาพว่า — ลองนึกว่าต้องจัดกระเป๋าไปทัศนศึกษาแต่ใส่ของได้จำกัด เราจะเลือกของที่จำเป็นที่สุด ส่วนของที่แทบไม่ได้ใช้จะถูกวางไว้ที่บ้าน

ตัวอย่างการนำไปใช้ — คัดคำสำคัญจากข้อความ เลือกปัจจัยที่เกี่ยวกับยอดขาย หรือทำโมเดลที่อ่านง่ายขึ้นจากตารางที่มีคอลัมน์จำนวนมาก

02อธิบายภาษาคนเข้าใจง่ายๆ

เล่าแบบไม่ใช้ศัพท์ยาก

Lasso คล้าย Ridge แต่บุคลิกต่างกันพอสมควร

Ridge บอกว่า

ทุกคนอยู่ต่อได้ แต่ลดเสียงลงหน่อย

ส่วน Lasso บอกว่า

คนไหนไม่มีประโยชน์จริงๆ ออกจากห้องประชุมไปได้เลย

สมมติเรามีตัวแปร 100 ตัวเพื่อทำนายยอดขาย แต่จริงๆ แล้วมีเพียง 10–15 ตัวที่สำคัญ เช่น ราคา โปรโมชัน จำนวนลูกค้าเดิม และฤดูกาล

Lasso สามารถลดน้ำหนักของตัวแปรบางตัวจนกลายเป็น ศูนย์ ซึ่งในทางปฏิบัติเท่ากับโมเดลไม่ใช้ตัวแปรนั้นแล้ว

ดังนั้น Lasso มีประโยชน์สองอย่างพร้อมกัน คือช่วยทำนาย และช่วยเราหาว่า อะไรสำคัญ

สมมติเราใส่ข้อมูลพฤติกรรมลูกค้า 80 อย่างเข้าไป แล้ว Lasso เหลือจริงๆ แค่ 12 ตัว นั่นช่วยให้เราเห็นภาพว่าอะไรเป็นปัจจัยหลักโดยไม่ต้องไล่ดูเองทั้งหมด

แต่ก็ต้องระวังว่า ถ้ามีตัวแปรหลายตัวที่คล้ายกันมาก เช่น รายได้ต่อเดือนกับรายได้ต่อปี Lasso อาจเลือกเก็บตัวหนึ่งแล้วโยนอีกตัวทิ้ง แม้ว่าจริงๆ แล้วทั้งสองตัวก็มีความหมาย

ภาพจำ: ประชุม 100 คน แล้ว Lasso บอกว่า “เอาเฉพาะคนที่จำเป็นจริงๆ อยู่ต่อ”

03How it works

ค่อยๆ ทำไปด้วยกัน ตั้งแต่ข้อมูลแถวแรกจนถึงการตรวจคำตอบ

  1. ให้โมเดลคัดปัจจัยจากตารางยอดขาย

    เตรียม X เป็นราคา ส่วนลด จำนวนลูกค้าเดิม และตัวแปรอื่นที่รู้ก่อนเริ่มขาย ส่วน y คือยอดขายจริง แบ่งข้อมูลก่อน หากเป็นรายเดือนให้เก็บเดือนหลังไว้ทดสอบ จากนั้นแปลงหมวดหมู่และใช้ StandardScaler ใน Pipeline เพื่อให้เปรียบเทียบน้ำหนักของทุกคอลัมน์ได้เหมาะสม

  2. คิดค่าปรับแบบที่ตัดคนออกได้

    Lasso ยังทำนายด้วยผลรวมน้ำหนักคูณ feature แต่เพิ่มค่าปรับตามผลรวมค่าสัมบูรณ์ของน้ำหนัก ใน sklearn เป้าหมายคือผลรวม error² หารด้วย 2n แล้วบวก alpha × ผลรวม |w| เมื่อประโยชน์ของคอลัมน์หนึ่งไม่คุ้มค่าปรับ น้ำหนักอาจถูกดันเป็นศูนย์ จึงหายออกจากสูตรทำนายโดยปริยาย

  3. เริ่มฝึกด้วยปุ่มที่ควบคุมการคัด

    ใช้ make_pipeline(StandardScaler(), Lasso(alpha=0.1, max_iter=10000)) แล้ว fit(X_train, y_train) ค่า alpha นี้เป็นเพียงจุดเริ่ม ลองค่าที่เล็กและใหญ่กว่านี้หลายระดับ ยิ่ง alpha สูงโดยทั่วไปยิ่งเหลือน้ำหนักไม่เป็นศูนย์น้อยลง ส่วน max_iter คือจำนวนรอบที่อนุญาตให้หาคำตอบ และ tol คือเกณฑ์ความละเอียดในการหยุด

  4. เปิดดูว่าใครได้อยู่ต่อ

    หลังฝึกดู coef_ ของ Lasso ใน Pipeline แล้วจับคู่กับชื่อคอลัมน์หลังแปลงข้อมูล ลองนับค่าน้ำหนักที่ไม่เป็นศูนย์พร้อมเรียก predict(X_test) ถ้าเพิ่ม alpha แล้วเหลือจาก 80 ตัวเป็น 12 ตัวแต่ยังทายได้ดีพอ เราอาจได้สูตรที่ดูแลง่ายขึ้น ถ้าเหลือศูนย์ทุกตัว แปลว่าโมเดลแทบตอบด้วยค่าคงที่

  5. เลือกจากผลทดสอบ ไม่ใช่จำนวนที่ตัดได้

    เลือก alpha ด้วย cross-validation ในชุดฝึก แล้วรายงาน MAE หรือ RMSE บนชุดทดสอบ หากมีคำเตือนว่าคำนวณยังไม่ลู่เข้า ให้ตรวจสเกลและเพิ่ม max_iter ตัวแปรที่ถูกตัดไม่ได้แปลว่าไม่มีประโยชน์ในโลกจริงเสมอ โดยเฉพาะเมื่อหลายคอลัมน์ซ้ำความหมายกัน ลอง Elastic Net หากอยากให้กลุ่มตัวแปรเหล่านี้อยู่ร่วมกันได้มากขึ้น

เปิดตัวอย่างโค้ดเพื่อลองทำตาม →ตัวอย่างตัวเลขในเรื่องใช้ช่วยอธิบาย ส่วนโค้ดและ Playground ใช้ชุดข้อมูลสาธิตของแต่ละหน้าอ่านเอกสารอ้างอิงของเทคนิคนี้ ↗

ข้อมูล พารามิเตอร์ และภาพรวมการคำนวณ

DATA INX · featuresy · targetX = [ราคา, ส่วนลด, ลูกค้าเดิม, …] · y = ยอดขาย
CALCULATELasso Regression
alphamax_itertol
RESULTnumeric predictionดู coef_ ที่ไม่เป็นศูนย์ควบคู่กับ RMSE บนชุดทดสอบ
เส้นทางของข้อมูล: จากค่าที่รับเข้า ผ่านการคำนวณด้วยพารามิเตอร์ ไปเป็นผลลัพธ์
INPUT

ข้อมูลที่รับเข้ามา

รับ X เป็นตารางตัวเลขและ y เป็นค่าต่อเนื่อง มักใช้กับข้อมูลที่มี feature จำนวนมาก หลังปรับสเกลแล้ว

X = [ราคา, ส่วนลด, ลูกค้าเดิม, …] · y = ยอดขาย
PARAMETERS

พารามิเตอร์ที่ใช้

alpha
แรงค่าปรับ L1 ลองหลายระดับ: ค่าสูงมักทำให้น้ำหนักเป็นศูนย์มากขึ้น
max_iter
จำนวนรอบสูงสุดที่อนุญาตให้ปรับน้ำหนัก
tol
ความเปลี่ยนแปลงต่ำสุดที่ถือว่าคำตอบนิ่งแล้ว
OUTPUT

ผลลัพธ์ที่ได้

ได้ค่าทำนายตัวเลขและชุด coefficients ซึ่งบางตำแหน่งเป็น 0 จึงใช้ดู feature ที่ถูกเลือกได้

ดู coef_ ที่ไม่เป็นศูนย์ควบคู่กับ RMSE บนชุดทดสอบ
CALCULATION

คำนวณทีละขั้น

  1. 01

    สร้างค่าทำนายแบบเส้นตรงจากน้ำหนักของ feature ทุกตัว

  2. 02

    ใน sklearn ลดผลรวม error² / (2n) + alpha × ผลรวม |w| โดย n คือจำนวนแถวฝึก

  3. 03

    ปรับทีละน้ำหนักจนค่ารวมต่ำที่สุด น้ำหนักที่ไม่คุ้มมักถูกดันให้เป็นศูนย์

ควรรู้อีกนิด — เมื่อ feature สัมพันธ์กันมาก Lasso อาจเลือกเพียงตัวใดตัวหนึ่งอย่างไม่เสถียร และ alpha สูงอาจตัดสัญญาณจริงทิ้ง

04Make it yours

Python · scikit-learn
# ติดตั้ง: 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) แล้วสังเกตรูปแบบคำทำนายและตัวชี้วัดที่คำนวณใหม่ทันที

Sample dataset / Curved signal● คำนวณใหม่เมื่อปรับค่า
ค่าสูงขึ้นทำให้ coefficient เป็นศูนย์มากขึ้น
ข้อมูลฝึกและผลการทำนายFeature xค่าจริง • / ค่าทำนาย —
RMSE0.260
coefficient ที่ไม่เป็นศูนย์2 / 7
พารามิเตอร์ที่ลอง0.15

Playground เป็น implementation เพื่อการเรียนรู้ที่คำนวณในเบราว์เซอร์ ส่วนโค้ด Python ใช้ scikit-learn จึงอาจให้ค่าต่างกันเล็กน้อยจากรายละเอียดการ optimize และค่าเริ่มต้นของไลบรารี ผลนี้ไม่ใช่ benchmark บนข้อมูลจริง