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

Gaussian Process

สร้างเส้นทำนายพร้อมช่วงความมั่นใจ

LEARNING LEVEL4
ขั้นสูงควรรู้มาก่อน · Bayesian Regression, kernel และ covariance
ลองใน Playground

01Overall Concept

OVERALL 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

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

  1. เริ่มจากจุดวัดเครื่องจักรที่มีไม่มาก

    เตรียม X เป็นรอบเครื่อง RPM ในรูปตารางหนึ่งคอลัมน์ และ y เป็นอุณหภูมิที่วัดได้ แบ่งบางจุดไว้ตรวจผล รวมถึงจุดห่างจากช่วงที่มีข้อมูลมาก ปรับสเกล X จาก train ก่อน เพื่อให้พารามิเตอร์ระยะตีความได้สะดวกขึ้น

  2. กำหนดว่าจุดใกล้กันควรเล่าเรื่องคล้ายกัน

    เลือก kernel เช่น RBF ซึ่งให้จุดที่อยู่ใกล้กันมีความสัมพันธ์มากกว่า length_scale คือระยะลักษณะของความสัมพันธ์ ค่าสั้นยอมให้เส้นเปลี่ยนเร็ว ค่ายาวชอบเส้นเรียบ จากนั้นโมเดลสร้างตาราง covariance ของจุดฝึกทุกคู่และรวม noise ที่ยอมให้มีในการวัด

  3. ใช้ข้อมูลดึงคำตอบพร้อมลดความไม่แน่ใจ

    Gaussian Process แก้ระบบสมการจากตารางความสัมพันธ์นั้น แล้วคำนวณทั้ง mean และ variance ของจุดใหม่ จุดที่ข้อมูลช่วยอธิบายมากมักมีช่วงแคบ ส่วนจุดไกลอาจกลับไปใกล้ค่าเฉลี่ยเดิมของโมเดลและช่วงกว้าง จึงไม่ควรคิดว่ามันลากแนวโน้มออกนอกข้อมูลได้แม่นเสมอ

  4. ฝึกพร้อมรู้ว่าค่าไหนถูกปรับอัตโนมัติ

    เริ่ม 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

  5. ขอช่วงคำตอบแล้วตรวจด้วยข้อมูลจริง

    ใช้ mean, std = model.predict(X_test_scaled, return_std=True) และวาด mean ± 1.96 × std เป็นช่วงประมาณภายใต้สมมติฐาน Gaussian ตรวจทั้ง RMSE และว่าค่าจริงตกในช่วงบ่อยแค่ไหน การตั้ง kernel/noise ไม่เหมาะอาจทำให้ช่วงมั่นใจผิด และการคำนวณ exact GP โตเร็วมากตามจำนวนแถว จึงควรเริ่มจากชุดข้อมูลเล็กก่อน

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

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

DATA INX · featuresy · targetX = RPM ของเครื่องจักร · y = อุณหภูมิที่วัดได้
CALCULATEGaussian Process
kernellength_scalealpha
RESULTnumeric predictionpredict(return_std=True) → mean และ std ต่อจุด
เส้นทางของข้อมูล: จากค่าที่รับเข้า ผ่านการคำนวณด้วยพารามิเตอร์ ไปเป็นผลลัพธ์
INPUT

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

รับ X เป็นพิกัดตัวเลขและ y เป็นค่าที่วัดได้ มักใช้ข้อมูลไม่ใหญ่มาก เพราะต้องสร้างความสัมพันธ์ของทุกคู่ข้อมูล

X = RPM ของเครื่องจักร · y = อุณหภูมิที่วัดได้
PARAMETERS

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

kernel
กติกาความคล้ายและรูปทรงของฟังก์ชันที่คาดไว้
length_scale
ระยะความสัมพันธ์ใน kernel; optimizer อาจปรับค่าตอน fit ให้ดู kernel_ หลังฝึก
alpha
noise variance ที่เติมบนแนวทแยง; WhiteKernel เป็นอีกวิธีสำหรับ noise ที่เรียนรู้ได้
OUTPUT

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

ได้ค่าทำนายเฉลี่ยและ standard deviation ต่อจุดใหม่ จึงสร้างเส้นพร้อมแถบความไม่แน่นอนได้

predict(return_std=True) → mean และ std ต่อจุด
CALCULATION

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

  1. 01

    ใช้ kernel คำนวณ covariance ของข้อมูลฝึกทุกคู่เป็นเมทริกซ์ K

  2. 02

    รวม K กับ noise แล้วแก้ระบบสมการเพื่อหาน้ำหนักที่จุดฝึกส่งไปยังจุดใหม่

  3. 03

    คำนวณ posterior mean เป็นคำทำนายและ posterior variance เป็นความไม่แน่นอน

ควรรู้อีกนิด — การฝึกมาตรฐานมีต้นทุนประมาณกำลังสามของจำนวนข้อมูล และผลขึ้นกับ kernel มาก

04Make it yours

Python · scikit-learn
# ติดตั้ง: 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 แล้วสังเกตรูปแบบคำทำนายและตัวชี้วัดที่คำนวณใหม่ทันที

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

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