01Overall Concept
ไอเดียหลัก — Linear Regression คือวิธีให้คอมพิวเตอร์มองหาความสัมพันธ์แบบเส้นตรงจากตัวอย่างที่เคยเห็น เช่น ยิ่งอ่านหนังสือนาน คะแนนอาจยิ่งสูงขึ้น คอมพิวเตอร์จะลากเส้นหนึ่งเส้นให้ผ่านใกล้จุดข้อมูลมากที่สุด แล้วใช้เส้นนั้นช่วยเดาค่าของตัวอย่างใหม่
ลองนึกภาพว่า — ลองนึกภาพว่าเราติดสติกเกอร์หลายจุดบนกระดาษ แล้ววางไม้บรรทัดให้ผ่านกลางกลุ่มสติกเกอร์ แม้ไม้บรรทัดจะไม่ทับทุกจุด แต่เราพยายามวางให้ระยะห่างรวมจากทุกจุดสั้นที่สุด
ตัวอย่างการนำไปใช้ — ประมาณยอดขายไอศกรีมจากอุณหภูมิ เดินทางไกลขึ้นจะใช้เวลากี่นาที หรือสร้างราคาบ้านคร่าว ๆ จากขนาดพื้นที่
02อธิบายภาษาคนเข้าใจง่ายๆ
นี่คือหนึ่งในเทคนิคที่ตรงไปตรงมาที่สุด สมมติเรามีข้อมูลว่าแต่ละเดือนบริษัทใช้เงินโฆษณาเท่าไร และขายของได้เท่าไร เราเอาข้อมูลเหล่านั้นมาเขียนเป็นจุดบนกราฟ แล้ว Linear Regression จะพยายามลาก เส้นตรงเส้นหนึ่งที่ผ่านกลางข้อมูลให้ดีที่สุด
เช่นจากข้อมูลที่ผ่านมา มันอาจเรียนรู้ว่า
ทุกครั้งที่เพิ่มงบโฆษณา 10,000 บาท ยอดขายจะเพิ่มประมาณ 25,000 บาท
ดังนั้น ถ้าเดือนหน้าเราบอกว่าจะใช้โฆษณา 100,000 บาท มันก็เอาเส้นที่เรียนรู้ไว้มาประมาณยอดขายให้เรา
แต่จริงๆ แล้ว Linear Regression ไม่ได้ใช้ได้แค่ตัวแปรเดียว สมมติเราจะทำนาย ราคาบ้าน เราอาจใส่พื้นที่บ้าน จำนวนห้อง อายุบ้าน ระยะทางจากรถไฟฟ้า และจำนวนที่จอดรถเข้าไปพร้อมกันก็ได้
โมเดลจะพยายามเรียนรู้ว่าแต่ละอย่างส่งผลต่อราคามากน้อยแค่ไหน เช่น พื้นที่เพิ่ม 1 ตร.ม. ทำให้ราคาขึ้นประมาณเท่าไร หรืออยู่ห่าง BTS อีก 1 กม. ราคาลดลงประมาณเท่าไร
ข้อดีใหญ่ของมันคือ อธิบายง่ายมาก เราสามารถบอกคนอื่นได้ค่อนข้างตรงๆ ว่าปัจจัยไหนส่งผลอย่างไร แต่ข้อจำกัดก็คือมันเชื่อว่าความสัมพันธ์ค่อนข้างเป็นเส้นตรง ถ้าโลกจริงมีความซับซ้อนหรือโค้งมากๆ มันอาจตามไม่ทัน
ภาพจำ: เอาจุดทั้งหมดมา แล้วลากไม้บรรทัดผ่านตรงกลางให้ดีที่สุด
03How it works
ค่อยๆ ทำไปด้วยกัน ตั้งแต่ข้อมูลแถวแรกจนถึงการตรวจคำตอบ
เริ่มจากตารางงบโฆษณากับยอดขาย
ลองนึกว่าเรามีข้อมูลรายเดือน แต่ละแถวมีงบโฆษณาและยอดขายจริง แยกงบเป็น X และยอดขายเป็น y เช่น X = [[1], [2], [3]] และ y = [4, 6, 8] โดยทุกค่าใช้หน่วยหมื่นบาทเหมือนกัน แม้มีตัวแปรเดียว X ก็ยังเป็นตารางสองมิติ ถ้ามีราคาและจำนวนสาขาเพิ่ม ให้เพิ่มเป็นคอลัมน์ใน X โดย y ยังมีหนึ่งค่าต่อแถว
กันข้อสอบไว้ก่อนเริ่มเรียน
แบ่งข้อมูลเก่าไว้ฝึก และเก็บช่วงเวลาล่าสุดไว้ทดสอบการทำนายเดือนถัดไป ถ้าเป็นข้อมูลคนละบ้านที่อิสระกัน จึงค่อยใช้ train_test_split เช่น 80%/20% เติมค่าที่ขาดและแปลงชื่อหมวดหมู่เป็นตัวเลขจากชุดฝึกเท่านั้น อย่าใส่ยอดขายหรือข้อมูลที่รู้หลังจบเดือนเป็น feature เพราะวันทำนายจริงเรายังไม่มีมัน
เส้นตรงเรียนรู้จากความผิดพลาดอย่างไร
โมเดลใช้สูตรยอดขาย = b + w × งบโฆษณา แล้วหาค่า w กับ b ที่ทำให้ผลรวมความผิดพลาดยกกำลังสองต่ำที่สุด ข้อมูลสมมติสามแถวข้างต้นลงตัวกับ b = 2 และ w = 2 จึงได้ 2 + 2 × งบ ถ้ามีหลายคอลัมน์ จะมีน้ำหนักของแต่ละคอลัมน์เพิ่มเข้ามา ตัวเลขเหล่านี้เป็นสิ่งที่ fit เรียนรู้ให้ ไม่ต้องเดาน้ำหนักเอง
ลงมือฝึกและลองคำถามใหม่
เริ่มด้วย LinearRegression(fit_intercept=True) แล้วเรียก model.fit(X_train, y_train) จากนั้น model.predict([[4]]) สำหรับตัวอย่างสมมติจะได้ 10 หมื่นบาท เปิดดู coef_ และ intercept_ เพื่ออ่านสูตรได้ ส่วน positive=True ใช้เมื่อมีเหตุผลว่าทุกน้ำหนักต้องไม่ติดลบ และ train_size เป็นค่าตอนแบ่งข้อมูล ไม่ใช่พารามิเตอร์ของ LinearRegression
รู้ได้อย่างไรว่าใช้ได้
นำ predict(X_test) ไปเทียบ y_test ดู MAE ซึ่งบอกว่าพลาดเฉลี่ยกี่บาท หรือ RMSE ที่ให้น้ำหนักกับการพลาดหนักมากขึ้น เทียบกับการทายค่าเฉลี่ยชุดฝึกทุกครั้งด้วย ถ้ากราฟความผิดพลาดยังโค้งเป็นรูปชัดเจน ลองเพิ่ม feature หรือเปรียบเทียบ Polynomial Regression ทั้งนี้น้ำหนักที่สัมพันธ์กับยอดขายยังไม่ได้พิสูจน์ว่าโฆษณาเป็นสาเหตุโดยตรง
ข้อมูล พารามิเตอร์ และภาพรวมการคำนวณ
fit_interceptpositivetrain_sizeข้อมูลที่รับเข้ามา
รับ X เป็นตารางตัวเลข ขนาดจำนวนตัวอย่าง × จำนวน feature และรับ y เป็นตัวเลขคำตอบหนึ่งค่าต่อหนึ่งตัวอย่าง ทุกแถวของ X ต้องตรงกับตำแหน่งเดียวกันใน y
X = [[1], [2], [3]] งบโฆษณา · y = [4, 6, 8] ยอดขาย (หน่วยหมื่นบาท)พารามิเตอร์ที่ใช้
- fit_intercept
- ให้โมเดลหาจุดเริ่มต้นของเส้นหรือบังคับให้ผ่านศูนย์
- positive
- บังคับให้น้ำหนักทุกตัวไม่ติดลบเมื่อโจทย์ต้องการ
- train_size
- สัดส่วนหรือจำนวนแถวตอนแบ่งข้อมูลฝึก ไม่ใช่ argument ของ LinearRegression
ผลลัพธ์ที่ได้
ได้ coefficients (w), intercept (b) และ predict(X_new) เป็นตัวเลขต่อเนื่องหนึ่งค่าต่อแถว
ตัวอย่างสมมติ: งบ 4 → 2 + 2 × 4 = ยอดขาย 10 หมื่นบาทคำนวณทีละขั้น
- 01
สร้างคำทำนายจาก ŷ = b + w₁x₁ + w₂x₂ + … โดย w คือน้ำหนักและ b คือจุดตัดแกน
- 02
หาความต่าง y − ŷ ของทุกแถว แล้วยกกำลังสองเพื่อให้ความผิดพลาดก้อนใหญ่มีผลมากขึ้น
- 03
เลือก w และ b ที่ทำให้ค่าเฉลี่ยของความผิดพลาดกำลังสองต่ำที่สุด
ควรรู้อีกนิด — ความสัมพันธ์ที่โค้งหรือมี outlier มากอาจทำให้เส้นตรงอธิบายข้อมูลได้ไม่ดี และค่าสัมประสิทธิ์ไม่ควรถูกตีความเป็นเหตุและผลโดยอัตโนมัติ
04Make it yours
# ติดตั้ง: pip install numpy scikit-learn matplotlibfrom sklearn.linear_model import LinearRegressionfrom 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, train_size=30, random_state=42) model = LinearRegression() # เพิ่มข้อมูลฝึกเพื่อให้ค่าประมาณนิ่งขึ้น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
ปรับ จำนวนข้อมูลฝึก แล้วสังเกตรูปแบบคำทำนายและตัวชี้วัดที่คำนวณใหม่ทันที
Playground เป็น implementation เพื่อการเรียนรู้ที่คำนวณในเบราว์เซอร์ ส่วนโค้ด Python ใช้ scikit-learn จึงอาจให้ค่าต่างกันเล็กน้อยจากรายละเอียดการ optimize และค่าเริ่มต้นของไลบรารี ผลนี้ไม่ใช่ benchmark บนข้อมูลจริง