2011-09-12 12 views
17

Birçok kişinin dört gruba/sınıfa sınıflandırılması için SVM performansını test etmek istiyorum. MATLAB'dan svmtrain LibSVM fonksiyonunu kullanırken, bu denklemin değerlerine dayanarak, bu bireyleri 4 grup arasında sınıflandırmak için kullanılan üç denklemi elde edebilirim. e1071 R paketinde svm fonksiyonunu kullanarak bu denklemler almak için herhangi bir yolue1071 R paketindeki SVM denklemleri?

   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 

var mı şu şekildedir: Bir şema olabilir? e1071 içinde

cevap

39

svm (oylama ardından çiftleri arasında, yani ikili sınıflandırma) çok sınıflı sınıflandırma için "tek karşı-bir" stratejisi kullanır. Bu hiyerarşik kurulumun üstesinden gelmek için muhtemelen bir grup ikili sınıflandırıcıyı, grup 1 ve hepsine benzer şekilde, daha sonra grup 2'yi vs. kaldıracak şekilde yapmanız gerekir. Ek olarak, temel svm işlevi, hiperparametrelerin ayarını yapmaz. Bu nedenle , e1071 veya train gibi mükemmel bir sarıcıyı mükemmel caret paketinde kullanmak isteyeceksiniz. Her neyse, R'deki yeni bireyleri sınıflandırmak için, sayıları manuel olarak bir denkleme sokmak zorunda kalmazsınız. Aksine, SVM gibi farklı modellere yönelik yöntemleri olan predict genel işlevini kullanırsınız. Bunun gibi model nesneler için genellikle plot ve summary genel işlevlerini de kullanabilirsiniz.

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

öngörüleri genel gerçek sınıf etiketleri tablolaştırıyoruz: svm modeli nesneden

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

Özü özelliği ağırlıkları (burada doğrusal bir SVM ile temel fikri bir örneğidir özellik seçimi, vb.). Burada, Sepal.Length açıkçası daha kullanışlı. Karar değerleri nereden geldiğini

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

biz özellik ağırlıkları ve ön işlenen özellik vektörlerin nokta ürünü olarak onları el hesaplayabilir, anlamak için, eksi yolunu kesmek rho ofset. (Önişlenmiş muhtemelen/merkezli ölçekli ve/veya vb RBF DVM kullanarak eğer çekirdek dönüştürülmüş demektir)

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

Bu dahili olarak hesaplanan ne eşit olmalıdır: sizin için

> 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

sayesinde, John cevap. Çünkü bu denklemleri bilmek istediğim, olaylarımı sınıflandırırken toplamdan hangi parametrelerin daha fazla önem taşıdığını değerlendirmektir. –

+2

@ ManuelRamón Ahh gotcha. Bunlar doğrusal bir SVM için "ağırlıklar" olarak adlandırılır. Bir svm model nesnesinden nasıl hesaplanacağını öğrenmek için yukarıdaki düzenlemeye bakın. İyi şanslar! –

+1

Örneğiniz yalnızca iki kategoriye (versicolor ve virginica) sahiptir ve iris verilerini sınıflandırmak için kullanılan her değişken için bir tane olmak üzere iki katsayıya sahip bir vektörünüz vardır. N kategorilerim varsa, N-1 vektörlerini 'ile (fit, t (coefs)% *% SV)' dan alırım. Her bir vektörün anlamı nedir? –