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 plot
và summary
. 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
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
...
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. –
@ 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! –
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ì? –