| | '''
|
| | 🧠 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()
|
| |
|