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

Linear Regression

ลากเส้นตรงให้ใกล้ข้อมูลมากที่สุด

LEARNING LEVEL1
พื้นฐานควรรู้มาก่อน · สมการเส้นตรง ค่าเฉลี่ย และ error
ลองใน Playground

01Overall Concept

OVERALL CONCEPT

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

ลองนึกภาพว่า — ลองนึกภาพว่าเราติดสติกเกอร์หลายจุดบนกระดาษ แล้ววางไม้บรรทัดให้ผ่านกลางกลุ่มสติกเกอร์ แม้ไม้บรรทัดจะไม่ทับทุกจุด แต่เราพยายามวางให้ระยะห่างรวมจากทุกจุดสั้นที่สุด

ตัวอย่างการนำไปใช้ — ประมาณยอดขายไอศกรีมจากอุณหภูมิ เดินทางไกลขึ้นจะใช้เวลากี่นาที หรือสร้างราคาบ้านคร่าว ๆ จากขนาดพื้นที่

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

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

นี่คือหนึ่งในเทคนิคที่ตรงไปตรงมาที่สุด สมมติเรามีข้อมูลว่าแต่ละเดือนบริษัทใช้เงินโฆษณาเท่าไร และขายของได้เท่าไร เราเอาข้อมูลเหล่านั้นมาเขียนเป็นจุดบนกราฟ แล้ว Linear Regression จะพยายามลาก เส้นตรงเส้นหนึ่งที่ผ่านกลางข้อมูลให้ดีที่สุด

เช่นจากข้อมูลที่ผ่านมา มันอาจเรียนรู้ว่า

ทุกครั้งที่เพิ่มงบโฆษณา 10,000 บาท ยอดขายจะเพิ่มประมาณ 25,000 บาท

ดังนั้น ถ้าเดือนหน้าเราบอกว่าจะใช้โฆษณา 100,000 บาท มันก็เอาเส้นที่เรียนรู้ไว้มาประมาณยอดขายให้เรา

แต่จริงๆ แล้ว Linear Regression ไม่ได้ใช้ได้แค่ตัวแปรเดียว สมมติเราจะทำนาย ราคาบ้าน เราอาจใส่พื้นที่บ้าน จำนวนห้อง อายุบ้าน ระยะทางจากรถไฟฟ้า และจำนวนที่จอดรถเข้าไปพร้อมกันก็ได้

โมเดลจะพยายามเรียนรู้ว่าแต่ละอย่างส่งผลต่อราคามากน้อยแค่ไหน เช่น พื้นที่เพิ่ม 1 ตร.ม. ทำให้ราคาขึ้นประมาณเท่าไร หรืออยู่ห่าง BTS อีก 1 กม. ราคาลดลงประมาณเท่าไร

ข้อดีใหญ่ของมันคือ อธิบายง่ายมาก เราสามารถบอกคนอื่นได้ค่อนข้างตรงๆ ว่าปัจจัยไหนส่งผลอย่างไร แต่ข้อจำกัดก็คือมันเชื่อว่าความสัมพันธ์ค่อนข้างเป็นเส้นตรง ถ้าโลกจริงมีความซับซ้อนหรือโค้งมากๆ มันอาจตามไม่ทัน

ภาพจำ: เอาจุดทั้งหมดมา แล้วลากไม้บรรทัดผ่านตรงกลางให้ดีที่สุด

03How it works

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

  1. เริ่มจากตารางงบโฆษณากับยอดขาย

    ลองนึกว่าเรามีข้อมูลรายเดือน แต่ละแถวมีงบโฆษณาและยอดขายจริง แยกงบเป็น X และยอดขายเป็น y เช่น X = [[1], [2], [3]] และ y = [4, 6, 8] โดยทุกค่าใช้หน่วยหมื่นบาทเหมือนกัน แม้มีตัวแปรเดียว X ก็ยังเป็นตารางสองมิติ ถ้ามีราคาและจำนวนสาขาเพิ่ม ให้เพิ่มเป็นคอลัมน์ใน X โดย y ยังมีหนึ่งค่าต่อแถว

  2. กันข้อสอบไว้ก่อนเริ่มเรียน

    แบ่งข้อมูลเก่าไว้ฝึก และเก็บช่วงเวลาล่าสุดไว้ทดสอบการทำนายเดือนถัดไป ถ้าเป็นข้อมูลคนละบ้านที่อิสระกัน จึงค่อยใช้ train_test_split เช่น 80%/20% เติมค่าที่ขาดและแปลงชื่อหมวดหมู่เป็นตัวเลขจากชุดฝึกเท่านั้น อย่าใส่ยอดขายหรือข้อมูลที่รู้หลังจบเดือนเป็น feature เพราะวันทำนายจริงเรายังไม่มีมัน

  3. เส้นตรงเรียนรู้จากความผิดพลาดอย่างไร

    โมเดลใช้สูตรยอดขาย = b + w × งบโฆษณา แล้วหาค่า w กับ b ที่ทำให้ผลรวมความผิดพลาดยกกำลังสองต่ำที่สุด ข้อมูลสมมติสามแถวข้างต้นลงตัวกับ b = 2 และ w = 2 จึงได้ 2 + 2 × งบ ถ้ามีหลายคอลัมน์ จะมีน้ำหนักของแต่ละคอลัมน์เพิ่มเข้ามา ตัวเลขเหล่านี้เป็นสิ่งที่ fit เรียนรู้ให้ ไม่ต้องเดาน้ำหนักเอง

  4. ลงมือฝึกและลองคำถามใหม่

    เริ่มด้วย LinearRegression(fit_intercept=True) แล้วเรียก model.fit(X_train, y_train) จากนั้น model.predict([[4]]) สำหรับตัวอย่างสมมติจะได้ 10 หมื่นบาท เปิดดู coef_ และ intercept_ เพื่ออ่านสูตรได้ ส่วน positive=True ใช้เมื่อมีเหตุผลว่าทุกน้ำหนักต้องไม่ติดลบ และ train_size เป็นค่าตอนแบ่งข้อมูล ไม่ใช่พารามิเตอร์ของ LinearRegression

  5. รู้ได้อย่างไรว่าใช้ได้

    นำ predict(X_test) ไปเทียบ y_test ดู MAE ซึ่งบอกว่าพลาดเฉลี่ยกี่บาท หรือ RMSE ที่ให้น้ำหนักกับการพลาดหนักมากขึ้น เทียบกับการทายค่าเฉลี่ยชุดฝึกทุกครั้งด้วย ถ้ากราฟความผิดพลาดยังโค้งเป็นรูปชัดเจน ลองเพิ่ม feature หรือเปรียบเทียบ Polynomial Regression ทั้งนี้น้ำหนักที่สัมพันธ์กับยอดขายยังไม่ได้พิสูจน์ว่าโฆษณาเป็นสาเหตุโดยตรง

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

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

DATA INX · featuresy · targetX = [[1], [2], [3]] งบโฆษณา · y = [4, 6, 8] ยอดขาย (หน่วยหมื่นบาท)
CALCULATELinear Regression
fit_interceptpositivetrain_size
RESULTnumeric predictionตัวอย่างสมมติ: งบ 4 → 2 + 2 × 4 = ยอดขาย 10 หมื่นบาท
เส้นทางของข้อมูล: จากค่าที่รับเข้า ผ่านการคำนวณด้วยพารามิเตอร์ ไปเป็นผลลัพธ์
INPUT

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

รับ X เป็นตารางตัวเลข ขนาดจำนวนตัวอย่าง × จำนวน feature และรับ y เป็นตัวเลขคำตอบหนึ่งค่าต่อหนึ่งตัวอย่าง ทุกแถวของ X ต้องตรงกับตำแหน่งเดียวกันใน y

X = [[1], [2], [3]] งบโฆษณา · y = [4, 6, 8] ยอดขาย (หน่วยหมื่นบาท)
PARAMETERS

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

fit_intercept
ให้โมเดลหาจุดเริ่มต้นของเส้นหรือบังคับให้ผ่านศูนย์
positive
บังคับให้น้ำหนักทุกตัวไม่ติดลบเมื่อโจทย์ต้องการ
train_size
สัดส่วนหรือจำนวนแถวตอนแบ่งข้อมูลฝึก ไม่ใช่ argument ของ LinearRegression
OUTPUT

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

ได้ coefficients (w), intercept (b) และ predict(X_new) เป็นตัวเลขต่อเนื่องหนึ่งค่าต่อแถว

ตัวอย่างสมมติ: งบ 4 → 2 + 2 × 4 = ยอดขาย 10 หมื่นบาท
CALCULATION

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

  1. 01

    สร้างคำทำนายจาก ŷ = b + w₁x₁ + w₂x₂ + … โดย w คือน้ำหนักและ b คือจุดตัดแกน

  2. 02

    หาความต่าง y − ŷ ของทุกแถว แล้วยกกำลังสองเพื่อให้ความผิดพลาดก้อนใหญ่มีผลมากขึ้น

  3. 03

    เลือก w และ b ที่ทำให้ค่าเฉลี่ยของความผิดพลาดกำลังสองต่ำที่สุด

ควรรู้อีกนิด — ความสัมพันธ์ที่โค้งหรือมี outlier มากอาจทำให้เส้นตรงอธิบายข้อมูลได้ไม่ดี และค่าสัมประสิทธิ์ไม่ควรถูกตีความเป็นเหตุและผลโดยอัตโนมัติ

04Make it yours

Python · scikit-learn
# ติดตั้ง: 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

ปรับ จำนวนข้อมูลฝึก แล้วสังเกตรูปแบบคำทำนายและตัวชี้วัดที่คำนวณใหม่ทันที

Sample dataset / Curved signal● คำนวณใหม่เมื่อปรับค่า
ข้อมูลมากขึ้นมักทำให้เส้นประมาณการมีเสถียรภาพขึ้น
ข้อมูลฝึกและผลการทำนายFeature xค่าจริง • / ค่าทำนาย —
RMSE0.329
ข้อมูลฝึก30 จุด
พารามิเตอร์ที่ลอง30

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