2011-09-12 12 views
17

Jestem zainteresowany testowaniem wydajności SVM w celu zaklasyfikowania kilku osób do czterech grup/klas. Korzystając z funkcji svmtrain LibSVM z MATLAB, jestem w stanie uzyskać trzy równania używane do klasyfikacji tych osób spośród 4 grup, w oparciu o wartości tego równania. Schemat może wyglądać następująco:Równania SVM z pakietu e1071 R?

   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 

Czy istnieje sposób na uzyskanie tych równań za pomocą funkcji svm w pakiecie e1071 R?

Odpowiedz

39

svm w e1071 używa strategii "jeden do jednego" dla klasyfikacji wieloklasowej (tj. Klasyfikacji binarnej między wszystkimi parami, a następnie głosowania). Aby poradzić sobie z tą hierarchiczną konfiguracją, prawdopodobnie musisz ręcznie wykonać serię binarnych klasyfikatorów, takich jak grupa 1 w stosunku do wszystkich, następnie grupa 2 w porównaniu do tego, co zostało, itp. Dodatkowo, podstawowa funkcja svm nie dostraja hiperparametrów, więc zazwyczaj chcesz używać opakowania takiego jak tune w e1071 lub train w doskonałym opakowaniu caret.

W każdym razie, aby zaklasyfikować nowe osoby w R, nie trzeba ręcznie podłączać liczb do równania. Raczej używasz ogólnej funkcji predict, która ma metody dla różnych modeli, takich jak SVM. W przypadku takich obiektów modelu można również zwykle używać ogólnych funkcji: plot i plot. Oto przykład z podstawową ideą stosując liniową SVM:

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

tabularyzować rzeczywiste etykiety klasy w porównaniu z przewidywaniami modelu:

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

funkcji Extract ciężary z svm model obiektowy (dla wybór funkcji itp.). Tutaj, Sepal.Length jest oczywiście bardziej przydatny.

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

Aby zrozumieć, gdzie wartości decyzyjne pochodzą, możemy obliczyć je ręcznie jako iloczynu skalarnego obciążników fabularnych i wstępnie przygotowane wektorów cech, minus przechwytujący przesunięcie rho. (Przetworzonych oznacza ewentualnie skupione/skalowane i/lub jądra przekształcony w przypadku korzystania RBF SVM itp)

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

To powinno wynosić co jest obliczany wewnętrznie:

> 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

Dzięki za ciebie odebrać, John. Powodem, dla którego chcę poznać te równania, jest ocena, które parametry z całości mają większe znaczenie przy klasyfikacji zdarzeń. –

+2

@ ManuelRamón Ahh gotcha. Są one nazywane "wagami" dla liniowej maszyny SVM. Zobacz powyżej, jak obliczyć z obiektu modelu svm. Powodzenia! –

+1

Twój przykład ma tylko dwie kategorie (versicolor i virginica) i masz wektor z dwoma współczynnikami, po jednym dla każdej zmiennej używanej do klasyfikacji danych tęczówki. Jeśli mam N kategorie, otrzymam N-1 wektory od 'with (fit, t (coefs)% *% SV)'. Jakie jest znaczenie każdego wektora? –