Naive Bayes เป็นอัลกอริทึมการจำแนกประเภท (Classification) ที่อาศัยทฤษฎีความน่าจะเป็นของ Bayes โดยมีสมมติฐานว่า features ทั้งหมดเป็นอิสระต่อกัน (Conditional Independence)
สูตร Bayes' Theorem:
โดยที่:
MLE เลือกคลาสที่มีค่า Likelihood สูงสุด โดย ไม่พิจารณา Prior:
MAP เลือกคลาสที่มีค่า Posterior สูงสุด โดย พิจารณา Prior ร่วมด้วย:
เพื่อแก้ปัญหา Zero Probability (เมื่อบาง feature ไม่เคยปรากฏในคลาสใดคลาสหนึ่ง):
โดยที่:
ให้นักศึกษาเขียนโปรแกรมภาษา Python เพื่อทำนายสภาพอากาศว่าฝนจะตกหรือไม่ โดยใช้ Naive Bayes Classifier จากข้อมูลที่กำหนดให้
อ่านข้อมูล Training Set จากไฟล์ weather_data.csv
คำนวณความน่าจะเป็น ของแต่ละ feature สำหรับแต่ละคลาส
Implement ฟังก์ชันทำนาย 2 แบบ:
predict_mle(features) - ทำนายโดยใช้ Maximum Likelihood Estimationpredict_map(features) - ทำนายโดยใช้ Maximum A Posterioriทดสอบกับ Test Cases ที่กำหนดให้
แสดงผลลัพธ์ ทั้งค่าความน่าจะเป็นและผลการทำนาย
| Feature | ค่าที่เป็นไปได้ | คำอธิบาย |
|---|---|---|
| เมฆ (Cloud) | มาก, ปานกลาง, น้อย | ปริมาณเมฆบนท้องฟ้า |
| อากาศ (Temperature) | ร้อน, อบอุ่น, เย็น | อุณหภูมิของอากาศ |
| ความชื้น (Humidity) | มาก, ปานกลาง, น้อย | ระดับความชื้นในอากาศ |
| Class | คำอธิบาย |
|---|---|
| ฝนไม่ตก | ไม่มีฝนตก |
| ฝนตกเล็กน้อย | มีฝนตกเบาๆ หรือฝนปรอย |
| ฝนตกหนัก | มีฝนตกหนักมาก |
pandas, numpy, csv สำหรับจัดการข้อมูลid,cloud,temperature,humidity,rain
1,มาก,เย็น,มาก,ฝนตกหนัก
2,มาก,อบอุ่น,มาก,ฝนตกหนัก
3,ปานกลาง,อบอุ่น,ปานกลาง,ฝนตกเล็กน้อย
4,น้อย,ร้อน,น้อย,ฝนไม่ตก
5,น้อย,ร้อน,ปานกลาง,ฝนไม่ตก
6,มาก,เย็น,ปานกลาง,ฝนตกเล็กน้อย
7,ปานกลาง,ร้อน,มาก,ฝนตกเล็กน้อย
8,น้อย,อบอุ่น,น้อย,ฝนไม่ตก
9,มาก,อบอุ่น,ปานกลาง,ฝนตกเล็กน้อย
10,ปานกลาง,เย็น,มาก,ฝนตกหนัก
11,น้อย,เย็น,น้อย,ฝนไม่ตก
12,มาก,ร้อน,มาก,ฝนตกหนัก
13,ปานกลาง,อบอุ่น,น้อย,ฝนไม่ตก
14,มาก,เย็น,มาก,ฝนตกหนัก
15,น้อย,ร้อน,น้อย,ฝนไม่ตก
16,ปานกลาง,เย็น,ปานกลาง,ฝนตกเล็กน้อย
17,มาก,อบอุ่น,มาก,ฝนตกหนัก
18,น้อย,อบอุ่น,ปานกลาง,ฝนไม่ตก
19,ปานกลาง,ร้อน,ปานกลาง,ฝนตกเล็กน้อย
20,มาก,เย็น,ปานกลาง,ฝนตกเล็กน้อย
21,น้อย,ร้อน,มาก,ฝนตกเล็กน้อย
22,มาก,อบอุ่น,ปานกลาง,ฝนตกเล็กน้อย
23,ปานกลาง,เย็น,มาก,ฝนตกหนัก
24,น้อย,เย็น,ปานกลาง,ฝนไม่ตก
25,มาก,ร้อน,ปานกลาง,ฝนตกเล็กน้อย
26,ปานกลาง,อบอุ่น,มาก,ฝนตกเล็กน้อย
27,น้อย,อบอุ่น,น้อย,ฝนไม่ตก
28,มาก,เย็น,มาก,ฝนตกหนัก
29,ปานกลาง,ร้อน,น้อย,ฝนไม่ตก
30,มาก,อบอุ่น,มาก,ฝนตกหนัก
31,น้อย,เย็น,มาก,ฝนตกเล็กน้อย
32,ปานกลาง,เย็น,ปานกลาง,ฝนตกเล็กน้อย
33,มาก,ร้อน,มาก,ฝนตกหนัก
34,น้อย,ร้อน,ปานกลาง,ฝนไม่ตก
35,ปานกลาง,อบอุ่น,ปานกลาง,ฝนตกเล็กน้อย
36,มาก,เย็น,ปานกลาง,ฝนตกเล็กน้อย
37,น้อย,อบอุ่น,มาก,ฝนตกเล็กน้อย
38,มาก,อบอุ่น,น้อย,ฝนไม่ตก
39,ปานกลาง,เย็น,มาก,ฝนตกหนัก
40,น้อย,ร้อน,น้อย,ฝนไม่ตก
41,มาก,เย็น,มาก,ฝนตกหนัก
42,ปานกลาง,ร้อน,ปานกลาง,ฝนตกเล็กน้อย
43,น้อย,อบอุ่น,ปานกลาง,ฝนไม่ตก
44,มาก,อบอุ่น,มาก,ฝนตกหนัก
45,ปานกลาง,เย็น,น้อย,ฝนไม่ตก
46,น้อย,เย็น,ปานกลาง,ฝนตกเล็กน้อย
47,มาก,ร้อน,ปานกลาง,ฝนตกเล็กน้อย
48,ปานกลาง,อบอุ่น,มาก,ฝนตกเล็กน้อย
49,น้อย,ร้อน,มาก,ฝนตกเล็กน้อย
50,มาก,เย็น,มาก,ฝนตกหนัก
| Class | จำนวน | สัดส่วน |
|---|---|---|
| ฝนไม่ตก | 15 | 30% |
| ฝนตกเล็กน้อย | 20 | 40% |
| ฝนตกหนัก | 15 | 30% |
Input:
เมฆ: มาก
อากาศ: เย็น
ความชื้น: มาก
Output:
===============================================
Naive Bayes Weather Prediction
===============================================
Input Features:
- เมฆ: มาก
- อากาศ: เย็น
- ความชื้น: มาก
-----------------------------------------------
Maximum Likelihood Estimation (MLE)
-----------------------------------------------
P(X|ฝนไม่ตก) = 0.001372
P(X|ฝนตกเล็กน้อย) = 0.004630
P(X|ฝนตกหนัก) = 0.074074
MLE Prediction: ฝนตกหนัก
-----------------------------------------------
Maximum A Posteriori (MAP)
-----------------------------------------------
P(ฝนไม่ตก) = 0.300000
P(ฝนตกเล็กน้อย) = 0.400000
P(ฝนตกหนัก) = 0.300000
P(X|ฝนไม่ตก) × P(ฝนไม่ตก) = 0.000412
P(X|ฝนตกเล็กน้อย) × P(ฝนตกเล็กน้อย) = 0.001852
P(X|ฝนตกหนัก) × P(ฝนตกหนัก) = 0.022222
MAP Prediction: ฝนตกหนัก
===============================================
Input:
เมฆ: น้อย
อากาศ: ร้อน
ความชื้น: น้อย
Output:
===============================================
Naive Bayes Weather Prediction
===============================================
Input Features:
- เมฆ: น้อย
- อากาศ: ร้อน
- ความชื้น: น้อย
-----------------------------------------------
Maximum Likelihood Estimation (MLE)
-----------------------------------------------
P(X|ฝนไม่ตก) = 0.049383
P(X|ฝนตกเล็กน้อย) = 0.003858
P(X|ฝนตกหนัก) = 0.001372
MLE Prediction: ฝนไม่ตก
-----------------------------------------------
Maximum A Posteriori (MAP)
-----------------------------------------------
P(ฝนไม่ตก) = 0.300000
P(ฝนตกเล็กน้อย) = 0.400000
P(ฝนตกหนัก) = 0.300000
P(X|ฝนไม่ตก) × P(ฝนไม่ตก) = 0.014815
P(X|ฝนตกเล็กน้อย) × P(ฝนตกเล็กน้อย) = 0.001543
P(X|ฝนตกหนัก) × P(ฝนตกหนัก) = 0.000412
MAP Prediction: ฝนไม่ตก
===============================================
Input:
เมฆ: ปานกลาง
อากาศ: อบอุ่น
ความชื้น: ปานกลาง
Output:
===============================================
Naive Bayes Weather Prediction
===============================================
Input Features:
- เมฆ: ปานกลาง
- อากาศ: อบอุ่น
- ความชื้น: ปานกลาง
-----------------------------------------------
Maximum Likelihood Estimation (MLE)
-----------------------------------------------
P(X|ฝนไม่ตก) = 0.012346
P(X|ฝนตกเล็กน้อย) = 0.028292
P(X|ฝนตกหนัก) = 0.004115
MLE Prediction: ฝนตกเล็กน้อย
-----------------------------------------------
Maximum A Posteriori (MAP)
-----------------------------------------------
P(ฝนไม่ตก) = 0.300000
P(ฝนตกเล็กน้อย) = 0.400000
P(ฝนตกหนัก) = 0.300000
P(X|ฝนไม่ตก) × P(ฝนไม่ตก) = 0.003704
P(X|ฝนตกเล็กน้อย) × P(ฝนตกเล็กน้อย) = 0.011317
P(X|ฝนตกหนัก) × P(ฝนตกหนัก) = 0.001235
MAP Prediction: ฝนตกเล็กน้อย
===============================================
Input:
เมฆ: มาก
อากาศ: ร้อน
ความชื้น: น้อย
Output:
===============================================
Naive Bayes Weather Prediction
===============================================
Input Features:
- เมฆ: มาก
- อากาศ: ร้อน
- ความชื้น: น้อย
-----------------------------------------------
Maximum Likelihood Estimation (MLE)
-----------------------------------------------
P(X|ฝนไม่ตก) = 0.012346
P(X|ฝนตกเล็กน้อย) = 0.009645
P(X|ฝนตกหนัก) = 0.008230
MLE Prediction: ฝนไม่ตก
-----------------------------------------------
Maximum A Posteriori (MAP)
-----------------------------------------------
P(ฝนไม่ตก) = 0.300000
P(ฝนตกเล็กน้อย) = 0.400000
P(ฝนตกหนัก) = 0.300000
P(X|ฝนไม่ตก) × P(ฝนไม่ตก) = 0.003704
P(X|ฝนตกเล็กน้อย) × P(ฝนตกเล็กน้อย) = 0.003858
P(X|ฝนตกหนัก) × P(ฝนตกหนัก) = 0.002469
MAP Prediction: ฝนตกเล็กน้อย
===============================================
Input:
เมฆ: น้อย
อากาศ: เย็น
ความชื้น: มาก
Output:
===============================================
Naive Bayes Weather Prediction
===============================================
Input Features:
- เมฆ: น้อย
- อากาศ: เย็น
- ความชื้น: มาก
-----------------------------------------------
Maximum Likelihood Estimation (MLE)
-----------------------------------------------
P(X|ฝนไม่ตก) = 0.004115
P(X|ฝนตกเล็กน้อย) = 0.012346
P(X|ฝนตกหนัก) = 0.012346
MLE Prediction: ฝนตกเล็กน้อย (หรือ ฝนตกหนัก - เท่ากัน)
-----------------------------------------------
Maximum A Posteriori (MAP)
-----------------------------------------------
P(ฝนไม่ตก) = 0.300000
P(ฝนตกเล็กน้อย) = 0.400000
P(ฝนตกหนัก) = 0.300000
P(X|ฝนไม่ตก) × P(ฝนไม่ตก) = 0.001235
P(X|ฝนตกเล็กน้อย) × P(ฝนตกเล็กน้อย) = 0.004938
P(X|ฝนตกหนัก) × P(ฝนตกหนัก) = 0.003704
MAP Prediction: ฝนตกเล็กน้อย
===============================================
import csv
class NaiveBayesClassifier:
def __init__(self, alpha=1):
"""
Initialize classifier with Laplace smoothing parameter
"""
self.alpha = alpha
self.classes = []
self.class_counts = {}
self.feature_counts = {}
self.feature_values = {}
self.total_samples = 0
def fit(self, data):
"""
Train the classifier with training data
"""
# TODO: Implement training logic
pass
def _calculate_likelihood(self, features, class_label):
"""
Calculate P(X|C) for given features and class
"""
# TODO: Implement likelihood calculation with Laplace smoothing
pass
def _calculate_prior(self, class_label):
"""
Calculate P(C) for given class
"""
# TODO: Implement prior calculation
pass
def predict_mle(self, features):
"""
Predict using Maximum Likelihood Estimation
Returns: (predicted_class, probabilities_dict)
"""
# TODO: Implement MLE prediction
pass
def predict_map(self, features):
"""
Predict using Maximum A Posteriori
Returns: (predicted_class, probabilities_dict)
"""
# TODO: Implement MAP prediction
pass
def load_data(filename):
"""
Load training data from CSV file
"""
# TODO: Implement data loading
pass
def main():
# Load data
data = load_data('weather_data.csv')
# Create and train classifier
classifier = NaiveBayesClassifier(alpha=1)
classifier.fit(data)
# Test cases
test_cases = [
{'cloud': 'มาก', 'temperature': 'เย็น', 'humidity': 'มาก'},
{'cloud': 'น้อย', 'temperature': 'ร้อน', 'humidity': 'น้อย'},
{'cloud': 'ปานกลาง', 'temperature': 'อบอุ่น', 'humidity': 'ปานกลาง'},
{'cloud': 'มาก', 'temperature': 'ร้อน', 'humidity': 'น้อย'},
{'cloud': 'น้อย', 'temperature': 'เย็น', 'humidity': 'มาก'},
]
# Make predictions
for test in test_cases:
mle_result = classifier.predict_mle(test)
map_result = classifier.predict_map(test)
# TODO: Display results
pass
if __name__ == "__main__":
main()