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