Tôi đang cố gắng xây dựng một SVM từ dữ liệu đào tạo trong đó một nhóm được đại diện nhiều hơn nhóm kia. Tuy nhiên, các nhóm sẽ được đại diện như nhau trong dữ liệu thử nghiệm cuối cùng. Do đó, tôi muốn sử dụng class.weights
tham số của e1071
giao diện gói R libsvm
để cân bằng ảnh hưởng của hai nhóm trong dữ liệu đào tạo.
Vì tôi không chắc chắn chính xác cách xác định các trọng số này, tôi đã thiết lập một thử nghiệm nhỏ:
- Tạo một số dữ liệu null (tính năng ngẫu nhiên; tỷ lệ 2: 1 giữa các nhãn nhóm)
- Phù hợp với một Svm với bộ
class.weights
tham số. - Dự đoán một loạt các bộ dữ liệu null mới và xem xét tỷ lệ lớp.
- Nhân rộng toàn bộ quá trình nhiều lần cho các bộ huấn luyện null khác nhau.
Đây là mã R tôi đang sử dụng:
nullSVM <- function(n.var, n.obs) {
# Simulate null training data
vars = matrix(rnorm(n.var*n.obs), nrow=n.obs)
labels = rep(c('a', 'a', 'b'), length.out=n.obs)
data = data.frame(group=labels, vars)
# Fit SVM
fit = svm(group ~ ., data=data, class.weights=c(a=0.5, b=1))
# Calculate the average fraction of 'a' we would predict from null test data
mean(replicate(50, table(predict(fit, data.frame(matrix(rnorm(n.var*n.obs), nrow=n.obs))))[1])) / n.obs
}
library(e1071)
set.seed(12345)
mean(replicate(50, nullSVM(50, 300)))
Từ toàn bộ điều này, tôi đã mong đợi một đầu ra ~ 0,5, tuy nhiên, đó không phải là những gì tôi nhận được:
> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987
Thông số class.weights
đang hoạt động, loại trọng lượng I a
càng thấp thì nó càng được biểu thị trong mô phỏng này (và nếu tôi bỏ qua class.weights
nó sẽ trả về gần 1) ... nhưng tôi không hiểu tại sao chỉ đơn giản sử dụng trọng số 1: 2 ( đối với dữ liệu đào tạo là 2: 1) không giúp tôi giảm xuống 50%.
Nếu tôi hiểu nhầm SVM, ai đó có thể giải thích điểm này không? (hoặc gửi một số ref?)
Nếu tôi làm sai, ai đó có thể cho tôi biết cách sử dụng class.weights
tham số chính xác không?
Nó có thể là một lỗi? (Tôi nghĩ là không, vì tôi hiểu phần mềm này và libsvm cơ bản khá trưởng thành)