01Overall Concept
ไอเดียหลัก — Gaussian Process ทำนายโดยคิดว่าจุดที่อยู่ใกล้หรือคล้ายกันน่าจะมีคำตอบใกล้กัน สิ่งพิเศษคือโมเดลให้ทั้งค่าที่เดาและช่วงความไม่แน่นอน จึงรู้ว่าบริเวณไหนมั่นใจและบริเวณไหนควรเก็บข้อมูลเพิ่ม
ลองนึกภาพว่า — เหมือนขึงผ้ายืดผ่านหมุดข้อมูล ใกล้หมุดที่รู้คำตอบ ผ้าจะถูกยึดไว้แน่น แต่บริเวณที่ห่างจากหมุด ผ้าสามารถขยับได้หลายแบบและเราจึงไม่ควรมั่นใจมาก
ตัวอย่างการนำไปใช้ — คาดอุณหภูมิระหว่างเวลาที่วัดไว้ เลือกการทดลองครั้งถัดไปเมื่อการทดลองมีราคาแพง หรือสร้างคำทำนายที่ต้องแสดงช่วงความมั่นใจ
02อธิบายภาษาคนเข้าใจง่ายๆ
Gaussian Process เป็นเทคนิคที่น่าสนใจตรงที่ไม่ได้สนใจแค่
“คำตอบเท่าไร?”
แต่สนใจว่า
“เรามั่นใจในคำตอบนี้แค่ไหน?”
สมมติเรามีข้อมูลอุณหภูมิของเครื่องจักรที่ความเร็วต่างๆ
เรามีข้อมูลเยอะช่วง 1,000–2,000 RPM
ดังนั้น Gaussian Process อาจบอกว่า
ที่ 1,500 RPM อุณหภูมิน่าจะ 62°C และฉันค่อนข้างมั่นใจ
แต่ถ้าเราถามที่ 5,000 RPM ซึ่งแทบไม่มีข้อมูล
มันอาจตอบว่า
น่าจะประมาณ 90°C แต่ความไม่แน่นอนสูงมาก
นี่เป็นคุณสมบัติที่มีประโยชน์มากในงานที่การทดลองมีราคาแพง
เช่น
การทดลองวัสดุ การออกแบบยา การปรับ parameter ของเครื่องจักร Optimization
เพราะเราสามารถถามต่อได้ว่า
“ตรงไหนที่โมเดลไม่แน่ใจที่สุด และควรทดลองเพิ่ม?”
ข้อเสียคือ Gaussian Process มักไม่เหมาะกับข้อมูลขนาดใหญ่มาก เพราะการคำนวณหนักขึ้นอย่างรวดเร็ว
ภาพจำ: นักพยากรณ์ที่ไม่ได้บอกแค่คำตอบ แต่พูดด้วยว่า “ตรงนี้มั่นใจมาก / ตรงนี้เดาเอาอยู่พอสมควร”
03How it works
ค่อยๆ ทำไปด้วยกัน ตั้งแต่ข้อมูลแถวแรกจนถึงการตรวจคำตอบ
เริ่มจากจุดวัดเครื่องจักรที่มีไม่มาก
เตรียม X เป็นรอบเครื่อง RPM ในรูปตารางหนึ่งคอลัมน์ และ y เป็นอุณหภูมิที่วัดได้ แบ่งบางจุดไว้ตรวจผล รวมถึงจุดห่างจากช่วงที่มีข้อมูลมาก ปรับสเกล X จาก train ก่อน เพื่อให้พารามิเตอร์ระยะตีความได้สะดวกขึ้น
กำหนดว่าจุดใกล้กันควรเล่าเรื่องคล้ายกัน
เลือก kernel เช่น RBF ซึ่งให้จุดที่อยู่ใกล้กันมีความสัมพันธ์มากกว่า length_scale คือระยะลักษณะของความสัมพันธ์ ค่าสั้นยอมให้เส้นเปลี่ยนเร็ว ค่ายาวชอบเส้นเรียบ จากนั้นโมเดลสร้างตาราง covariance ของจุดฝึกทุกคู่และรวม noise ที่ยอมให้มีในการวัด
ใช้ข้อมูลดึงคำตอบพร้อมลดความไม่แน่ใจ
Gaussian Process แก้ระบบสมการจากตารางความสัมพันธ์นั้น แล้วคำนวณทั้ง mean และ variance ของจุดใหม่ จุดที่ข้อมูลช่วยอธิบายมากมักมีช่วงแคบ ส่วนจุดไกลอาจกลับไปใกล้ค่าเฉลี่ยเดิมของโมเดลและช่วงกว้าง จึงไม่ควรคิดว่ามันลากแนวโน้มออกนอกข้อมูลได้แม่นเสมอ
ฝึกพร้อมรู้ว่าค่าไหนถูกปรับอัตโนมัติ
เริ่ม GaussianProcessRegressor(kernel=RBF(length_scale=1.0) + WhiteKernel(noise_level=0.1), normalize_y=True, random_state=42) แล้ว fit บน X ที่ปรับสเกล WhiteKernel แทน noise ที่เรียนรู้ได้ ส่วน alpha ใช้เติม noise variance บนแนวทแยงได้เช่นกัน ปกติ optimizer จะปรับค่าของ kernel ตอน fit ดู kernel_ หลังฝึก หากต้องการทดลองตรึง length_scale ให้ใช้ optimizer=None
ขอช่วงคำตอบแล้วตรวจด้วยข้อมูลจริง
ใช้ mean, std = model.predict(X_test_scaled, return_std=True) และวาด mean ± 1.96 × std เป็นช่วงประมาณภายใต้สมมติฐาน Gaussian ตรวจทั้ง RMSE และว่าค่าจริงตกในช่วงบ่อยแค่ไหน การตั้ง kernel/noise ไม่เหมาะอาจทำให้ช่วงมั่นใจผิด และการคำนวณ exact GP โตเร็วมากตามจำนวนแถว จึงควรเริ่มจากชุดข้อมูลเล็กก่อน
ข้อมูล พารามิเตอร์ และภาพรวมการคำนวณ
kernellength_scalealphaข้อมูลที่รับเข้ามา
รับ X เป็นพิกัดตัวเลขและ y เป็นค่าที่วัดได้ มักใช้ข้อมูลไม่ใหญ่มาก เพราะต้องสร้างความสัมพันธ์ของทุกคู่ข้อมูล
X = RPM ของเครื่องจักร · y = อุณหภูมิที่วัดได้พารามิเตอร์ที่ใช้
- kernel
- กติกาความคล้ายและรูปทรงของฟังก์ชันที่คาดไว้
- length_scale
- ระยะความสัมพันธ์ใน kernel; optimizer อาจปรับค่าตอน fit ให้ดู kernel_ หลังฝึก
- alpha
- noise variance ที่เติมบนแนวทแยง; WhiteKernel เป็นอีกวิธีสำหรับ noise ที่เรียนรู้ได้
ผลลัพธ์ที่ได้
ได้ค่าทำนายเฉลี่ยและ standard deviation ต่อจุดใหม่ จึงสร้างเส้นพร้อมแถบความไม่แน่นอนได้
predict(return_std=True) → mean และ std ต่อจุดคำนวณทีละขั้น
- 01
ใช้ kernel คำนวณ covariance ของข้อมูลฝึกทุกคู่เป็นเมทริกซ์ K
- 02
รวม K กับ noise แล้วแก้ระบบสมการเพื่อหาน้ำหนักที่จุดฝึกส่งไปยังจุดใหม่
- 03
คำนวณ posterior mean เป็นคำทำนายและ posterior variance เป็นความไม่แน่นอน
ควรรู้อีกนิด — การฝึกมาตรฐานมีต้นทุนประมาณกำลังสามของจำนวนข้อมูล และผลขึ้นกับ kernel มาก
04Make it yours
# ติดตั้ง: pip install numpy scikit-learn matplotlibfrom sklearn.gaussian_process import GaussianProcessRegressorfrom sklearn.gaussian_process.kernels import RBF, WhiteKernelfrom 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 = GaussianProcessRegressor(kernel=RBF(length_scale=0.45) + WhiteKernel(0.03), random_state=42)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
ปรับ kernel length scale แล้วสังเกตรูปแบบคำทำนายและตัวชี้วัดที่คำนวณใหม่ทันที
Playground เป็น implementation เพื่อการเรียนรู้ที่คำนวณในเบราว์เซอร์ ส่วนโค้ด Python ใช้ scikit-learn จึงอาจให้ค่าต่างกันเล็กน้อยจากรายละเอียดการ optimize และค่าเริ่มต้นของไลบรารี ผลนี้ไม่ใช่ benchmark บนข้อมูลจริง