Lab 2: Naive Bayes Classification

วัตถุประสงค์การเรียนรู้

  1. เข้าใจหลักการทำงานของ Naive Bayes Classifier
  2. สามารถคำนวณความน่าจะเป็นแบบ Maximum Likelihood Estimation (MLE)
  3. สามารถคำนวณความน่าจะเป็นแบบ Maximum A Posteriori (MAP)
  4. สามารถเขียนโปรแกรมเพื่อทำนายผลลัพธ์จากข้อมูลที่กำหนด

ทฤษฎีเบื้องต้น

Naive Bayes Classifier

Naive Bayes เป็นอัลกอริทึมการจำแนกประเภท (Classification) ที่อาศัยทฤษฎีความน่าจะเป็นของ Bayes โดยมีสมมติฐานว่า features ทั้งหมดเป็นอิสระต่อกัน (Conditional Independence)

สูตร Bayes' Theorem:

P ( C | X ) = P ( X | C ) P ( C ) P ( X )

โดยที่:

Maximum Likelihood Estimation (MLE)

MLE เลือกคลาสที่มีค่า Likelihood สูงสุด โดย ไม่พิจารณา Prior:

C ^ M L E = arg max C P ( X | C ) = arg max C i = 1 n P ( x i | C )

Maximum A Posteriori (MAP)

MAP เลือกคลาสที่มีค่า Posterior สูงสุด โดย พิจารณา Prior ร่วมด้วย:

C ^ M A P = arg max C P ( C | X ) = arg max C P ( X | C ) P ( C ) = arg max C P ( C ) i = 1 n P ( x i | C )

Laplace Smoothing

เพื่อแก้ปัญหา Zero Probability (เมื่อบาง feature ไม่เคยปรากฏในคลาสใดคลาสหนึ่ง):

P ( x i | C ) = count ( x i , C ) + α count ( C ) + α | V |

โดยที่:


คำสั่ง

ให้นักศึกษาเขียนโปรแกรมภาษา Python เพื่อทำนายสภาพอากาศว่าฝนจะตกหรือไม่ โดยใช้ Naive Bayes Classifier จากข้อมูลที่กำหนดให้

สิ่งที่ต้องทำ

  1. อ่านข้อมูล Training Set จากไฟล์ weather_data.csv

  2. คำนวณความน่าจะเป็น ของแต่ละ feature สำหรับแต่ละคลาส

  3. Implement ฟังก์ชันทำนาย 2 แบบ:

  4. ทดสอบกับ Test Cases ที่กำหนดให้

  5. แสดงผลลัพธ์ ทั้งค่าความน่าจะเป็นและผลการทำนาย


ข้อกำหนด

Features (ตัวแปรอิสระ)

Feature ค่าที่เป็นไปได้ คำอธิบาย
เมฆ (Cloud) มาก, ปานกลาง, น้อย ปริมาณเมฆบนท้องฟ้า
อากาศ (Temperature) ร้อน, อบอุ่น, เย็น อุณหภูมิของอากาศ
ความชื้น (Humidity) มาก, ปานกลาง, น้อย ระดับความชื้นในอากาศ

Class (ตัวแปรตาม)

Class คำอธิบาย
ฝนไม่ตก ไม่มีฝนตก
ฝนตกเล็กน้อย มีฝนตกเบาๆ หรือฝนปรอย
ฝนตกหนัก มีฝนตกหนักมาก

ข้อกำหนดทางเทคนิค

  1. ภาษา: Python 3.x
  2. ห้ามใช้ Library สำเร็จรูป สำหรับ Naive Bayes (เช่น sklearn.naive_bayes)
  3. อนุญาตใช้: pandas, numpy, csv สำหรับจัดการข้อมูล
  4. ต้องใช้ Laplace Smoothing ด้วย α = 1
  5. แสดงค่าความน่าจะเป็น ของทุกคลาสในการทำนายแต่ละครั้ง
  6. ปัดทศนิยม 6 ตำแหน่ง

ชุดข้อมูล Training Set (50 รายการ)

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

Test Case 1

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: ฝนตกหนัก
===============================================

Test Case 2

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: ฝนไม่ตก
===============================================

Test Case 3

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: ฝนตกเล็กน้อย
===============================================

Test Case 4

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: ฝนตกเล็กน้อย
===============================================

Test Case 5

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()

ภาคผนวก: สูตรคณิตศาสตร์

Bayes' Theorem

P ( C | X ) = P ( X | C ) P ( C ) P ( X )

Naive Bayes Assumption (Conditional Independence)

P ( x1 , x2 , , xn | C ) = i = 1 n P ( xi | C )

Prior Probability

P ( C ) = count ( C ) N

Likelihood with Laplace Smoothing

P ( xi | C ) = count ( xi , C ) + α count ( C ) + α | V |