Maching-Learning-Models / Support_Vector_Machine.py
TinTinDo's picture
Upload 3 files
662d38c verified
'''
🧠 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()