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

Bayesian Regression

ทำนายพร้อมบอกความไม่แน่นอน

LEARNING LEVEL3
ผสานหลายแนวคิดควรรู้มาก่อน · Linear Regression, Naive Bayes และ Bayes theorem
ลองใน Playground

01Overall Concept

OVERALL CONCEPT

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

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

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

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

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

Bayesian Regression มีแนวคิดที่น่าสนใจมาก เพราะมันไม่ได้เริ่มจากคำว่า

“ฉันไม่รู้อะไรเลย”

แต่มันเริ่มจาก

“ก่อนเห็นข้อมูล ฉันมีความเชื่อบางอย่างอยู่แล้ว แล้วเมื่อเห็นข้อมูลใหม่ ฉันจะปรับความเชื่อนั้น”

ตัวอย่างง่ายๆ สมมติเราจะประมาณยอดขายของร้านใหม่

เรารู้จากร้านที่คล้ายกันว่า ปกติน่าจะขายประมาณ 100–150 ออเดอร์ต่อวัน นี่คือ ความเชื่อเดิม

เปิดร้านวันแรกขายได้ 180 วันที่สอง 160 วันที่สาม 200

Bayesian จะเอาข้อมูลใหม่นี้มาปรับความเชื่อเดิม แล้วอาจบอกว่า

ตอนนี้คิดว่ายอดเฉลี่ยน่าจะประมาณ 165 ออเดอร์ แต่ยังมีความไม่แน่นอนอยู่พอสมควร

ถ้าเราเก็บข้อมูลอีก 6 เดือน ความมั่นใจก็จะเพิ่มขึ้น และอิทธิพลของความเชื่อเดิมก็จะลดลง

จุดสำคัญคือ Bayesian ไม่ได้ให้เราแค่คำตอบว่า

165

แต่ให้ประมาณว่า

น่าจะอยู่แถว 165 และมีโอกาสสูงที่จะอยู่ระหว่าง 145–185

สิ่งนี้มีประโยชน์มากในงานที่ ความไม่แน่นอนสำคัญพอๆ กับตัวเลขที่ทำนาย

เช่น การแพทย์ การเงิน การทดลอง งานวิจัย หรือธุรกิจที่มีข้อมูลน้อย

ภาพจำ: เรามีความเชื่อเดิม → เจอข้อมูลใหม่ → อัปเดตความเชื่อ

03How it works

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

  1. เปลี่ยนเรื่องร้านใหม่ให้เป็นตารางฝึก

    เตรียม X เป็นงบโฆษณา จำนวนชั่วโมงเปิด และจำนวนคนเดินผ่านที่รู้ก่อนทำนาย ส่วน y คือออเดอร์จริงต่อวัน ต้องมีหลายวันที่เห็นทั้งปัจจัยและผลลัพธ์ เก็บวันล่าสุดไว้ทดสอบ โมเดล BayesianRidge ในตัวอย่างนี้ยังเป็นสมการเชิงเส้นที่มีความไม่แน่นอนกำกับ

  2. ความเชื่อเดิมอยู่ที่น้ำหนักของสูตร

    BayesianRidge เริ่มด้วยการกระจายความเป็นไปได้ของน้ำหนัก แล้วใช้ข้อมูลมาปรับเป็นความเชื่อหลังเห็นข้อมูล หรือ posterior มันไม่ได้มีช่องให้ใส่ข้อความว่า “น่าจะขาย 100–150 ออเดอร์” ตรงๆ หากต้องการระบุความเชื่อเรื่องยอดขายเช่นนั้นโดยเฉพาะ ต้องออกแบบโมเดล Bayesian เพิ่ม ตัวอย่างนี้ใช้ prior เพื่อควบคุมน้ำหนักและ noise

  3. ข้อมูลทำให้สูตรบางชุดน่าเชื่อขึ้น

    นึกว่ามีเส้นทำนายได้หลายเส้น เส้นที่อธิบายข้อมูลฝึกได้ดีจะมีน้ำหนักความเชื่อมากขึ้น ขณะเดียวกัน prior ยังช่วยควบคุมความซับซ้อน fit คำนวณทั้งน้ำหนักเฉลี่ยและความไม่แน่นอนของน้ำหนัก รวมถึงประมาณระดับ noise ของข้อมูล จึงไม่ใช่เพียงลากเส้นกลางแล้วใส่แถบเผื่อแบบตามใจ

  4. เริ่มจากค่าเดิมแล้วค่อยแตะ prior

    ปรับสเกล X จากชุดฝึกแล้วเริ่ม BayesianRidge() ตามด้วย fit(X_train_scaled, y_train) ค่า alpha_1/alpha_2 เป็น hyperparameter ของ prior ฝั่งความแม่นยำของ noise และ lambda_1/lambda_2 เป็นของ prior ฝั่งน้ำหนัก ไม่ใช่ alpha ของ Ridge ที่เพิ่มแล้วตีความเป็นแรงเบรกตรงๆ ส่วน tol ใช้คุมเกณฑ์หยุดการหาคำตอบ

  5. ขอทั้งคำตอบและความไม่แน่ใจ

    ใช้ mean, std = model.predict(X_new_scaled, return_std=True) ถ้าได้ mean=165 และ std=10 ช่วง mean ± 1.96 × std คือประมาณ 145–185 ภายใต้สมมติฐาน Gaussian ของโมเดล ตัวเลขนี้เป็นตัวอย่างการอ่านผล ไม่ใช่ผลรันที่รับรอง ตรวจทั้ง MAE และสัดส่วนค่าจริงในชุดทดสอบที่ตกในช่วง หากช่วงพลาดบ่อย อาจต้องปรับ feature หรือสมมติฐาน ไม่ใช่เชื่อช่วงเพราะมีคำว่า Bayesian

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

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

DATA INX · featuresy · targetX = [งบโฆษณา, ชั่วโมงเปิด, คนเดินผ่าน] · y = ออเดอร์ต่อวัน
CALCULATEBayesian Regression
alpha_1 / alpha_2lambda_1 / lambda_2tol
RESULTnumeric predictionตัวอย่างการอ่านผล: mean=165, std=10 → ช่วงประมาณ 145–185
เส้นทางของข้อมูล: จากค่าที่รับเข้า ผ่านการคำนวณด้วยพารามิเตอร์ ไปเป็นผลลัพธ์
INPUT

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

รับ X เป็นตารางตัวเลขและ y เป็นค่าต่อเนื่อง พร้อมสมมติฐานเริ่มต้นเกี่ยวกับการกระจายของน้ำหนักและ noise

X = [งบโฆษณา, ชั่วโมงเปิด, คนเดินผ่าน] · y = ออเดอร์ต่อวัน
PARAMETERS

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

alpha_1 / alpha_2
รูปแบบ prior ของความแม่นยำของ noise
lambda_1 / lambda_2
รูปแบบ prior ของความแม่นยำของน้ำหนัก
tol
เกณฑ์หยุดเมื่อค่าพารามิเตอร์เปลี่ยนน้อยมาก
OUTPUT

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

ได้ค่าทำนายเฉลี่ย coefficients และค่าความไม่แน่นอน เช่น standard deviation ของคำทำนาย

ตัวอย่างการอ่านผล: mean=165, std=10 → ช่วงประมาณ 145–185
CALCULATION

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

  1. 01

    เริ่มจาก prior ซึ่งให้คะแนนความเป็นไปได้แก่ค่าน้ำหนักหลายชุด

  2. 02

    คำนวณ likelihood ว่าน้ำหนักแต่ละชุดสร้างข้อมูล y ที่เห็นได้ดีเพียงใด

  3. 03

    รวม prior กับ likelihood เป็น posterior แล้วใช้ค่าเฉลี่ยและความกว้างของ posterior ทำนาย

ควรรู้อีกนิด — ผลขึ้นกับสมมติฐาน prior และรูปแบบ noise; uncertainty ที่คำนวณได้ไม่ช่วยถ้าโมเดลตั้งสมมติฐานผิด

04Make it yours

Python · scikit-learn
# ติดตั้ง: pip install numpy scikit-learn matplotlibfrom sklearn.linear_model import BayesianRidgefrom 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 = BayesianRidge(alpha_1=2.0, lambda_1=2.0)  # prior hyperparametersmodel.fit(X_train, y_train)pred = model.predict(X_test)print("RMSE:", mean_squared_error(y_test, pred) ** 0.5)

โค้ดเปลี่ยนตามค่าที่เลือกใน Playground · แต่ละภาษาใช้ข้อมูลตัวอย่างตามที่ระบุในโค้ด

05Learn by playing

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

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

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