01Overall Concept
ไอเดียหลัก — Bayesian Regression ไม่ได้ตอบเพียงตัวเลขเดียว แต่บอกด้วยว่าคำตอบนั้นยังไม่แน่นอนแค่ไหน โมเดลเริ่มจากความเชื่อเดิม แล้วใช้ข้อมูลใหม่ปรับความเชื่อให้เหมาะขึ้น ยิ่งมีหลักฐานดี ช่วงคำตอบที่เป็นไปได้ก็มักแคบลง
ลองนึกภาพว่า — ถ้าเพื่อนทำแบบทดสอบได้ดีหนึ่งครั้ง เราอาจยังไม่แน่ใจว่าเก่งจริงหรือโชคดี แต่เมื่อเห็นผลหลายครั้ง เราจะมั่นใจขึ้น วิธีนี้เก็บทั้งค่าที่คาดและระดับความมั่นใจไว้พร้อมกัน
ตัวอย่างการนำไปใช้ — คาดยอดขายเมื่อมีข้อมูลน้อย ประเมินผลการทดลองราคาแพง หรือสื่อสารช่วงความเป็นไปได้แทนการให้ตัวเลขที่ดูแน่นอนเกินจริง
02อธิบายภาษาคนเข้าใจง่ายๆ
Bayesian Regression มีแนวคิดที่น่าสนใจมาก เพราะมันไม่ได้เริ่มจากคำว่า
“ฉันไม่รู้อะไรเลย”
แต่มันเริ่มจาก
“ก่อนเห็นข้อมูล ฉันมีความเชื่อบางอย่างอยู่แล้ว แล้วเมื่อเห็นข้อมูลใหม่ ฉันจะปรับความเชื่อนั้น”
ตัวอย่างง่ายๆ สมมติเราจะประมาณยอดขายของร้านใหม่
เรารู้จากร้านที่คล้ายกันว่า ปกติน่าจะขายประมาณ 100–150 ออเดอร์ต่อวัน นี่คือ ความเชื่อเดิม
เปิดร้านวันแรกขายได้ 180 วันที่สอง 160 วันที่สาม 200
Bayesian จะเอาข้อมูลใหม่นี้มาปรับความเชื่อเดิม แล้วอาจบอกว่า
ตอนนี้คิดว่ายอดเฉลี่ยน่าจะประมาณ 165 ออเดอร์ แต่ยังมีความไม่แน่นอนอยู่พอสมควร
ถ้าเราเก็บข้อมูลอีก 6 เดือน ความมั่นใจก็จะเพิ่มขึ้น และอิทธิพลของความเชื่อเดิมก็จะลดลง
จุดสำคัญคือ Bayesian ไม่ได้ให้เราแค่คำตอบว่า
165
แต่ให้ประมาณว่า
น่าจะอยู่แถว 165 และมีโอกาสสูงที่จะอยู่ระหว่าง 145–185
สิ่งนี้มีประโยชน์มากในงานที่ ความไม่แน่นอนสำคัญพอๆ กับตัวเลขที่ทำนาย
เช่น การแพทย์ การเงิน การทดลอง งานวิจัย หรือธุรกิจที่มีข้อมูลน้อย
ภาพจำ: เรามีความเชื่อเดิม → เจอข้อมูลใหม่ → อัปเดตความเชื่อ
03How it works
ค่อยๆ ทำไปด้วยกัน ตั้งแต่ข้อมูลแถวแรกจนถึงการตรวจคำตอบ
เปลี่ยนเรื่องร้านใหม่ให้เป็นตารางฝึก
เตรียม X เป็นงบโฆษณา จำนวนชั่วโมงเปิด และจำนวนคนเดินผ่านที่รู้ก่อนทำนาย ส่วน y คือออเดอร์จริงต่อวัน ต้องมีหลายวันที่เห็นทั้งปัจจัยและผลลัพธ์ เก็บวันล่าสุดไว้ทดสอบ โมเดล BayesianRidge ในตัวอย่างนี้ยังเป็นสมการเชิงเส้นที่มีความไม่แน่นอนกำกับ
ความเชื่อเดิมอยู่ที่น้ำหนักของสูตร
BayesianRidge เริ่มด้วยการกระจายความเป็นไปได้ของน้ำหนัก แล้วใช้ข้อมูลมาปรับเป็นความเชื่อหลังเห็นข้อมูล หรือ posterior มันไม่ได้มีช่องให้ใส่ข้อความว่า “น่าจะขาย 100–150 ออเดอร์” ตรงๆ หากต้องการระบุความเชื่อเรื่องยอดขายเช่นนั้นโดยเฉพาะ ต้องออกแบบโมเดล Bayesian เพิ่ม ตัวอย่างนี้ใช้ prior เพื่อควบคุมน้ำหนักและ noise
ข้อมูลทำให้สูตรบางชุดน่าเชื่อขึ้น
นึกว่ามีเส้นทำนายได้หลายเส้น เส้นที่อธิบายข้อมูลฝึกได้ดีจะมีน้ำหนักความเชื่อมากขึ้น ขณะเดียวกัน prior ยังช่วยควบคุมความซับซ้อน fit คำนวณทั้งน้ำหนักเฉลี่ยและความไม่แน่นอนของน้ำหนัก รวมถึงประมาณระดับ noise ของข้อมูล จึงไม่ใช่เพียงลากเส้นกลางแล้วใส่แถบเผื่อแบบตามใจ
เริ่มจากค่าเดิมแล้วค่อยแตะ prior
ปรับสเกล X จากชุดฝึกแล้วเริ่ม BayesianRidge() ตามด้วย fit(X_train_scaled, y_train) ค่า alpha_1/alpha_2 เป็น hyperparameter ของ prior ฝั่งความแม่นยำของ noise และ lambda_1/lambda_2 เป็นของ prior ฝั่งน้ำหนัก ไม่ใช่ alpha ของ Ridge ที่เพิ่มแล้วตีความเป็นแรงเบรกตรงๆ ส่วน tol ใช้คุมเกณฑ์หยุดการหาคำตอบ
ขอทั้งคำตอบและความไม่แน่ใจ
ใช้ mean, std = model.predict(X_new_scaled, return_std=True) ถ้าได้ mean=165 และ std=10 ช่วง mean ± 1.96 × std คือประมาณ 145–185 ภายใต้สมมติฐาน Gaussian ของโมเดล ตัวเลขนี้เป็นตัวอย่างการอ่านผล ไม่ใช่ผลรันที่รับรอง ตรวจทั้ง MAE และสัดส่วนค่าจริงในชุดทดสอบที่ตกในช่วง หากช่วงพลาดบ่อย อาจต้องปรับ feature หรือสมมติฐาน ไม่ใช่เชื่อช่วงเพราะมีคำว่า Bayesian
ข้อมูล พารามิเตอร์ และภาพรวมการคำนวณ
alpha_1 / alpha_2lambda_1 / lambda_2tolข้อมูลที่รับเข้ามา
รับ X เป็นตารางตัวเลขและ y เป็นค่าต่อเนื่อง พร้อมสมมติฐานเริ่มต้นเกี่ยวกับการกระจายของน้ำหนักและ noise
X = [งบโฆษณา, ชั่วโมงเปิด, คนเดินผ่าน] · y = ออเดอร์ต่อวันพารามิเตอร์ที่ใช้
- alpha_1 / alpha_2
- รูปแบบ prior ของความแม่นยำของ noise
- lambda_1 / lambda_2
- รูปแบบ prior ของความแม่นยำของน้ำหนัก
- tol
- เกณฑ์หยุดเมื่อค่าพารามิเตอร์เปลี่ยนน้อยมาก
ผลลัพธ์ที่ได้
ได้ค่าทำนายเฉลี่ย coefficients และค่าความไม่แน่นอน เช่น standard deviation ของคำทำนาย
ตัวอย่างการอ่านผล: mean=165, std=10 → ช่วงประมาณ 145–185คำนวณทีละขั้น
- 01
เริ่มจาก prior ซึ่งให้คะแนนความเป็นไปได้แก่ค่าน้ำหนักหลายชุด
- 02
คำนวณ likelihood ว่าน้ำหนักแต่ละชุดสร้างข้อมูล y ที่เห็นได้ดีเพียงใด
- 03
รวม prior กับ likelihood เป็น posterior แล้วใช้ค่าเฉลี่ยและความกว้างของ posterior ทำนาย
ควรรู้อีกนิด — ผลขึ้นกับสมมติฐาน prior และรูปแบบ noise; uncertainty ที่คำนวณได้ไม่ช่วยถ้าโมเดลตั้งสมมติฐานผิด
04Make it yours
# ติดตั้ง: 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 แล้วสังเกตรูปแบบคำทำนายและตัวชี้วัดที่คำนวณใหม่ทันที
Playground เป็น implementation เพื่อการเรียนรู้ที่คำนวณในเบราว์เซอร์ ส่วนโค้ด Python ใช้ scikit-learn จึงอาจให้ค่าต่างกันเล็กน้อยจากรายละเอียดการ optimize และค่าเริ่มต้นของไลบรารี ผลนี้ไม่ใช่ benchmark บนข้อมูลจริง