2011-09-12 7 views
17

SVM 성능을 테스트하여 여러 개인을 네 그룹/클래스로 분류하는 데 관심이 있습니다. MATLAB에서 svmtrain LibSVM 함수를 사용할 때,이 방정식의 값을 기반으로 4 개의 그룹 중 해당 개인을 분류하는 데 사용되는 3 개의 방정식을 얻을 수 있습니다. e1071의 R 패키지의 SVM 기능을 사용하여 이러한 방정식을 얻을 수있는 방법이e1071 R 패키지의 SVM 방정식?

   All individuals (N)* 
         | 
Group 1 (n1) <--- equation 1 ---> (N-n1) 
             | 
        (N-n1-n2) <--- equation 2 ---> Group 2 (n2) 
         | 
Group 3 (n3) <--- equation 3 ---> Group 4(n4) 

*N = n1+n2+n3+n4 

거기에 다음과 같은 방식이 될 수 있을까?

답변

39

svm (e1071)은 멀티 클래스 분류 (즉, 모든 쌍 사이의 이진 분류, 투표)에 "일대일"전략을 사용합니다. 따라서이 계층 적 설정을 처리하려면 그룹 1 대 모두, 그룹 2 대 남은 것 등과 같이 수동으로 일련의 바이너리 분류자를 수행해야합니다. 또한 기본 svm 함수는 하이퍼 매개 변수를 조정하지 않으며, 그래서 일반적으로 tune 같은 e1071, 또는 train 우수한 포장의 래퍼를 사용하려는 것입니다 caret 패키지.

어쨌든 R을 사용하여 새 개인을 분류하려면 수동으로 수식에 숫자를 연결할 필요가 없습니다. 오히려 predict 제네릭 함수를 사용합니다.이 함수에는 SVM과 같은 다른 모델에 대한 메서드가 있습니다. 이와 같은 모델 객체의 경우 일반 함수 plotsummary을 사용할 수도 있습니다.

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 

enter image description here

하는 모델 예측 대 실제 클래스 레이블을 표로 : svm 모델 객체에서

> table(Actual=iris.part$Species, Fitted=pred) 
      Fitted 
Actual  versicolor virginica 
    versicolor   38  12 
    virginica   15  35 

추출 기능 가중치를 (여기 선형 SVM을 사용하여 기본적인 아이디어의 예입니다 기능 선택 등). 여기에 Sepal.Length이 더 유용합니다. 결정 값이 어디에서 온

> t(fit$coefs) %*% fit$SV 
    Sepal.Length Sepal.Width 
[1,] -1.060146 -0.2664518 

우리가 기능 무게와 전처리 된 특징 벡터의 내적으로 수동으로 계산할 수있다, 이해하기, 마이너스 절편은 rho 오프셋. (사전 처리가 가능/중심 조정 및/또는 등 RBF SVM을 사용하는 경우 커널 변형을 의미)

> 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 
... 

이 내부적으로 계산 무엇 같아야합니다 : 당신을 위해

> head(fit$decision.values) 
    versicolor/virginica 
51   -1.3997066 
52   -0.4402254 
53   -1.1596819 
54   1.7199970 
55   -0.2796942 
56   0.9996141 
... 
+0

덕분에, 존 대답. 이 방정식을 알고 싶기 때문에 그 이유는 내 이벤트를 분류 할 때 어떤 매개 변수가 더 중요한지 평가하는 것입니다. –

+2

@ ManuelRamón Ahh gotcha. 이를 선형 SVM의 "가중치"라고합니다. svm 모델 객체에서 계산하는 방법은 위의 편집을 참조하십시오. 행운을 빕니다! –

+1

예제에는 두 가지 범주 (versicolor 및 virginica) 만 있고 두 개의 계수가있는 벡터가 있습니다. 하나는 홍채 데이터를 분류하는 데 사용되는 각 변수에 대한 코드입니다. N 개의 카테고리가 있다면'with (fit, t (coefs) % * % SV)'에서 N-1 벡터를 얻습니다. 각 벡터의 의미는 무엇입니까? –