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.weightstham số của e1071giao 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.weightstham 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 acà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.weightsnó 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.weightstham 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)