Skip to main content

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)=eβ0+β1X1+eβ0+β1X 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 เปลี่ยนไปตามค่า β1\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)=eβ0+β1X1+eβ0+β1Xp(X) = \frac{e^{\beta_0 + \beta_1X}}{1 + e^{\beta_0 + \beta_1X}}

    โดยที่

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

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

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

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

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

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=kX=x)Pr(Y = k | X = x)

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

  • ค่าความน่าจะเป็นล่วงหน้า (Prior Probabilities) π1,,πKπ1,…,πK จะถูกประมาณโดยคำนวณจากสัดส่วนของข้อมูลฝึกสอนที่อยู่ในคลาสที่ k
  • ตัวจำแนกประเภทนี้ทำให้การประมาณค่าของ f1(x),,fK(x)f_1(x), \dots, f_K(x) ง่ายขึ้นโดยสมมติว่า ตัวทำนายทั้งหมดเป็นอิสระต่อกันภายในแต่ละคลาส
  • ภายใต้สมมติฐานของความเป็นอิสระ ความน่าจะเป็นแบบปรับปรุง (Posterior Probability) สามารถเขียนเป็น
Pr(Y=kX=x)=πk×fk1(x1)×fk2(x2)××fkp(xp)l=1Kπl×fl1(x1)×fl2(x2)××flp(xp)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,,Kk = 1, \dots, K

  • หากตัวทำนาย XjX_j เป็นตัวแปรเชิงปริมาณ (Quantitative Variable) สามารถสมมติได้ว่า XjY=kN(μjk,σjk2)X_j | Y = k \sim N(\mu_{jk}, \sigma^2_{jk}) ซึ่งเป็นการแจกแจงแบบปกติ (Gaussian Distribution)
  • หาก XjX_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

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

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

   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 ครั้ง) ซึ่งข้อมูลนี้มีประโยชน์ในการปรับปรุงโมเดลต่อไป