2011-09-12 41 views
17

Tôi quan tâm đến việc kiểm tra hiệu suất SVM để phân loại một số cá nhân thành bốn nhóm/lớp. Khi sử dụng hàm svmtrain LibSVM từ MATLAB, tôi có thể nhận được ba phương trình được sử dụng để phân loại các cá thể đó trong số 4 nhóm, dựa trên các giá trị của phương trình này. Một sơ đồ có thể như sau:Phương trình SVM từ gói e1071 R?

   All individuals (N)* 
         | 
Group 1 (n1) <--- equation 1 ---> (N-n1) 
             | 
        (N-n1-n2) <--- equation 2 ---> Group 2 (n2) 
         | 
Group 3 (n3) <--- equation 3 ---> Group 4(n4) 

*N = n1+n2+n3+n4 

Có cách nào để nhận các phương trình này bằng hàm svm trong gói e1071 R không?

Trả lời

39

svm trong e1071 sử dụng chiến lược "một đối thủ" để phân loại nhiều lớp (tức là phân loại nhị phân giữa tất cả các cặp, tiếp theo là bỏ phiếu). Vì vậy, để xử lý thiết lập phân cấp này, bạn có thể cần phải thực hiện một loạt các trình phân loại nhị phân theo cách thủ công, như nhóm 1 so với tất cả, sau đó nhóm 2 so với bất kỳ thứ gì còn lại, v.v. Ngoài ra, chức năng cơ bản svm không điều chỉnh các hyperparameters, vì vậy, bạn thường sẽ muốn sử dụng trình bao bọc như tune trong e1071 hoặc train trong gói caret xuất sắc.

Dù sao, để phân loại các cá nhân mới trong R, bạn không phải cắm số vào một phương trình theo cách thủ công. Thay vào đó, bạn sử dụng hàm generic predict, có các phương thức cho các mô hình khác nhau như SVM. Đối với các đối tượng mô hình như thế này, bạn cũng có thể sử dụng các hàm chung plotsummary. Dưới đây là một ví dụ về ý tưởng cơ bản sử dụng một SVM tuyến tính:

require(e1071) 

# Subset the iris dataset to only 2 labels and 2 features 
iris.part = subset(iris, Species != 'setosa') 
iris.part$Species = factor(iris.part$Species) 
iris.part = iris.part[, c(1,2,5)] 

# Fit svm model 
fit = svm(Species ~ ., data=iris.part, type='C-classification', kernel='linear') 

# Make a plot of the model 
dev.new(width=5, height=5) 
plot(fit, iris.part) 

# Tabulate actual labels vs. fitted labels 
pred = predict(fit, iris.part) 
table(Actual=iris.part$Species, Fitted=pred) 

# Obtain feature weights 
w = t(fit$coefs) %*% fit$SV 

# Calculate decision values manually 
iris.scaled = scale(iris.part[,-3], fit$x.scale[[1]], fit$x.scale[[2]]) 
t(w %*% t(as.matrix(iris.scaled))) - fit$rho 

# Should equal... 
fit$decision.values 

enter image description here

lập bảng nhãn lớp thực tế so với dự đoán mô hình:

> table(Actual=iris.part$Species, Fitted=pred) 
      Fitted 
Actual  versicolor virginica 
    versicolor   38  12 
    virginica   15  35 

trọng tính năng Extract từ svm đối tượng mô hình (ví lựa chọn tính năng, v.v.) Ở đây, Sepal.Length rõ ràng là hữu ích hơn.

> t(fit$coefs) %*% fit$SV 
    Sepal.Length Sepal.Width 
[1,] -1.060146 -0.2664518 

Để hiểu nơi các giá trị quyết định đến từ đâu, chúng ta có thể tính toán cho họ bằng tay như dấu chấm sản phẩm của các trọng tính năng và các vectơ tính năng xử lý trước, trừ đi đánh chặn bù đắp rho. (Xử lý trước có nghĩa là có thể làm trung tâm/thu nhỏ và/hoặc kernel chuyển nếu sử dụng RBF SVM vv)

> t(w %*% t(as.matrix(iris.scaled))) - fit$rho 
     [,1] 
51 -1.3997066 
52 -0.4402254 
53 -1.1596819 
54 1.7199970 
55 -0.2796942 
56 0.9996141 
... 

này phải bằng những gì được tính nội bộ:

> head(fit$decision.values) 
    versicolor/virginica 
51   -1.3997066 
52   -0.4402254 
53   -1.1596819 
54   1.7199970 
55   -0.2796942 
56   0.9996141 
... 
+0

Cảm ơn bạn trả lời, John. Lý do là vì tôi muốn biết các phương trình này là để đánh giá các thông số nào từ tổng số có tầm quan trọng hơn khi phân loại các sự kiện của tôi. –

+2

@ ManuelRamón Ahh gotcha. Chúng được gọi là "trọng số" cho một SVM tuyến tính. Xem chỉnh sửa ở trên để biết cách tính toán từ một đối tượng mô hình svm. Chúc may mắn! –

+1

Ví dụ của bạn chỉ có hai loại (versicolor và virginica) và bạn có một vector với hai coeffcients, một cho mỗi biến được sử dụng để phân loại dữ liệu iris. Nếu tôi có N loại, tôi nhận được các vectơ N-1 từ 'với (fit, t (coefs)% *% SV)'. Ý nghĩa của mỗi vector là gì? –

Các vấn đề liên quan