SVM (Support Vector Machine): Thuật Toán Phân Loại Ưu Việt và Ứng Dụng Thực Tế

SVM (Support Vector Machine) là một thuật toán học có giám sát mạnh mẽ, được ứng dụng rộng rãi trong cả bài toán phân loại và hồi quy. Mặc dù có thể dùng cho hồi quy, SVM đặc biệt nổi trội trong lĩnh vực phân loại, nhờ khả năng tìm ra ranh giới quyết định tối ưu giữa các lớp dữ liệu. Thuật toán này biểu diễn dữ liệu dưới dạng các điểm trong không gian n chiều (n là số lượng đặc trưng), sau đó tìm kiếm một siêu phẳng (hyperplane) để phân tách các lớp một cách hiệu quả nhất.

Vậy, Support Vector Machine là gì? Đơn giản, đó là một biên giới được thiết lập để phân chia hai lớp dữ liệu một cách tối ưu nhất, dựa trên các điểm dữ liệu quan trọng được gọi là Support Vectors.

Vấn đề quan trọng đặt ra là: làm thế nào để xác định và vẽ đúng siêu phẳng phân tách? Dưới đây là các tiêu chí cần tuân thủ:

  • Xác định siêu phẳng đúng (Trường hợp 1):

Trong hình trên, có ba siêu phẳng (A, B và C). Vậy, đường nào là siêu phẳng phù hợp nhất để phân loại nhóm ngôi sao và hình tròn?

Nguyên tắc 1: Chọn siêu phẳng phân tách hai lớp tốt nhất. Trong trường hợp này, đường B là lựa chọn tối ưu.

  • Xác định siêu phẳng đúng (Trường hợp 2):

Ở đây, chúng ta cũng có ba siêu phẳng (A, B và C). Theo nguyên tắc 1, cả ba đường đều đáp ứng yêu cầu phân tách.

Nguyên tắc 2: Xác định khoảng cách lớn nhất từ điểm gần nhất của mỗi lớp đến siêu phẳng. Khoảng cách này được gọi là “Margin”. Trong hình trên, đường C có Margin lớn nhất. Lưu ý rằng việc chọn một siêu phẳng có Margin nhỏ có thể dẫn đến nguy cơ phân loại sai khi dữ liệu tăng lên.

  • Xác định siêu phẳng đúng (Trường hợp 3):

Trong tình huống này, một số người có thể chọn đường B vì nó có Margin lớn hơn đường A. Tuy nhiên, điều đó không chính xác. Nguyên tắc đầu tiên vẫn là ưu tiên việc phân chia các lớp thành các vùng riêng biệt. Do đó, đường A mới là lựa chọn đúng đắn.

  • Có thể phân loại hai lớp không? (Trường hợp 4):

Trong hình trên, không thể vẽ một đường thẳng để phân tách hoàn toàn hai lớp, tạo ra một vùng chỉ chứa ngôi sao và một vùng chỉ chứa hình tròn.

Trong trường hợp này, SVM cho phép bỏ qua một vài điểm ngoại lệ (ví dụ: một ngôi sao nằm lạc lõng bên ngoài nhóm của nó) và tìm ra siêu phẳng có biên giới tối đa. Điều này cho thấy khả năng chấp nhận ngoại lệ mạnh mẽ của SVM.

  • Tìm siêu phẳng để phân tách các lớp (Trường hợp 5):

Trong trường hợp này, không thể tìm thấy một siêu phẳng tuyến tính để phân tách các lớp. Vậy, làm thế nào SVM có thể giải quyết vấn đề này? Cho đến nay, chúng ta mới chỉ xem xét các siêu phẳng tuyến tính.

SVM giải quyết vấn đề này bằng cách thêm một đặc trưng mới. Ví dụ, chúng ta có thể thêm đặc trưng z = x² + y². Khi đó, dữ liệu sẽ được biến đổi theo trục x và z như sau:

Trong sơ đồ trên:

  • Tất cả dữ liệu trên trục z đều là số dương vì nó là tổng bình phương của x và y.
  • Trên biểu đồ, các điểm tròn đỏ xuất hiện gần trục x và y hơn, do đó z sẽ nhỏ hơn và nằm gần trục x hơn trong đồ thị (z, x).

Trong SVM, việc tìm một siêu phẳng tuyến tính để phân chia hai lớp trở nên dễ dàng hơn. Câu hỏi đặt ra là: chúng ta có cần thêm đặc trưng phân chia này bằng tay hay không? Câu trả lời là không. SVM sử dụng một kỹ thuật gọi là kernel trick. Kỹ thuật này ánh xạ không gian đầu vào có chiều thấp vào không gian có chiều cao hơn, nơi dữ liệu có thể được phân tách dễ dàng hơn. Nói cách khác, kernel trick thực hiện một số biến đổi dữ liệu phức tạp và tìm ra quá trình tách dữ liệu dựa trên các nhãn hoặc đầu ra đã được xác định trước.

Margin là khoảng cách giữa siêu phẳng và hai điểm dữ liệu gần nhất tương ứng với các phân lớp. Tưởng tượng bạn có một cái cân với táo và lê ở hai bên. Margin chính là khoảng cách giữa điểm tựa của cân và hai quả táo và lê gần nó nhất. SVM luôn cố gắng cực đại hóa Margin này, tạo ra một siêu phẳng có khoảng cách xa nhất so với hai nhóm dữ liệu. Nhờ đó, SVM có thể giảm thiểu việc phân loại sai đối với dữ liệu mới.

Để tìm nghiệm cho SVM, chúng ta có thể sử dụng trực tiếp thư viện sklearn trong Python.

Các bài toán thực tế thường sử dụng thư viện libsvm, được viết bằng ngôn ngữ C và có API cho Python và Matlab.

from sklearn.svm import SVC
model = SVC(kernel='linear', probability=True)
model.fit(X_train, y_train) #X_train là dữ liệu huấn luyện, y_train là nhãn tương ứng
#Do somethings….
w = model.coef_
b = model.intercept_
print(‘w = ‘, w)
print(‘b = ‘, b)

Là một kỹ thuật phân loại phổ biến, SVM sở hữu nhiều ưu điểm, bao gồm khả năng tính toán hiệu quả trên các tập dữ liệu lớn. Một số ưu điểm khác của SVM:

  • Xử lý không gian số chiều cao: SVM hoạt động hiệu quả trong không gian chiều cao, đặc biệt trong các bài toán phân loại văn bản và phân tích quan điểm, nơi số chiều có thể rất lớn.
  • Tiết kiệm bộ nhớ: Do chỉ một tập hợp con các điểm (Support Vectors) được sử dụng trong quá trình huấn luyện và ra quyết định, SVM tiết kiệm bộ nhớ bằng cách chỉ lưu trữ những điểm cần thiết.
  • Tính linh hoạt: Khả năng áp dụng các Kernel khác nhau cho phép SVM linh hoạt chuyển đổi giữa các phương pháp tuyến tính và phi tuyến tính, từ đó nâng cao hiệu suất phân loại.

Nhược điểm:

  • Bài toán số chiều cao: Trong trường hợp số lượng thuộc tính (p) lớn hơn nhiều so với số lượng dữ liệu (n), SVM có thể cho kết quả kém.
  • Thiếu tính xác suất: Việc phân loại của SVM chỉ đơn thuần là phân tách các đối tượng vào hai lớp được phân tách bởi siêu phẳng. SVM không cung cấp thông tin về xác suất một đối tượng thuộc về một nhóm cụ thể. Tuy nhiên, hiệu quả của việc phân loại có thể được đánh giá dựa trên Margin.

Kết luận: SVM là một phương pháp hiệu quả cho bài toán phân loại dữ liệu. Nó là một công cụ mạnh mẽ cho các bài toán xử lý ảnh, phân loại văn bản và phân tích quan điểm. Một yếu tố quan trọng làm nên hiệu quả của SVM là việc sử dụng Kernel function, giúp cho việc chuyển đổi không gian trở nên linh hoạt hơn.

Tài liệu tham khảo: