교육 데이터에서 그룹 크기가 다른 SVM


12

한 그룹이 다른 그룹보다 더 많은 훈련 데이터를 사용하여 SVM을 구축하려고합니다. 그러나 그룹은 최종 테스트 데이터에서 동일하게 표시됩니다. 따라서 R 패키지 인터페이스 의 class.weights매개 변수 를 사용 하여 훈련 데이터에서 두 그룹의 영향을 균형있게 조정 하고 싶습니다 .e1071libsvm

이 가중치를 정확히 어떻게 지정해야하는지 잘 모르기 때문에 약간의 테스트를 설정했습니다.

  1. 일부 null 데이터 생성 (무작위 기능; 그룹 레이블 간 2 : 1 비율)
  2. class.weights매개 변수 세트 로 svm을 맞추십시오.
  3. 다수의 새로운 널 데이터 세트를 예측하고 클래스 비율을보십시오.
  4. 다른 널 훈련 세트에 대해 전체 프로세스를 여러 번 복제하십시오.

내가 사용하는 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이 매우 성숙하다는 것을 이해했기 때문에 그렇지 않습니다.)


나는 libsvm에 대한 경험이 없지만 LiblineaR에 대해서는 수업 가중치가 중요합니다. 올바르게 설정하지 않으면 수업의 균형이 너무 좋지 않으면 최적의 결과를 얻지 못합니다. 나는 균형 잡힌 클래스로 실제 데이터 세트를 얻고 다른 값의 class.weights (LiblineaR wi)를 사용해보십시오. LiblineaR은 직계 커널에 비해 훨씬 빠르며 메소드에도 불이익을줍니다. 내 경험상, 당신은 먼저 괜찮은 클래스 가중치를 찾은 다음 C를 최적화합니다.
marbel

답변:


7

나는 그것이 C의 가치와 가지고있는 패턴의 수에 달려 있다고 생각합니다. SVM은 최대 마진 판별을 찾으려고합니다. 따라서 데이터가 드문 경우 SVM은 Lagrange 승수가 상한에 도달하지 않고 하드 마진 솔루션을 찾을 수 있습니다 (이 경우 각각에 대한 처벌 비율) 슬랙 밸리데이션이 작거나 제로이기 때문에 클래스는 본질적으로 관련이 없습니다. 훈련 패턴의 수를 늘리고 그 효과가 있는지 확인하십시오. .

더 중요한 것은 C의 최적 값은 데이터에 따라 달라 지므로 미리 결정된 값으로 설정할 수있을뿐 아니라 Leave-one-Out 오류 또는 일부 일반화 범위를 최소화하여 값을 최적화하는 것입니다. 불균형 클래스가있는 경우 각 클래스의 값 비율을 수정하고 모든 패턴에 대한 평균 패널티를 최적화 할 수 있습니다.


이것은 말이됩니다. 이 시뮬레이션에서 피처 수를 줄이고 관측치 수를 늘리면 출력 값이 0.5에 가까워집니다. 그러나 900 행과 1 열만 있어도 결코 도달하지 못합니다.
존 콜비

물론 실제 데이터에서는 항상 모델 매개 변수 조정을 위해 caret패키지 또는 내장 tune()함수를 사용하므로 특히 소수 클래스를 선호하도록 리샘플링 체계를 조정하여 실제로 처리하는 방법에 대한 두 번째 아이디어를 좋아합니다. 매우 감사.
John Colby

당신의 제안이 도움이 되서 다행입니다. theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdf에 유용 할 수있는 최적 비율 설정에 대한 논문이 있지만 최적의 이론적 수정이 실제로 항상 최적 인 것은 아니므로 최상의 결과가 나올 수 있습니다. 실제로는 특정 비율을 강요하지 않고 두 개의 개별 C 파라미터를 튜닝하지만 휴가 중 모델 선택 기준을 평가할 때 클래스에 따라 패턴에 가중치를 부여하여 얻을 수 있습니다.
Dikran Marsupial

2
또한 요즘에는 손실 함수 파생의 불연속성으로 인해 이러한 종류의 반 직관적 문제가 없으므로 SVM 대신 커널 릿지 회귀를 사용하는 경향이 있습니다. L2 SVM을 올바르게 조정하면 매우 작은 C 값으로 끝나고 모든 데이터가 SV이므로 KRR 모델이 생성됩니다. 더 많이 사용할수록 SVM이 실제로 유용하지는 않았지만 이론상 통찰력은 중요했습니다.
Dikran Marsupial

0

훈련에서 svm은 차별적 경계를 만들기 위해 지원 벡터를 찾고 그렇게하기위한 모든 클래스 데이터를위한 충분한 지원 벡터가 있으면 문제가되지 않습니다. 테스트 세트의 결과 정확도에서 실제 세계의 모든 클래스에 대한 데이터의 동등 량을 염두에두고 실제 결과를 얻으려면 데이터를 조작해야하며 실제 상황에 적절하게 고려되어야합니다.


이 답변은 현재 분명하지 않습니다. 사본 편집을 고려했지만 귀하가 의도 한 바가 확실하지 않은 곳이 몇 군데 있습니다. 문장 부호와 문법은 의미를 전달하는 데 중요합니다.
Silverfish
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.