한 그룹이 다른 그룹보다 더 많은 훈련 데이터를 사용하여 SVM을 구축하려고합니다. 그러나 그룹은 최종 테스트 데이터에서 동일하게 표시됩니다. 따라서 R 패키지 인터페이스 의 class.weights
매개 변수 를 사용 하여 훈련 데이터에서 두 그룹의 영향을 균형있게 조정 하고 싶습니다 .e1071
libsvm
이 가중치를 정확히 어떻게 지정해야하는지 잘 모르기 때문에 약간의 테스트를 설정했습니다.
- 일부 null 데이터 생성 (무작위 기능; 그룹 레이블 간 2 : 1 비율)
class.weights
매개 변수 세트 로 svm을 맞추십시오.- 다수의 새로운 널 데이터 세트를 예측하고 클래스 비율을보십시오.
- 다른 널 훈련 세트에 대해 전체 프로세스를 여러 번 복제하십시오.
내가 사용하는 R 코드는 다음과 같습니다.
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)))
이 모든 것에서 나는 ~ 0.5 출력을 기대했지만, 그것은 내가 얻은 것이 아닙니다.
> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987
class.weights
있었던 파라미터는 노력 종류의 낮은 I 무게로, a
는이 시뮬레이션에 표시됩니다 (내가 생략하면 낮은, class.weights
그것은 가까운 1 반환) ...하지만 단순히 1의 가중치를 사용하는 이유는 이해가 안 : 2 ( 2 : 1)의 훈련 데이터의 경우 50 %로 줄어드는 것은 아닙니다.
SVM을 잘못 이해하고 있다면 누군가이 점을 설명 할 수 있습니까? (또는 심판을 보내시겠습니까?)
내가 잘못하고 있다면 누군가 class.weights
매개 변수 를 사용하는 올바른 방법을 말해 줄 수 있습니까?
버그 일 수 있습니까? (이 소프트웨어와 기본 libsvm이 매우 성숙하다는 것을 이해했기 때문에 그렇지 않습니다.)