Ví dụ về SVM với kernel RBF trong Python

🌀 Trong ví dụ với dữ liệu mô phỏng này, ta sẽ dùng SVM với kernel RBF để phân loại hai lớp có dạng vòng tròn chồng nhau – bài toán không tuyến tính. Mô hình được huấn luyện trên dữ liệu giả lập và đạt độ chính xác cao, sau đó vẽ ranh giới phân loại để thể hiện khả năng “uốn cong” đường chia lớp của SVM. Một cách trực quan để hiểu sức mạnh của kernel phi tuyến!


🧪 1. Tạo dữ liệu dạng vòng tròn (không tuyến tính):

X, y = datasets.make_circles(n_samples=300, factor=0.3, noise=0.1, random_state=42)
  • Tạo 300 điểm thuộc 2 vòng tròn lồng nhau (class 0 và 1).
  • factor=0.3: vòng tròn trong có bán kính nhỏ hơn.
  • noise=0.1: thêm nhiễu để làm bài toán thực tế hơn.

→ Đây là bài toán không tuyến tính, buộc mô hình phải “uốn cong” ranh giới ra quyết định.


✂️ 2. Chia dữ liệu thành tập huấn luyện và kiểm tra:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  • 70% huấn luyện, 30% kiểm tra.

⚙️ 3. Khởi tạo và huấn luyện SVM:

model = SVC(kernel='rbf', gamma='scale')
model.fit(X_train, y_train)
  • kernel='rbf' (Radial Basis Function): dùng để phân biệt dữ liệu không tuyến tính.
  • gamma='scale': tự động điều chỉnh độ ảnh hưởng của từng điểm.

🎯 4. Dự đoán & đánh giá:

y_pred = model.predict(X_test)
accuracy_score(y_test, y_pred)
  • Dự đoán nhãn trên tập kiểm tra.
  • Tính độ chính xác (accuracy) → ví dụ: 0.97 là rất tốt.

🖼️ 5. Vẽ ranh giới phân loại (decision boundary):

plot_decision_boundary(model, X_test, y_test)
  • Vẽ lưới điểm trên không gian 2D.
  • Dự đoán lớp từng điểm trong lưới → dựng contour thể hiện vùng phân loại.
  • Vẽ scatter các điểm thực tế để thấy mô hình phân loại thế nào.

Kết quả:

  • Dữ liệu make_circles là điển hình cho bài toán đòi hỏi kernel mạnh mẽ.
  • Đồ thị phân loại cho thấy mô hình “bẻ cong” biên hiệu quả để chia hai lớp vòng tròn.

Chạy code trên Colab

Toàn bộ code:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt

# Tạo dữ liệu giả (hai lớp)
X, y = datasets.make_circles(n_samples=300, factor=0.3, noise=0.1, random_state=42)

# Chia dữ liệu thành train/test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Khởi tạo mô hình SVM với kernel RBF
model = SVC(kernel='rbf', gamma='scale')

# Huấn luyện
model.fit(X_train, y_train)

# Dự đoán
y_pred = model.predict(X_test)

# Đánh giá
print(f"Accuracy: {accuracy_score(y_test, y_pred):.2f}")

# Vẽ đồ thị
import numpy as np

def plot_decision_boundary(model, X, y):
    x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
    y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
    xx, yy = np.meshgrid(np.linspace(x_min, x_max, 500), np.linspace(y_min, y_max, 500))
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.3)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k')
    plt.title("SVM với kernel RBF")
    plt.show()

plot_decision_boundary(model, X_test, y_test)

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

error: Content is protected !!