|
|
'''
|
|
|
🧠 1. SVM là gì?
|
|
|
SVM là một thuật toán phân loại (classification) trong Machine Learning.
|
|
|
Nó tìm ra một đường ranh giới (hyperplane) để phân tách các nhóm dữ liệu khác nhau.
|
|
|
|
|
|
Ví dụ:
|
|
|
Nếu dữ liệu có 2 lớp (A và B), SVM tìm đường thẳng (2D) hoặc mặt phẳng (3D) sao cho:
|
|
|
Hai nhóm tách nhau rõ nhất.
|
|
|
Khoảng cách (margin) từ ranh giới đến điểm gần nhất của mỗi nhóm là lớn nhất.
|
|
|
'''
|
|
|
|
|
|
'''
|
|
|
🧩 2. Ý tưởng trực quan
|
|
|
Hãy tưởng tượng:
|
|
|
Bạn có hai nhóm điểm đỏ 🔴 và xanh 🔵.
|
|
|
Có nhiều cách vẽ đường thẳng chia 2 nhóm này.
|
|
|
SVM chọn đường chia có khoảng cách xa nhất với cả hai nhóm.
|
|
|
👉 Vì khoảng cách lớn → mô hình tổng quát tốt → ít lỗi khi gặp dữ liệu mới.
|
|
|
'''
|
|
|
|
|
|
'''
|
|
|
⚖️ 3. Khi dữ liệu bị lẫn (không tách được thẳng)
|
|
|
Nếu các điểm bị xen kẽ (không thể chia bằng đường thẳng),
|
|
|
SVM dùng kernel trick để:
|
|
|
“Nâng dữ liệu lên không gian cao hơn”
|
|
|
Ở đó, có thể tìm được đường chia tuyến tính dễ hơn.
|
|
|
'''
|
|
|
|
|
|
'''
|
|
|
🧮 4. Tham số quan trọng
|
|
|
| Tham số | Ý nghĩa | Cách chọn |
|
|
|
| ---------- | ------------------------------------- | ---------------------------------------------- |
|
|
|
| C | Cân bằng giữa “ít lỗi” và “biên rộng” | Bắt đầu với 1, rồi thử 0.1 → 10 |
|
|
|
| kernel | Kiểu ranh giới | `'linear'` (đường thẳng) hoặc `'rbf'` ( đường cong) |
|
|
|
| gamma | Mức “uốn cong” khi dùng RBF kernel | Giá trị nhỏ = biên mềm, lớn = biên sát dữ liệu |
|
|
|
'''
|
|
|
|
|
|
|
|
|
from sklearn.svm import SVC
|
|
|
from sklearn.preprocessing import StandardScaler
|
|
|
from sklearn.pipeline import make_pipeline
|
|
|
from sklearn.model_selection import train_test_split
|
|
|
from sklearn.datasets import load_iris
|
|
|
|
|
|
|
|
|
X, y = load_iris(return_X_y=True)
|
|
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
|
|
|
|
|
|
|
|
|
model = make_pipeline(StandardScaler(), SVC(kernel='rbf', C=1, gamma='scale'))
|
|
|
|
|
|
|
|
|
model.fit(X_train, y_train)
|
|
|
|
|
|
|
|
|
print("Độ chính xác:", model.score(X_test, y_test))
|
|
|
|
|
|
'''
|
|
|
✅ Giải thích:
|
|
|
StandardScaler() → chuẩn hóa dữ liệu (rất quan trọng)
|
|
|
SVC() → SVM classifier
|
|
|
kernel='rbf' → chọn ranh giới cong
|
|
|
C và gamma → điều chỉnh độ khớp của mô hình
|
|
|
'''
|
|
|
'''
|
|
|
📈 6. Khi nào nên dùng SVM?
|
|
|
✅ Khi:
|
|
|
Dữ liệu vừa phải (không quá lớn)
|
|
|
Rõ ràng giữa các lớp
|
|
|
Muốn mô hình mạnh, chính xác
|
|
|
|
|
|
❌ Tránh:
|
|
|
Dữ liệu cực lớn (hàng trăm ngàn mẫu)
|
|
|
Cần mô hình dễ giải thích
|
|
|
'''
|
|
|
'''
|
|
|
7. Ứng dụng thực tế
|
|
|
Email spam / không spam
|
|
|
Ảnh có mèo / không mèo
|
|
|
Dự đoán bệnh / không bệnh
|
|
|
Nhận diện khuôn mặt (Face Recognition)
|
|
|
Nhận diện vật thể (Object Classification)
|
|
|
Nhận dạng chữ viết tay (Handwritten Digit Recognition)
|
|
|
Phân loại văn bản (Text Classification)
|
|
|
Nhận dạng cảm xúc (Sentiment Analysis)
|
|
|
Phân loại tế bào ung thư (Cancer Cell Classification)
|
|
|
Dự đoán hoạt động gen hoặc protein
|
|
|
Phát hiện gian lận thẻ tín dụng (Fraud Detection)
|
|
|
Dự đoán rủi ro tín dụng (Credit Risk Scoring)
|
|
|
Phân loại tín hiệu thị trường chứng khoán (Up / Down)
|
|
|
Nhận dạng vật cản / đường đi cho robot tự hành
|
|
|
Dự đoán sự cố thiết bị (predictive maintenance)
|
|
|
Kiểm tra chất lượng sản phẩm (Quality Control)
|
|
|
Phân tích quy trình (Process Optimization)
|
|
|
'''
|
|
|
|
|
|
|
|
|
import pandas as pd
|
|
|
import numpy as np
|
|
|
import matplotlib.pyplot as plt
|
|
|
from sklearn.svm import SVC
|
|
|
from sklearn.preprocessing import StandardScaler
|
|
|
from sklearn.model_selection import train_test_split
|
|
|
from sklearn.pipeline import make_pipeline
|
|
|
|
|
|
|
|
|
data = pd.read_csv(r"C:\Users\Microsoft\Machine-Learning-Tutorial\data.csv")
|
|
|
|
|
|
|
|
|
X = data.iloc[:, :-1].values
|
|
|
y = data.iloc[:, -1].values
|
|
|
|
|
|
|
|
|
if X.shape[1] != 2:
|
|
|
raise ValueError("⚠️ Dữ liệu phải có đúng 2 cột đặc trưng để vẽ biểu đồ 2D!")
|
|
|
|
|
|
|
|
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
|
|
|
|
|
|
|
|
|
model = make_pipeline(StandardScaler(), SVC(kernel="rbf", C=1, gamma=0.5))
|
|
|
model.fit(X_train, y_train)
|
|
|
|
|
|
|
|
|
acc = model.score(X_test, y_test)
|
|
|
print(f"✅ Độ chính xác trên tập test: {acc:.2f}")
|
|
|
|
|
|
|
|
|
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
|
|
|
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
|
|
|
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 300),
|
|
|
np.linspace(y_min, y_max, 300))
|
|
|
|
|
|
|
|
|
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
|
|
|
Z = Z.reshape(xx.shape)
|
|
|
|
|
|
|
|
|
plt.figure(figsize=(8,6))
|
|
|
plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.coolwarm)
|
|
|
plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.coolwarm, edgecolors='k')
|
|
|
plt.title(f"SVM Decision Boundary (accuracy = {acc:.2f})")
|
|
|
plt.xlabel("Feature 1")
|
|
|
plt.ylabel("Feature 2")
|
|
|
plt.show()
|
|
|
|