Tôi đang cố gắng đưa ra một câu trả lời đơn giản và dễ hiểu. Một câu trả lời đầy đủ có thể sẽ cần phải bao gồm tất cả mọi thứ, từ mục đích đằng sau các SVM đến các chi tiết tốt hơn về các vectơ mất và hỗ trợ. Nếu bạn muốn tìm hiểu sâu hơn về những chi tiết đó, bạn có thể cần xem xét, ví dụ như các chương về SVM trong máy học sách ngoài kia.
SVM là phân loại lề lớn . Điều này có nghĩa là sự phân tách (giả sử tuyến tính) giữa các mẫu của lớp đen và trắng không chỉ là một khả năng mà là sự phân tách tốt nhất có thể , được xác định bằng cách lấy tỷ lệ chênh lệch lớn nhất có thể giữa các mẫu của hai lớp. Điều này sẽH3 trong hình ảnh ví dụ:
Nếu bạn nghĩ về điều này trong một lúc, bạn sẽ kết luận rằng sự phân tách chỉ bắt nguồn từ những mẫu nằm gần "lớp khác", do đó những mẫu gần với lề (chính xác là: những mẫu ở lề). Trong hình ảnh ví dụ, đó là những mẫu được đánh dấu bằng các đường màu xám trực giao vớiH3. Hành vi này gây ra một vấn đề: với số lượng mẫu được sử dụng để tạo ra sự phân tách phần lớn là tập hợp con, tiếng ồn ảnh hưởng đến các mẫu đó rất có thể khiến cho sự phân tách trở nên tối ưu cho phần lớn dữ liệu. Đây là những gì chúng ta đều biết là quá mức: sự phân tách sẽ là tối ưu từ quan điểm lợi nhuận lớn của đào tạo được sử dụng, nhưng sẽ khái quát hóa kém và do đó là tối ưu cho dữ liệu khác / chưa được phát hiện.
Điều chúng ta đã nói đến cho đến nay là "phân loại lề cứng": chúng tôi không cho phép bất kỳ mẫu nào ở bên trong lề, vì đây là cách xác định lề cho đến nay. Khi chúng ta thư giãn tài sản cứng này, chúng ta sẽ thực hiện "phân loại lề mềm". Do đó, ý tưởng đằng sau lề vẫn giữ nguyên - nhưng hiện tại chúng tôi có thể cho phép một số mẫu nhất định nằm trong lề . Lợi ích cốt lõi là bằng cách làm như vậy, sự phù hợp tổng thể của mô hình với dữ liệu có thể rất tốt hơn so với phân loại lề cứng ( giảm phương sai với chi phí sai lệch ).
Vì vậy, một mặt, chúng tôi vẫn phải giải quyết vấn đề tối ưu hóa đơn giản của chúng tôi (làm thế nào để phù hợp nhất với mô hình = dòng với dữ liệu của chúng tôi). Mặt khác, chúng tôi không muốn có tất cả / nhiều mẫu trong lề - bằng cách nào đó chúng tôi muốn điều chỉnh số lượng mẫu chúng tôi để bên trong lề, để lề không hoàn toàn thay thế, cũng không mất hoàn toàn tài sản lề lớn của nó.
Đây là nơi Ctham số bước vào giai đoạn. Ý tưởng cốt lõi rất đơn giản: chúng tôi sửa đổi vấn đề tối ưu hóa để tối ưu hóa cả sự phù hợp của dòng thành dữ liệu và xử phạt số lượng mẫu bên trong lề cùng một lúc, trong đóCxác định trọng số của bao nhiêu mẫu bên trong lề đóng góp vào lỗi tổng thể. Do đó, vớiCbạn có thể điều chỉnh mức độ cứng hay mềm của phân loại lề lớn . Với mức thấpC, các mẫu bên trong lề được phạt ít hơn so với mức cao hơn C. Với mộtCbằng 0, các mẫu bên trong lề không bị phạt nữa - đó là một trong những cực đoan có thể vô hiệu hóa phân loại lề lớn. Với một vô hạnC bạn có cực kỳ có thể khác của lề cứng.
Đây là một ví dụ nhỏ hình dung hiệu ứng gây ra bằng cách thay đổi Csử dụng bộ dữ liệu iris nổi tiếng (trong R
và sử dụng caret
gói, nhưng điều tương tự cũng áp dụng cho libsvm
quá tất nhiên). Đây là cách dữ liệu gốc trông như thế nào (đây là một vấn đề phân loại nhị phân):
library(caret)
d <- iris[51:150,c(1,2,5)]
plot(d[,c(2,1)], pch = ifelse(d[,3]=='versicolor', 1, 2))
Đây là cách thay đổi C có thể ảnh hưởng đến hiệu suất của mô hình của bạn:
m <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', trControl = trainControl(method = 'repeatedcv', 10, 20), tuneGrid = expand.grid(C=3**(-7:7)))
plot(m, scales=list(x=list(log=3)))
Và đây là sự khác biệt trong sự tách biệt giữa hai lựa chọn khác nhau C các giá trị (lưu ý rằng các đường phân tách có độ nghiêng khác nhau!):
m1 <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', preProcess = c('center', 'scale'), trControl = trainControl(method = 'none'), tuneGrid = expand.grid(C=3**(-7)))
plot(m1$finalModel)
m2 <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', preProcess = c('center', 'scale'), trControl = trainControl(method = 'none'), tuneGrid = expand.grid(C=3**(7)))
plot(m2$finalModel)
Vì vậy, trên thực tế, những gì bạn rất có thể muốn làm trong thiết lập ML của mình là điều chỉnh đúng C, ví dụ như sử dụng lưới điều chỉnh. Bạn có thể xem xét ví dụ ấn phẩm này để biết thêm chi tiết. Đó là từ những người LibSVM và họ cung cấp nhiều thông tin hữu ích, từ việc giải thích cách các SVM hoạt động với các ví dụ hay cho đến đoạn mã để biết cách sử dụng lưới tham số với LibSVM:
Hsu et al. (2003). "Một hướng dẫn thực tế để hỗ trợ phân loại vector." Khoa Khoa học Máy tính và Kỹ thuật Thông tin, Đại học Quốc gia Đài Loan.
BTW: có một danh sách nhỏ những điều mọi người nói về SVM Ctham số mà tôi cũng thấy hữu ích cho việc hiểu nó: http://www.svms.org/parameter/