keyboard_tabSkip to content
listPython Series

Classification

สารบัญ

รู้จักกับ Classification

ปัญหาการจัดประเภท (Classification Problem) คือปัญหาที่เกี่ยวข้องกับการคาดการณ์ ค่าตอบสนองเชิงคุณภาพ (หรือที่เรียกว่าข้อมูลประเภทหมวดหมู่) ซึ่งตัวแปรสามารถมีค่าอยู่ในหนึ่งใน K หมวดหมู่ที่แตกต่างกัน เป้าหมายคือการกำหนดว่าข้อมูลที่ได้รับควรถูกจัดให้อยู่ในหมวดหมู่หรือคลาสใด

ตัวอย่างของปัญหาการจัดประเภท ได้แก่

  • การวินิจฉัยทางการแพทย์ (Medical Diagnosis): กำหนดว่าบุคคลมีโรคใดในสามโรคที่เป็นไปได้ โดยอ้างอิงจากชุดของอาการที่พบ
  • การตรวจจับการฉ้อโกง (Fraud Detection): พิจารณาว่าธุรกรรมธนาคารออนไลน์เป็นการฉ้อโกงหรือไม่ โดยอ้างอิงจากที่อยู่ IP ของผู้ใช้และประวัติธุรกรรมที่ผ่านมา
  • การวิเคราะห์การกลายพันธุ์ของ DNA (DNA Mutation Analysis): จำแนกว่าการกลายพันธุ์ของ DNA ใดเป็นสาเหตุของโรค และการกลายพันธุ์ใดไม่มีผลกระทบ โดยอ้างอิงจากข้อมูลลำดับ DNA
  • การวิเคราะห์อารมณ์ (Sentiment Analysis): จำแนกรีวิวภาพยนตร์ใน IMDB ว่าเป็นรีวิวเชิงบวกหรือเชิงลบ
  • การพยากรณ์การผิดนัดชำระหนี้ (Default Prediction): พิจารณาว่าบุคคลจะผิดนัดชำระหนี้บัตรเครดิตหรือไม่
  • การจัดประเภทภาพ (Image Classification): จำแนกประเภทของภาพ เช่น ภาพจากชุดข้อมูล CIFAR100
  • การวินิจฉัยโรคมะเร็ง (Cancer Diagnosis): กำหนดว่ามะเร็งที่พบในเซลล์เป็นชนิดใด

ทีนี้จากที่เราเรียกมาก่อนหน้า เราเรียนเรื่อง Linear Regression มาเอาจริงๆ หากเราประยุกต์ใช้หน่อย โดยการพยายามดัดแปลงค่าของ Linear Regression ให้สามารถตีความค่าเป็นกลุ่มได้ จริงๆก็สามารถนำมาประยุกต์ใช้กับโจทย์ปัญหา Classification ได้ แต่ในทางการใช้งานจริง เรากลับค้นพบปัญหาตามมาเมื่อพยายามใช้ด้วย Linear Regression ตั้งแต่

  • ลักษณะของตัวแปรตอบสนอง: Linear Regression ตั้งสมมติฐานว่าตัวแปรตอบสนองเป็นเชิงปริมาณ ในขณะที่ปัญหาการจัดประเภทเกี่ยวข้องกับค่าตอบสนองเชิงคุณภาพ
  • การตีความผลลัพธ์: Linear Regression สามารถให้ค่าพยากรณ์ที่อยู่นอกช่วง 0 และ 1 ซึ่งทำให้การตีความเป็นความน่าจะเป็นในบริบทของการจัดประเภททำได้ยาก
  • การแปลงค่าตอบสนองเชิงคุณภาพ: แม้ว่าจะสามารถสร้างตัวแปร Dummy เพื่อแทนค่าข้อมูลเชิงคุณภาพได้ แต่การเปลี่ยนข้อมูลประเภทนี้ให้เป็นข้อมูลเชิงปริมาณสำหรับLinear Regression อาจไม่ให้แบบจำลองที่มีประสิทธิภาพ

วิธีที่เหมาะสมกว่าสำหรับปัญหาการจัดประเภท

  • Logistic Regression: ใช้แบบจำลองความน่าจะเป็นเพื่อกำหนดว่าข้อมูลอยู่ในหมวดหมู่ใด
  • Linear Discriminant Analysis (LDA): ใช้ฟังก์ชันเชิงเส้นของตัวแปรอิสระเพื่อจัดประเภทข้อมูล
  • Quadratic Discriminant Analysis (QDA)
  • Naive Bayes: จำแนกข้อมูลโดยสมมติว่าตัวแปรอิสระมีความเป็นอิสระต่อกันภายในแต่ละคลาส
  • K-Nearest Neighbors (KNN): จัดประเภทข้อมูลโดยอิงจากคลาสของเพื่อนบ้านที่ใกล้ที่สุด k ตัว
  • Tree-Based Methods: ใช้ Decision Tree ในการจำแนกประเภท
  • Support Vector Machines (SVM)
  • Generalized Additive Models (GAMs): สามารถใช้สำหรับปัญหาการจัดประเภท
  • Neural Networks: ใช้โครงข่ายประสาทเทียมในการเรียนรู้รูปแบบของข้อมูล

เราจะมาเรียนรู้จาก Logistic Regression ซึ่งถือเป็นพื้นฐานแรกสุดของการทำ Classification กัน

Logistic Regression

Logistic Regression เป็นวิธีการจัดหมวดหมู่ที่ใช้ในการทำนายค่าตอบสนองเชิงคุณภาพ แทนที่จะสร้างโมเดลค่าตอบสนองโดยตรง มันจะสร้างโมเดลของความน่าจะเป็นที่ค่าตอบสนองจะอยู่ในหมวดหมู่ใดหมวดหมู่หนึ่ง

LogReg_1.png

ref: https://www.saedsayad.com/logistic_regression.htm

องค์ประกอบสำคัญของ Logistic Regression

  • ค่าตอบสนองเชิงคุณภาพ (Qualitative Response): Logistic Regression ถูกออกแบบมาสำหรับกรณีที่ตัวแปรเป้าหมายเป็นค่าหมวดหมู่ที่ชัดเจน เช่น "ใช่" หรือ "ไม่ใช่"
  • การสร้างโมเดลความน่าจะเป็น (Probability Modeling): โมเดลนี้ใช้ทำนาย ค่าความน่าจะเป็น ที่ค่าตอบสนองจะตกอยู่ในหมวดหมู่ใดหมวดหมู่หนึ่ง เช่น ความน่าจะเป็นที่ลูกค้าจะผิดนัดชำระหนี้โดยพิจารณาจากยอดคงเหลือในบัญชี
  • Logistic Function : ใช้ Logistic Function เพื่อให้ค่าความน่าจะเป็นที่ได้อยู่ระหว่าง 0 ถึง 1 เสมอ โดยมีสมการดังนี้
$$p(X) = \frac{e^{\beta_0 + \beta_1 X}}{1 + e^{\beta_0 + \beta_1 X}}$$
  • Log Odds หรือ Logit: โมเดลนี้ใช้การแปลงค่าความน่าจะเป็นให้อยู่ในรูป log odds ซึ่งเป็นค่าที่เป็นเส้นตรงกับ X การเพิ่มค่า X ขึ้นหนึ่งหน่วยจะทำให้ log odds เปลี่ยนไปตามค่า $\beta_1$
  • การประมาณค่าสัมประสิทธิ์ (Estimating Coefficients): ใช้วิธี Maximum Likelihood Estimation (MLE) เพื่อหาค่าสัมประสิทธิ์ที่ทำให้ความน่าจะเป็นของข้อมูลจริงมากที่สุด
  • ตัวแปรพยากรณ์หลายตัว (Multiple Predictors): Logistic Regression สามารถขยายไปใช้กับหลายตัวแปรได้ เช่นเดียวกับLinear Regression พหุคูณ (Multiple Linear Regression)
  • ตัวแปรพยากรณ์เชิงคุณภาพ (Qualitative Predictors): สามารถรวมตัวแปรพยากรณ์เชิงคุณภาพเข้าไปในโมเดลได้โดยใช้ ตัวแปรดัมมี่ (Dummy Variables)
  • Logistic Regression แบบพหุหมวดหมู่ (Multinomial Logistic Regression): เป็นการขยายLogistic Regression เพื่อรองรับค่าตอบสนองที่มีมากกว่าสองหมวดหมู่

Logistic Regression เป็นหนึ่งในเทคนิคการจัดหมวดหมู่ที่ได้รับความนิยม เนื่องจากสามารถตีความได้ง่ายและมีความยืดหยุ่นในการใช้งานกับข้อมูลที่หลากหลาย

ตัวอย่างปัญหาที่ใช้ Logistic Regression

โจทย์: การทำนายการผิดนัดชำระบัตรเครดิต

ลองพิจารณาชุดข้อมูล เช่น ชุดข้อมูล "Default" ซึ่งมีเป้าหมายเพื่อทำนายว่าลูกค้าจะ ผิดนัดชำระ บัตรเครดิตหรือไม่ ("Yes" หรือ "No") โดยพิจารณาจาก ยอดคงเหลือในบัญชี (Balance)

แนวคิดและการคำนวณ

  1. แกนหลักของLogistic Regression คือการสร้างโมเดลค่าความน่าจะเป็นของการผิดนัดชำระโดยใช้ Logistic Function

    $$p(X) = \frac{e^{\beta_0 + \beta_1X}}{1 + e^{\beta_0 + \beta_1X}}$$

    โดยที่

    • $p(X)$ คือความน่าจะเป็นของการผิดนัดชำระ
    • $X$ คือยอดคงเหลือในบัญชี (Balance)
    • $\beta_0$ และ $\beta_1$ เป็นสัมประสิทธิ์ที่ต้องประมาณค่า
  2. การประมาณค่าสัมประสิทธิ์ ค่าสัมประสิทธิ์ $\beta_0$ และ $\beta_1$ จะถูกประมาณโดยใช้ Maximum Likelihood Estimation (MLE) ซึ่งเป็นวิธีที่ช่วยหาค่าพารามิเตอร์ที่ทำให้ฟังก์ชันความน่าจะเป็นของข้อมูลจริงมากที่สุด โดยทั่วไปซอฟต์แวร์สถิติจะใช้วิธีนี้ในการคำนวณ

  3. การทำนาย (Making Predictions)

    • เมื่อได้ค่าพารามิเตอร์แล้ว สามารถใช้โมเดลในการทำนายค่าความน่าจะเป็นของการผิดนัดชำระสำหรับลูกค้ารายใหม่
    • หากค่าความน่าจะเป็นมากกว่าค่าที่กำหนดเป็นเกณฑ์ (เช่น 0.5) ลูกค้าจะถูกจัดให้อยู่ในกลุ่ม Default = Yes
  4. การตีความสัมประสิทธิ์

    • $\beta_1$ แสดงถึง การเปลี่ยนแปลงของ log odds ของการผิดนัดชำระเมื่อลูกค้ามียอดคงเหลือเพิ่มขึ้นหนึ่งหน่วย
    • $e^{\beta_1}$ บอกถึงการเปลี่ยนแปลงแบบทวีคูณของ อัตราส่วนโอกาส (Odds Ratio) ของการผิดนัดชำระเมื่อลูกค้ามียอดคงเหลือเพิ่มขึ้นหนึ่งหน่วย

เมื่อลองใช้กับ python code ตัวอย่างนี้ใช้ statsmodels เพื่อนำ Logistic Regression มาสร้างโมเดล

python
import pandas as pd
import statsmodels.api as sm
from ISLP import load_data

# โหลดชุดข้อมูล Default
Default = load_data("Default")

# สร้างตัวแปรดัมมี่สำหรับสถานะนักเรียน (Student)
Default['student_yes'] = Default.student.map({'Yes': 1, 'No': 0})

# กำหนดตัวแปรพยากรณ์ (Predictors) และตัวแปรเป้าหมาย (Response Variable)
X = Default[['balance', 'income', 'student_yes']]  # ตัวแปรพยากรณ์
y = Default['default'] == 'Yes'  # แปลงค่าตัวแปรเป้าหมายเป็นค่าไบนารี (True = Default)

# สร้างโมเดลLogistic Regression 
model = sm.GLM(y, sm.add_constant(X), family=sm.families.Binomial())  # ใช้ family=Binomial() สำหรับ Logistic Regression
results = model.fit()

# แสดงผลลัพธ์ของโมเดล
print(results.summary())

# การทำนายค่าความน่าจะเป็นของลูกค้ารายใหม่
new_data = pd.DataFrame({
    'const': [1],  # Add constant term first
    'balance': [1500], 
    'income': [40000], 
    'student_yes': [0]
})  # ข้อมูลลูกค้าใหม่

predictions = results.predict(new_data)  # No need to add constant since we already included it
print(predictions)

การอธิบาย code

  • การโหลดข้อมูล: ใช้ load_data("Default") เพื่อโหลดชุดข้อมูล (เปลี่ยนจากปกติที่เราใช้ csv)
  • การเตรียมข้อมูล:
    • กำหนด ตัวแปรพยากรณ์ ได้แก่ balance, income, และ student_yes
    • แปลงค่าตัวแปรเป้าหมาย (default) ให้เป็นค่าทางตรรกะ (True หรือ False)
  • การสร้างโมเดล: ใช้ statsmodels เพื่อสร้าง model Logistic Regression โดยกำหนดให้เป็น Binomial Family
  • การทำนาย
    • ใช้ results.predict() เพื่อทำนายค่าความน่าจะเป็นของลูกค้ารายใหม่
    • ค่าที่ได้คือ ค่าความน่าจะเป็นของการผิดนัดชำระ

ผลลัพธ์

                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:                default   No. Observations:                10000
Model:                            GLM   Df Residuals:                     9996
Model Family:                Binomial   Df Model:                            3
Link Function:                  Logit   Scale:                          1.0000
Method:                          IRLS   Log-Likelihood:                -785.77
Date:                Sat, 15 Feb 2025   Deviance:                       1571.5
Time:                        13:53:57   Pearson chi2:                 7.00e+03
No. Iterations:                     9   Pseudo R-squ. (CS):             0.1262
Covariance Type:            nonrobust                                         
===============================================================================
                  coef    std err          z      P>|z|      [0.025      0.975]
-------------------------------------------------------------------------------
const         -10.8690      0.492    -22.079      0.000     -11.834      -9.904
balance         0.0057      0.000     24.737      0.000       0.005       0.006
income       3.033e-06    8.2e-06      0.370      0.712    -1.3e-05    1.91e-05
student_yes    -0.6468      0.236     -2.738      0.006      -1.110      -0.184
===============================================================================
0    0.104992
dtype: float64

อธิบายผลลัพธ์

  • Model Family: Binomial และใช้ Link Function แบบ Logit
  • การวิเคราะห์ตัวแปรอิสระ
    • a) balance (ยอดคงเหลือ)
      • coefficient = 0.0057
      • p-value < 0.001 (มีนัยสำคัญทางสถิติ)
      • เมื่อ balance เพิ่มขึ้น 1 หน่วย โอกาสการ default จะเพิ่มขึ้น (เนื่องจากค่า coefficient เป็นบวก)
    • b) income (รายได้)
      • coefficient = 3.033e-06 (ค่าน้อยมาก)
      • p-value = 0.712 (ไม่มีนัยสำคัญทางสถิติ เพราะมากกว่า 0.05)
      • รายได้ไม่มีผลอย่างมีนัยสำคัญต่อการ default
    • c) student_yes (สถานะการเป็นนักเรียน)
      • coefficient = -0.6468
      • p-value = 0.006 (มีนัยสำคัญทางสถิติ)
      • การเป็นนักเรียนมีผลในทางลบต่อการ default (ลดโอกาสการ default)
  • ค่าเฉลี่ยของการทำนายโอกาสการ default อยู่ที่ประมาณ 0.105 หรือ 10.5%
  • Pseudo R-squared: 0.1262 (12.62% ของความแปรปรวนในข้อมูลสามารถอธิบายได้ด้วยโมเดลนี้)
    • ค่าที่ค่อนข้างต่ำ (12.62%) บ่งชี้ว่าโมเดลนี้อาจจะยังไม่เหมาะสมเท่าที่ควรในการทำนายการ default
    • อาจมีปัจจัยสำคัญอื่นๆ ที่ส่งผลต่อการ default แต่ไม่ได้ถูกรวมอยู่ในโมเดล เช่น:
      • ประวัติการชำระเงิน
      • อายุของลูกค้า
      • ระยะเวลาการเป็นลูกค้า
      • สถานภาพการทำงาน
      • ประวัติเครดิต

โดยสรุป ปัจจัยที่มีผลอย่างมีนัยสำคัญต่อการ default คือ ยอดคงเหลือ (balance) และสถานะการเป็นนักเรียน (student) ในขณะที่รายได้ (income) ไม่มีผลอย่างมีนัยสำคัญ โมเดลนี้สามารถอธิบายความแปรปรวนของข้อมูลได้ประมาณ 12.62%

Naive Bayes classifier

ref: https://www.geeksforgeeks.org/naive-bayes-classifiers/

Naive Bayes Classifier เป็นวิธีการจำแนกประเภทที่ใช้ ทฤษฎีบทของเบย์ (Bayes’ Theorem) ในการประมาณความน่าจะเป็นของแต่ละคลาสเมื่อกำหนดค่าของตัวทำนาย (Predictors) แทนที่จะคำนวณค่าความน่าจะเป็นแบบปรับปรุง (Posterior Probability) โดยตรง Naive Bayes Classifier จะทำการประมาณการกระจายของตัวทำนายก่อน จากนั้นจึงใช้ทฤษฎีบทของเบย์เพื่อคำนวณ $Pr(Y = k | X = x)$

จุดสำคัญของ Naive Bayes Classifier

  • ค่าความน่าจะเป็นล่วงหน้า (Prior Probabilities) $π1,…,πK$ จะถูกประมาณโดยคำนวณจากสัดส่วนของข้อมูลฝึกสอนที่อยู่ในคลาสที่ k
  • ตัวจำแนกประเภทนี้ทำให้การประมาณค่าของ $f_1(x), \dots, f_K(x)$ ง่ายขึ้นโดยสมมติว่า ตัวทำนายทั้งหมดเป็นอิสระต่อกันภายในแต่ละคลาส
  • ภายใต้สมมติฐานของความเป็นอิสระ ความน่าจะเป็นแบบปรับปรุง (Posterior Probability) สามารถเขียนเป็น
$$Pr(Y = k|X = x) = \frac{\pi_k \times f_{k1}(x_1) \times f_{k2}(x_2) \times \dots \times f_{kp}(x_p)}{\sum_{l=1}^{K} \pi_l \times f_{l1}(x_1) \times f_{l2}(x_2) \times \dots \times f_{lp}(x_p)}$$

สำหรับ $k = 1, \dots, K$

  • หากตัวทำนาย $X_j$ เป็นตัวแปรเชิงปริมาณ (Quantitative Variable) สามารถสมมติได้ว่า $X_j | Y = k \sim N(\mu_{jk}, \sigma^2_{jk})$ ซึ่งเป็นการแจกแจงแบบปกติ (Gaussian Distribution)
  • หาก $X_j$ เป็นตัวแปรเชิงคุณภาพ (Qualitative Variable) สามารถคำนวณสัดส่วนของข้อมูลฝึกสอนที่แต่ละค่าของตัวทำนายปรากฏในแต่ละคลาส

แม้ว่าการสมมติว่าตัวทำนายเป็นอิสระต่อกันมักจะไม่เป็นจริงในทางปฏิบัติ แต่สมมติฐานนี้ช่วยให้การคำนวณง่ายขึ้น และสามารถให้ผลลัพธ์ที่ดี โดยเฉพาะเมื่อจำนวนข้อมูลฝึกสอนมีขนาดไม่ใหญ่มากเมื่อเทียบกับจำนวนตัวทำนาย แม้ว่า Naive Bayes จะตั้งสมมติฐานเพื่อความสะดวก แต่ก็มักให้ผลลัพธ์ที่ดีเพราะช่วยลดความแปรปรวนของแบบจำลอง

Naive Bayes สามารถใช้ได้กับทั้งตัวทำนายเชิงคุณภาพและเชิงปริมาณ โดย

  • สำหรับ ตัวทำนายเชิงปริมาณ มักสมมติให้มีการแจกแจงแบบ Gaussian
  • สำหรับ ตัวทำนายเชิงคุณภาพ สามารถใช้การนับสัดส่วนของข้อมูลฝึกสอนที่อยู่ในแต่ละคลาสเพื่อคำนวณค่าความน่าจะเป็น

Naive Bayes เป็นวิธีที่เรียบง่ายแต่ทรงพลัง และมักถูกใช้ในงานที่เกี่ยวข้องกับ การจำแนกประเภท (Classification) เช่น การจำแนกอีเมลสแปม, การวิเคราะห์ข้อความ และการตรวจจับความรู้สึก (Sentiment Analysis)

ตัวอย่างปัญหา

ในตัวอย่างนี้ เราจะใช้ Naive Bayes Classifier จาก sklearn.naive_bayes เพื่อจำแนกทิศทางของตลาดหุ้น (Direction: Up หรือ Down) โดยใช้ชุดข้อมูล Smarket ซึ่งประกอบด้วยตัวทำนายเชิงปริมาณ เช่น Lag1, Lag2 (ผลตอบแทนของตลาดในวันก่อนหน้า)

code python

python
import pandas as pd
import numpy as np
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# โหลดข้อมูล Smarket จาก ISLP package
from ISLP import load_data
smarket = load_data('Smarket')

# แสดงตัวอย่างข้อมูล
print(smarket.head())

# แปลงค่าตัวแปรเป้าหมาย ('Direction') เป็นตัวเลข (Up -> 1, Down -> 0)
smarket['Direction'] = smarket['Direction'].map({'Up': 1, 'Down': 0})

# เลือกเฉพาะตัวแปรเชิงปริมาณเป็นตัวทำนาย (Lag1, Lag2)
X = smarket[['Lag1', 'Lag2']]
y = smarket['Direction']

# แบ่งข้อมูลเป็นชุดฝึก (80%) และชุดทดสอบ (20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# แสดงขนาดของชุดข้อมูลที่แบ่งแล้ว
print(f"Training set size: {len(X_train)}")
print(f"Test set size: {len(X_test)}")

# สร้างโมเดล Naive Bayes
NB = GaussianNB()

# ฝึกโมเดลด้วยชุดข้อมูลฝึก
NB.fit(X_train, y_train)

# ตรวจสอบคลาสที่โมเดลเรียนรู้
print("Class labels:", NB.classes_)

# ค่าเฉลี่ยของแต่ละตัวทำนายในแต่ละคลาส
print("Mean of each feature per class:\n", NB.theta_)

# ค่าความแปรปรวนของแต่ละตัวทำนายในแต่ละคลาส
print("Variance of each feature per class:\n", NB.var_)

# ทำนายผลลัพธ์จากชุดทดสอบ
y_pred = NB.predict(X_test)

# คำนวณความแม่นยำของโมเดล
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")

# แสดง Confusion Matrix
conf_matrix = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:\n", conf_matrix)

# รายงานผลการจำแนกประเภท
print("Classification Report:\n", classification_report(y_test, y_pred, target_names=['Down', 'Up']))

# แสดงความน่าจะเป็นที่ตัวอย่างในชุดทดสอบจะเป็น 'Up' หรือ 'Down'
probs = NB.predict_proba(X_test)
print("Predicted Probabilities (first 5 rows):\n", probs[:5])

คำอธิบาย code

  • GaussianNB ใช้สำหรับ Naive Bayes Classifier แบบ Gaussian Distribution
  • train_test_split แบ่งข้อมูลเป็น ชุดฝึก (Train) และ ชุดทดสอบ (Test)
  • accuracy_score, confusion_matrix และ classification_report ใช้วัดผลลัพธ์ของโมเดล
  • ตัวข้อมูล ใช้ ISLP โหลดชุดข้อมูล Smarket
    • Direction เป็นตัวแปรเป้าหมาย (Target Variable) ที่บอกว่า ตลาดจะขึ้น (Up) หรือ ลง (Down)
    • Lag1 และ Lag2 เป็นตัวแปรเชิงปริมาณที่ใช้เป็นตัวทำนาย
    • แบ่งข้อมูลเป็น 80% สำหรับฝึก และ 20% สำหรับทดสอบ
  • ใช้คำสั่ง NB.fit(X_train, y_train) ฝึกโมเดลด้วย ข้อมูลฝึกที่เตรียมไว้
  • สุดท้ายผลลัพธ์ที่ได้จาก GaussianNB
    • NB.classes_ → แสดงคลาสที่โมเดลเรียนรู้ (Up, Down)
    • NB.theta_ → แสดงค่าเฉลี่ยของ Lag1 และ Lag2 สำหรับแต่ละคลาส
    • NB.var_ → แสดงค่าความแปรปรวนของ Lag1 และ Lag2 สำหรับแต่ละคลาส
    • NB.predict(X_test) ใช้โมเดลที่ฝึกไว้เพื่อทำนาย Direction (Up/Down)
  • ส่วนของการวัดผล
    • accuracy_score(y_test, y_pred) คำนวณ Accuracy ของโมเดล
    • confusion_matrix(y_test, y_pred) แสดง Confusion Matrix
    • classification_report(y_test, y_pred) แสดงค่า Precision, Recall และ F1-score

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

python
   Year   Lag1   Lag2   Lag3   Lag4   Lag5  Volume  Today Direction
0  2001  0.381 -0.192 -2.624 -1.055  5.010  1.1913  0.959        Up
1  2001  0.959  0.381 -0.192 -2.624 -1.055  1.2965  1.032        Up
2  2001  1.032  0.959  0.381 -0.192 -2.624  1.4112 -0.623      Down
3  2001 -0.623  1.032  0.959  0.381 -0.192  1.2760  0.614        Up
4  2001  0.614 -0.623  1.032  0.959  0.381  1.2057  0.213        Up
Training set size: 1000
Test set size: 250
Class labels: [0 1]
Mean of each feature per class:
 [[ 0.08348723  0.05406809]
 [-0.02970943 -0.0178283 ]]
Variance of each feature per class:
 [[1.32469991 1.23959474]
 [1.15414993 1.24564215]]
Accuracy: 0.4640
Confusion Matrix:
 [[ 19 113]
 [ 21  97]]
Classification Report:
               precision    recall  f1-score   support

        Down       0.47      0.14      0.22       132
          Up       0.46      0.82      0.59       118
...
 [0.47483613 0.52516387]
 [0.69119749 0.30880251]
 [0.4496747  0.5503253 ]
 [0.57159402 0.42840598]]

จากผลลัพธ์นี้หมายความว่า

  • โมเดลสามารถทำนายได้ถูกต้อง 46.40% ของข้อมูลทดสอบทั้งหมด

  • จาก Confusion Matrix

    [[TN=19  FP=113]
     [FN=21  TP=97 ]]
    • True Negative (ทำนาย Down ถูก): 19 ครั้ง
    • False Positive (ทำนาย Up ผิด จริงๆควรเป็น Down): 113 ครั้ง
    • False Negative (ทำนาย Down ผิด จริงๆควรเป็น Up): 21 ครั้ง
    • True Positive (ทำนาย Up ถูก): 97 ครั้ง
  • Classification Report

    • สำหรับ class Down:
      • Precision: 0.47 (47% ของการทำนายว่าเป็น Down ถูกต้อง)
      • Recall: 0.14 (14% ของ Down ทั้งหมดถูกทำนายถูก)
      • F1-score: 0.22 (ค่าเฉลี่ยระหว่าง Precision และ Recall)
    • สำหรับ class Up:
      • Precision: 0.46 (46% ของการทำนายว่าเป็น Up ถูกต้อง)
      • Recall: 0.82 (82% ของ Up ทั้งหมดถูกทำนายถูก)
      • F1-score: 0.59 (ค่าเฉลี่ยระหว่าง Precision และ Recall)

อธิบายเพิ่มเติมเรื่อง Confusion Matrix

Confusion Matrix เป็นเครื่องมือที่ใช้วัดประสิทธิภาพของโมเดล Machine Learning ในงาน Classification โดยแสดงการเปรียบเทียบระหว่างค่าที่ทำนายได้ (Predicted) กับค่าที่เป็นจริง (Actual)

ในกรณีของข้อมูลที่มี 2 classes (Binary Classification) คือ Up และ Down เมทริกซ์จะมีขนาด 2x2:

           Predicted
           Down    Up
Actual Down  19   113   
      Up     21    97

แต่ละช่องในเมทริกซ์มีความหมายดังนี้:

  1. True Negative (TN) = 19 —> ค่าจริงเป็น Down และทำนายว่าเป็น Down (ทำนายถูก)
  2. False Positive (FP) = 113 —> ค่าจริงเป็น Down แต่ทำนายว่าเป็น Up (ทำนายผิด)
  3. False Negative (FN) = 21 —> ค่าจริงเป็น Up แต่ทำนายว่าเป็น Down (ทำนายผิด)
  4. True Positive (TP) = 97 —> ค่าจริงเป็น Up และทำนายว่าเป็น Up (ทำนายถูก)

จากเมทริกซ์นี้เราสามารถคำนวณค่าต่างๆ ได้เป็น

  • Accuracy = (TN + TP) / (TN + FP + FN + TP) = (19 + 97) / (19 + 113 + 21 + 97) = 0.464 หรือ 46.4%
  • Precision (ความแม่นยำ) = TP / (TP + FP)
    • สำหรับ Up: 97 / (97 + 113) = 0.46 หรือ 46%
  • Recall (ความครบถ้วน) = TP / (TP + FN)
    • สำหรับ Up: 97 / (97 + 21) = 0.82 หรือ 82%

Confusion Matrix ช่วยให้เราเห็นว่าโมเดลทำผิดพลาดในลักษณะใด เช่น ในกรณีนี้โมเดลมีแนวโน้มที่จะทำนายผิดพลาดโดยทำนายว่าเป็น Up เมื่อค่าจริงเป็น Down (FP สูงถึง 113 ครั้ง) ซึ่งข้อมูลนี้มีประโยชน์ในการปรับปรุงโมเดลต่อไป