2011-09-12 170 views
17

我有興趣測試SVM的性能,將幾個人分爲四個組/類。當使用MATLAB的svmtrain LibSVM函數時,根據這個方程的值,我可以得到用於對這四個組中的那些個體進行分類的三個方程。一種方案可能如下:來自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 

有沒有辦法使用SVM功能的e1071 [R包來獲得這些方程?

回答

39

svme1071對多類分類(即所有對之間的二元分類,隨後是投票)使用「一對一」策略。因此,要處理這種分層設置,您可能需要手動執行一系列二進制分類器,如組1與全部,然後組2與剩下的任何等等。此外,基本的svm函數不調整超參數,所以您通常會想要使用e1071中的tune或包裝中的包裝,如caret

無論如何,要分類R中的新個人,您不必手動將數字插入等式。相反,您可以使用泛型函數,該函數具有適用於不同模型(如SVM)的方法。對於這樣的模型對象,通常也可以使用通用函數plotsummary。下面是一個使用線性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

列成表格實際類別標籤與模型預測:

> 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啊呃。這些被稱爲線性SVM的「權重」。請參閱上面的編輯,瞭解如何從svm模型對象進行計算。祝你好運! –

+1

你的例子只有兩個類別(雜色和弗吉尼亞),你有一個向量有兩個係數,每個變量用於分類虹膜數據。如果我有N個類別,我會從'with(fit,t(coefs)%*%SV')中得到N-1個向量。每個矢量的含義是什麼? –