Tham số chi phí (C) có nghĩa là gì trong SVM?


7

Tôi đang cố gắng để phù hợp với một SVM với dữ liệu của tôi. Tập dữ liệu của tôi chứa 3 lớp và tôi đang thực hiện xác thực chéo 10 lần (trong LibSVM):

./svm-train -g 0.5 -c 10 -e 0.1 -v 10 training_data

Sự giúp đỡ từ đó nêu rõ:

-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)

Đối với tôi, việc cung cấp các giá trị chi phí (C) cao hơn mang lại cho tôi độ chính xác cao hơn. C trong SVM thực sự có nghĩa là gì? Tại sao và khi nào tôi nên sử dụng giá trị cao hơn / thấp hơn (hoặc giá trị mặc định được cung cấp LibSVM) của C?


Điều này gây ấn tượng với tôi như một câu hỏi ML / thống kê tốt, nhưng bạn có thể muốn chỉnh sửa nó để làm cho phần mềm trở nên trung tính. Mặt khác, mọi người có thể bỏ phiếu để đóng câu hỏi này như một câu hỏi về cách sử dụng phần mềm của tôi.
gung - Phục hồi Monica

2
Có thể trùng lặp tham số chi phí SVM Xem thêm chủ đề này về các SVM điều chỉnh siêu tham số . Kết quả tìm kiếm này cũng rất phù hợp.
Sycorax nói Phục hồi lại

Câu trả lời:


17

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ụ:

nhập mô tả hình ảnh ở đây

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 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 Rvà sử dụng caretgói, nhưng điều tương tự cũng áp dụng cho libsvmquá 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))

Iris1

Đâ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)))

Kết quả SVM

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)

Tách SVM 1

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)

Tách SVM 2

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/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.