ปรึกษา Data Mining
Data Mining • Chapter 8

บทที่ 8 ซัพพอร์ตเวกเตอร์แมชชีน: การจำแนกข้อมูลด้วย SVM

เรียนรู้ Support Vector Machine ตั้งแต่แนวคิด Hyperplane, Margin, Support Vectors, Kernel Trick, Feature Scaling, การสร้างโมเดลด้วย Python และตัวอย่างการประยุกต์ใช้ทั้ง Classification และ Regression

สาระสำคัญของบทนี้

  • แนวคิด Hyperplane, Margin และ Support Vectors
  • Kernel Trick: Linear, Polynomial และ RBF
  • Feature Scaling และพารามิเตอร์ C, Gamma
  • ตัวอย่าง Breast Cancer, MNIST และ SVR ราคาทองคำ

0. ทบทวนก่อนเรียน

ก่อนเข้าสู่ SVM ควรเข้าใจภาพรวมของการเรียนรู้ของเครื่อง โดยเฉพาะ Supervised Learning ซึ่งเป็นการฝึกโมเดลจากข้อมูลที่มีป้ายกำกับ เช่น ข้อมูลผู้ป่วยที่มีคำตอบว่าเป็นโรคหรือไม่เป็นโรค ข้อมูลอีเมลที่มีคำตอบว่าเป็นสแปมหรือไม่เป็นสแปม และข้อมูลภาพตัวเลขที่มีป้ายกำกับเป็นตัวเลข 0–9

Supervised Learning

โมเดลเรียนรู้จากข้อมูลที่มีคำตอบ เช่น Classification และ Regression

Unsupervised Learning

โมเดลค้นหารูปแบบจากข้อมูลที่ไม่มีป้ายกำกับ เช่น Clustering

Features และ Labels

Features คือคุณลักษณะนำเข้า ส่วน Labels คือคำตอบหรือคลาสที่ต้องการทำนาย

Train/Test Split

แบ่งข้อมูลเป็นชุดฝึกสอนและชุดทดสอบ เช่น 70/30, 80/20 หรือ 90/10

Training Set และ Test Set

Training Set คือข้อมูลที่ใช้ให้โมเดลเรียนรู้รูปแบบและความสัมพันธ์ระหว่าง Features กับ Labels ส่วน Test Set คือข้อมูลที่โมเดลไม่เคยเห็นมาก่อน ใช้ประเมินว่าโมเดลสามารถทำงานกับข้อมูลใหม่ได้ดีเพียงใด การแบ่งข้อมูลช่วยลดปัญหา Overfitting และเพิ่มความน่าเชื่อถือของผลลัพธ์

K-Fold Cross-Validation

K-Fold Cross-Validation เป็นเทคนิคประเมินโมเดลโดยแบ่งข้อมูลเป็น K ส่วน ในแต่ละรอบจะใช้หนึ่งส่วนเป็นชุดทดสอบ และใช้ส่วนที่เหลือเป็นชุดฝึก ทำซ้ำจนครบทุกส่วน จากนั้นนำผลลัพธ์มาเฉลี่ย ทำให้การประเมินมีความเสถียรมากขึ้น โดยค่าที่ใช้บ่อยคือ K = 5 หรือ K = 10

ข้อควรระวัง

SVM ไวต่อสเกลของข้อมูลมาก ดังนั้นก่อนสร้างโมเดลมักต้องทำ Feature Scaling เช่น StandardScaler เพื่อให้ฟีเจอร์ต่าง ๆ อยู่ในช่วงค่าที่เหมาะสม

8.1 ความหมายของ Support Vector Machine (SVM)

Support Vector Machine (SVM) เป็นอัลกอริทึมการเรียนรู้ของเครื่องแบบมีผู้สอน ใช้ได้ทั้งงาน Classification และ Regression โดยมีชื่อเสียงมากในงานจำแนกข้อมูลแบบสองกลุ่ม หรือ Binary Classification เช่น แยกข้อมูลเป็น “ผ่าน/ไม่ผ่าน”, “สแปม/ไม่สแปม”, “เป็นโรค/ไม่เป็นโรค”

แนวคิดหลักของ SVM คือการหาขอบเขตสำหรับแบ่งข้อมูลออกเป็นกลุ่มต่าง ๆ ให้เหมาะสมที่สุด ขอบเขตนี้เรียกว่า Hyperplane โดย SVM จะพยายามเลือก Hyperplane ที่ทำให้ระยะห่างระหว่างข้อมูลทั้งสองกลุ่มกว้างที่สุด หรือที่เรียกว่า Maximum Margin

อธิบายแบบง่าย

ลองจินตนาการว่ามีจุดสีน้ำเงินและจุดสีเขียวบนกระดาษ SVM จะพยายามลากเส้นแบ่งจุดทั้งสองสีออกจากกัน โดยเลือกเส้นที่อยู่ห่างจากจุดของทั้งสองฝั่งมากที่สุด เพื่อให้การจำแนกข้อมูลใหม่มีโอกาสผิดพลาดน้อยลง

8.2 หลักการพื้นฐานของซัพพอร์ตเวกเตอร์แมชชีน

SVM ทำงานโดยหาขอบเขตการตัดสินใจที่ดีที่สุด ในข้อมูล 2 มิติ Hyperplane จะเป็นเส้นตรง แต่เมื่อข้อมูลมีหลายมิติ Hyperplane จะกลายเป็นระนาบหรือพื้นผิวที่ใช้แบ่งข้อมูลออกจากกัน

Hyperplane

เส้นหรือพื้นผิวที่ใช้แบ่งข้อมูลออกเป็นคลาส เช่น เส้นแบ่งกลุ่ม A และกลุ่ม B

Margin

ระยะห่างระหว่าง Hyperplane กับข้อมูลที่อยู่ใกล้ที่สุดของแต่ละกลุ่ม

Support Vectors

ข้อมูลที่อยู่ใกล้ Hyperplane มากที่สุด และมีผลต่อการกำหนดเส้นแบ่งอย่างมาก

Maximum Margin

เป้าหมายของ SVM คือเลือก Hyperplane ที่ให้ Margin กว้างที่สุด

Hyperplane ในหลายมิติ

ในข้อมูล 2 มิติ Hyperplane อาจเป็นเส้นตรง เช่น เส้นแบ่งข้อมูลบนแกน x-y แต่ในข้อมูล 3 มิติ Hyperplane จะเป็นระนาบ และในข้อมูลที่มีจำนวนฟีเจอร์มากกว่า 3 มิติ Hyperplane จะเป็นพื้นผิวในมิติสูง ซึ่งมองเห็นได้ยาก แต่หลักการยังเหมือนเดิม คือแบ่งข้อมูลให้มี Margin กว้างที่สุด

แนวคิดสำคัญ: SVM ไม่ได้มองหาเพียงเส้นที่แบ่งข้อมูลได้ แต่ต้องการเส้นที่แบ่งข้อมูลได้ “ดีที่สุด” โดยพิจารณาจาก Margin และ Support Vectors

Kernel Trick และพารามิเตอร์สำคัญ

ในบางกรณีข้อมูลไม่สามารถแบ่งด้วยเส้นตรงในพื้นที่เดิมได้ SVM จึงใช้เทคนิคที่เรียกว่า Kernel Trick เพื่อแปลงข้อมูลไปยังพื้นที่ใหม่ที่มีมิติสูงขึ้น ทำให้ข้อมูลสามารถแบ่งแยกได้ง่ายขึ้นโดยไม่จำเป็นต้องคำนวณพิกัดในมิติสูงโดยตรง

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

พารามิเตอร์ C และ Gamma

  • C: ควบคุมการยอมให้เกิดข้อผิดพลาดในข้อมูลฝึก ค่า C ต่ำทำให้โมเดลยอมผิดพลาดบ้างและอาจ Generalize ได้ดีขึ้น ส่วนค่า C สูงพยายามจำแนกข้อมูลฝึกให้ถูกมากที่สุด แต่อาจเสี่ยง Overfitting
  • Gamma: ใช้กับ Kernel เช่น RBF เพื่อกำหนดอิทธิพลของจุดข้อมูลแต่ละจุด ค่า Gamma สูงทำให้ขอบเขตซับซ้อนและโค้งมากขึ้น ส่วนค่า Gamma ต่ำทำให้ขอบเขตเรียบขึ้น
  • Kernel: เลือกรูปแบบการแปลงข้อมูล เช่น linear, poly หรือ rbf

8.3 ขั้นตอนการจำแนกข้อมูลด้วย SVM

การสร้างโมเดล SVM ควรทำเป็นลำดับ เพื่อให้ได้โมเดลที่มีความถูกต้องและใช้งานได้จริง

การเตรียมข้อมูล

รวบรวมข้อมูล ทำความสะอาดข้อมูล จัดการ Missing Value และแปลงข้อมูลให้อยู่ในรูปแบบที่โมเดลเรียนรู้ได้

การแบ่งข้อมูล

แบ่งเป็น Training Set และ Test Set เช่น 70/30 หรือ 80/20 เพื่อประเมินโมเดลกับข้อมูลที่ไม่เคยเห็นมาก่อน

Feature Scaling

ใช้ Standardization หรือ Normalization เพราะ SVM ไวต่อขนาดของฟีเจอร์

เลือกและฝึกโมเดล

เลือก Kernel เช่น linear หรือ rbf แล้วฝึกโมเดลด้วยชุดข้อมูลฝึก

ทดสอบโมเดล

ทำนายข้อมูลชุดทดสอบและประเมินด้วย Accuracy, Precision, Recall และ F1-score

ปรับปรุงโมเดล

ปรับ C, Gamma, Kernel และใช้ Cross-Validation เพื่อลด Overfitting

นำโมเดลไปใช้งาน

เมื่อตรวจสอบว่าโมเดลมีประสิทธิภาพเพียงพอแล้ว จึงนำไปทำนายข้อมูลใหม่หรือใช้งานในระบบจริง

8.4 ตัวอย่างการจำแนกข้อมูล Breast Cancer Dataset

Breast Cancer Dataset จาก scikit-learn เป็นชุดข้อมูลยอดนิยมสำหรับการจำแนกประเภท โดยใช้ฟีเจอร์เชิงตัวเลขของเซลล์มะเร็งเต้านม เพื่อจำแนกว่าเป็นชนิดร้ายแรงหรือไม่ร้ายแรง ชุดข้อมูลนี้มี 569 ตัวอย่าง และมีฟีเจอร์เชิงตัวเลข 30 ฟีเจอร์ เช่น mean radius, mean texture, mean perimeter, mean area และ mean smoothness

คอลัมน์ความหมาย
mean radiusรัศมีเฉลี่ยของเซลล์
mean textureความสม่ำเสมอของเซลล์
mean perimeterเส้นรอบวงเฉลี่ยของเซลล์
mean areaพื้นที่เฉลี่ยของเซลล์
worst radiusรัศมีของเซลล์ที่แย่ที่สุด
targetป้ายกำกับสำหรับจำแนกชนิดของเซลล์

ตัวอย่าง Python: SVM Classification ด้วย Breast Cancer Dataset

ตัวอย่างนี้ใช้ `SVC` จาก scikit-learn โดยมีขั้นตอนสำคัญคือ โหลดข้อมูล แบ่งข้อมูล ทำ Feature Scaling ฝึกโมเดล และประเมินผล

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import classification_report, accuracy_score

# โหลดข้อมูล Breast Cancer Dataset
data = datasets.load_breast_cancer()
X = data.data
y = data.target

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

# ทำ Feature Scaling
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# สร้างและฝึกโมเดล SVM
model = SVC(kernel='linear')
model.fit(X_train, y_train)

# ทำนายผลและประเมินโมเดล
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Classification Report:\n", classification_report(y_test, y_pred))

อธิบายโค้ด

  • `datasets.load_breast_cancer()` ใช้โหลดชุดข้อมูลตัวอย่าง
  • `train_test_split()` แบ่งข้อมูลเป็นชุดฝึกและชุดทดสอบ
  • `StandardScaler()` ปรับสเกลของข้อมูลให้เหมาะกับ SVM
  • `SVC(kernel='linear')` สร้างโมเดล SVM แบบ Linear Kernel
  • `classification_report()` แสดง Precision, Recall, F1-score และ Support

8.5 การประยุกต์ใช้ซัพพอร์ตเวกเตอร์แมชชีน

SVM ถูกใช้ในงานหลากหลาย เพราะสามารถจำแนกข้อมูลที่ซับซ้อนได้ดี โดยเฉพาะในกรณีที่จำนวนฟีเจอร์มีมาก และข้อมูลสามารถแยกได้ด้วยขอบเขตที่เหมาะสม

การจดจำลายมือ

จำแนกตัวเลขหรือตัวอักษรที่เขียนด้วยมือ เช่น MNIST

การจำแนกอีเมล

แยกอีเมลเป็นสแปมหรือไม่เป็นสแปม

การตรวจจับวัตถุ

ใช้ในงานภาพเพื่อแยกวัตถุออกจากฉากหลัง

การวิเคราะห์ทางการแพทย์

จำแนกประเภทของเซลล์หรือประเมินความเสี่ยงจากข้อมูลสุขภาพ

ตัวอย่าง SVM สำหรับจดจำตัวเลขเขียนมือ

ตัวอย่างนี้ใช้ชุดข้อมูล `digits` จาก scikit-learn ซึ่งเป็นภาพตัวเลข 0–9 ขนาด 8x8 พิกเซล โดยแปลงภาพเป็นฟีเจอร์ 64 ค่า แล้วใช้ SVM แบบ RBF Kernel เพื่อจำแนกตัวเลข

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import classification_report, accuracy_score
import matplotlib.pyplot as plt

# โหลดข้อมูลตัวเลขเขียนมือ
digits = datasets.load_digits()

# แยกฟีเจอร์และป้ายกำกับ
X = digits.data      # ภาพ 8x8 ถูกแปลงเป็น 64 ฟีเจอร์
y = digits.target    # ป้ายกำกับ 0-9

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

# สร้างโมเดล SVM ด้วย RBF Kernel
svm_model = SVC(kernel='rbf', gamma=0.001, C=10)
svm_model.fit(X_train, y_train)

# ทำนายผล
y_pred = svm_model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))

# แสดงตัวอย่างผลลัพธ์
plt.matshow(X_test[0].reshape(8, 8), cmap='gray')
plt.title(f"Predicted: {y_pred[0]}, True: {y_test[0]}")
plt.show()

ตัวอย่าง Support Vector Regression (SVR)

นอกจาก SVM สำหรับจำแนกข้อมูลแล้ว ยังมี Support Vector Regression (SVR) สำหรับทำนายค่าตัวเลขต่อเนื่อง เช่น ราคาทองคำ อุณหภูมิ หรือค่าผลผลิต โดย SVR สามารถใช้ Kernel Trick เช่น RBF เพื่อรับมือกับข้อมูลที่ไม่เป็นเส้นตรงได้

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.svm import SVR
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_absolute_error, mean_squared_error

# ตัวอย่างข้อมูลราคาทองคำรายวัน
data = {
    'Day': np.arange(1, 11),
    'Price': [1800, 1812, 1795, 1805, 1820, 1830, 1815, 1840, 1855, 1860]
}
df = pd.DataFrame(data)

X = df[['Day']].values
y = df['Price'].values

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

scaler_x = StandardScaler()
scaler_y = StandardScaler()
X_train_scaled = scaler_x.fit_transform(X_train)
y_train_scaled = scaler_y.fit_transform(y_train.reshape(-1, 1)).ravel()

svr = SVR(kernel='rbf', C=100, gamma=0.1, epsilon=0.1)
svr.fit(X_train_scaled, y_train_scaled)

X_test_scaled = scaler_x.transform(X_test)
y_pred_scaled = svr.predict(X_test_scaled)
y_pred = scaler_y.inverse_transform(y_pred_scaled.reshape(-1, 1)).ravel()

mae = mean_absolute_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
print("MAE:", mae)
print("RMSE:", rmse)

# ทำนายวันที่ 11, 12, 13
unknown_days = np.array([[11], [12], [13]])
unknown_days_scaled = scaler_x.transform(unknown_days)
unknown_pred_scaled = svr.predict(unknown_days_scaled)
unknown_pred = scaler_y.inverse_transform(unknown_pred_scaled.reshape(-1, 1)).ravel()
print(unknown_pred)

ข้อดีและข้อจำกัดของ SVM

ข้อดี

  • ทำงานได้ดีในข้อมูลที่มีหลายฟีเจอร์
  • เหมาะกับ Binary Classification
  • ใช้ Kernel Trick กับข้อมูลไม่เป็นเส้นตรงได้
  • ให้แนวคิดการแบ่งข้อมูลที่ชัดเจนด้วย Margin

ข้อจำกัด

  • ใช้เวลาคำนวณมากเมื่อข้อมูลมีขนาดใหญ่
  • ต้องปรับพารามิเตอร์ C, Gamma และ Kernel อย่างเหมาะสม
  • ไวต่อสเกลของข้อมูล จึงต้องทำ Feature Scaling
  • ตีความผลลัพธ์ยากกว่า Decision Tree

8.6 สรุปบทเรียน

Support Vector Machine เป็นเทคนิคการเรียนรู้ของเครื่องที่มีประสิทธิภาพสูงสำหรับการจำแนกข้อมูล โดยเน้นการหา Hyperplane ที่แบ่งข้อมูลได้ดีที่สุดและมี Margin กว้างที่สุด จุดข้อมูลที่สำคัญที่สุดในการกำหนดเส้นแบ่งคือ Support Vectors หากข้อมูลไม่สามารถแบ่งด้วยเส้นตรง SVM สามารถใช้ Kernel Trick เช่น RBF เพื่อแปลงข้อมูลไปยังพื้นที่ใหม่และสร้างขอบเขตการตัดสินใจที่ยืดหยุ่นขึ้น

ในการใช้งานจริง ผู้เรียนควรให้ความสำคัญกับการเตรียมข้อมูล การทำ Feature Scaling การเลือก Kernel การปรับ C และ Gamma รวมถึงการประเมินผลด้วย Train/Test Split หรือ K-Fold Cross-Validation เพื่อให้โมเดลมีความแม่นยำและสามารถใช้งานกับข้อมูลใหม่ได้ดี

แบบฝึกหัดท้ายบท

  1. อธิบายความหมายของ Hyperplane, Margin และ Support Vectors ด้วยภาษาของตนเอง
  2. เปรียบเทียบ Linear Kernel, Polynomial Kernel และ RBF Kernel ว่าเหมาะกับข้อมูลลักษณะใด
  3. ทำไม SVM จึงควรทำ Feature Scaling ก่อนฝึกโมเดล?
  4. ทดลองเปลี่ยนค่า C และ Gamma ในตัวอย่าง MNIST แล้วบันทึกผล Accuracy
  5. เลือกชุดข้อมูลจาก Kaggle หรือ UCI 1 ชุด แล้วสร้างโมเดล SVM พร้อมรายงาน Accuracy, Precision, Recall และ F1-score
  6. เปรียบเทียบผลลัพธ์ระหว่าง SVM, Decision Tree และ Random Forest บนชุดข้อมูลเดียวกัน

เชื่อมโยงกับบทอื่น

บทที่ 8 เป็นการต่อยอดจากบทที่ 6 Decision Tree และบทที่ 7 Random Forest โดยยังอยู่ในกลุ่มเทคนิค Classification แต่ SVM มีแนวคิดต่างออกไป คือการหาขอบเขตการแบ่งข้อมูลที่ดีที่สุดตามหลัก Maximum Margin

อ่านต่อ

ลำดับบทเรียนเหมืองข้อมูล

เรียนต่อเนื่องตั้งแต่พื้นฐานจนถึงเทคนิคการจำแนกข้อมูลด้วย Machine Learning