''' 🧠 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 | ''' # 🧰 5. Cách dùng trong Python 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 # Dữ liệu mẫu 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) # Tạo mô hình SVM model = make_pipeline(StandardScaler(), SVC(kernel='rbf', C=1, gamma='scale')) # thử đổi kernel bằng linear, poly, sigmoid và Tinh chỉnh C và gamma: SVC(C=10, gamma=0.1) # Huấn luyện model.fit(X_train, y_train) # Đánh giá 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) ''' # ️ Mini Project thực tế với tập dữ liệu data.csv 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 # 1. Đọc dữ liệu data = pd.read_csv(r"C:\Users\Microsoft\Machine-Learning-Tutorial\data.csv") # 2. Lấy đặc trưng và nhãn X = data.iloc[:, :-1].values # tất cả cột trừ cột cuối y = data.iloc[:, -1].values # cột cuối là label # (Chỉ vẽ được nếu dữ liệu có đúng 2 cột feature) if X.shape[1] != 2: raise ValueError("⚠️ Dữ liệu phải có đúng 2 cột đặc trưng để vẽ biểu đồ 2D!") # 3. Chia tập train/test X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 4. Tạo model SVM (dùng RBF) model = make_pipeline(StandardScaler(), SVC(kernel="rbf", C=1, gamma=0.5)) model.fit(X_train, y_train) # 5. Độ chính xác acc = model.score(X_test, y_test) print(f"✅ Độ chính xác trên tập test: {acc:.2f}") # 6. Tạo lưới để vẽ ranh giới 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)) # Dự đoán cho từng điểm trong lưới Z = model.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) # 7. Vẽ biểu đồ 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()