Máy vector hỗ trợ (Support Vector Machine – SVM) là một trong những thuật toán học máy mạnh mẽ, ban đầu được thiết kế cho bài toán nhị phân. Tuy nhiên, nhờ các chiến lược mở rộng như One-vs-One và One-vs-Rest, SVM có thể giải quyết hiệu quả các bài toán phân loại đa lớp. Bài viết này trình bày nguyên lý hoạt động, cách triển khai mã nguồn và ví dụ thực tiễn khi áp dụng SVM cho dữ liệu nhiều lớp.
Nguyên lý cốt lõi
SVM tìm siêu phẳng tối ưu sao cho lề (margin) giữa các lớp là lớn nhất. Với dữ liệu không tuyến tính, SVM sử dụng hàm kernel để ánh xạ vào không gian đặc trưng có chiều cao hơn, từ đó biến bài toán phi tuyến thành tuyến tính. Một số kernel phổ biến bao gồm:
- Linear: phù hợp với dữ liệu tách rời tuyến tính.
- RBF (Radial Basis Function): linh hoạt với dữ liệu phi tuyến phức tạp.
- Poly: hữu ích khi mối quan hệ giữa đặc trưng mang tính đa thức.
Với bài toán đa lớp, hai chiến lược chính được áp dụng:
- One-vs-One (OvO): huấn luyện một mô hình SVM cho mỗi cặp lớp. Với k lớp, cần k(k−1)/2 bộ phân loại.
- One-vs-Rest (OvR): huấn luyện một mô hình cho mỗi lớp so với tất cả các lớp còn lại. Tổng cộng cần k bộ phân loại.
Triển khai mã Python
Dưới đây là ví dụ minh họa việc sử dụng SVM để phân loại ba lớp trên tập dữ liệu hoa Iris:
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
# Tải dữ liệu
iris = datasets.load_iris()
X, y = iris.data, iris.target
# Chia tập huấn luyện và kiểm thử
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
# Chuẩn hóa đặc trưng
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# Khởi tạo và huấn luyện mô hình SVM với kernel RBF
model = SVC(kernel='rbf', C=1.0, gamma='scale', decision_function_shape='ovr')
model.fit(X_train_scaled, y_train)
# Dự đoán và đánh giá
y_pred = model.predict(X_test_scaled)
print(classification_report(y_test, y_pred, target_names=iris.target_names))
Trong đoạn mã trên:
decision_function_shape='ovr'chỉ định sử dụng chiến lược One-vs-Rest.gamma='scale'tự động điều chỉnh tham số kernel dựa trên phương sai của đặc trưng.- Chuẩn hóa dữ liệu giúp cải thiện hiệu suất khi các đặc trưng có phạm vi giá trị khác nhau.
Tối ưu tham số
Để đạt hiệu suất tốt nhất, nên tìm kiếm tổ hợp tham số tối ưu bằng Grid Search kết hợp Cross Validation:
from sklearn.model_selection import GridSearchCV
param_grid = {
'C': [0.1, 1, 10, 100],
'gamma': ['scale', 'auto', 0.001, 0.01, 0.1, 1]
}
grid_search = GridSearchCV(
SVC(kernel='rbf', decision_function_shape='ovr'),
param_grid,
cv=5,
scoring='accuracy',
n_jobs=-1
)
grid_search.fit(X_train_scaled, y_train)
print("Best parameters:", grid_search.best_params_)
Xử lý thách thức thực tế
Khi làm việc với dữ liệu không cân bằng, có thể thiết lập tham số class_weight='balanced' trong SVC để tự động điều chỉnh trọng số cho từng lớp, giúp mô hình không thiên lệch về lớp chiếm ưu thế.
Đối với tập dữ liệu lớn, thời gian huấn luyện SVM có thể rất lâu do độ phức tạp tính toán cao. Trong trường hợp này, có thể xem xét:
- Sử dụng
LinearSVCnếu dữ liệu gần như tuyến tính. - Áp dụng giảm chiều (PCA, LDA) trước khi đưa vào SVM.
- Chọn ngẫu nhiên tập con huấn luyện (subsampling) để tăng tốc quá trình.