svm
e1071
對多類分類(即所有對之間的二元分類,隨後是投票)使用「一對一」策略。因此,要處理這種分層設置,您可能需要手動執行一系列二進制分類器,如組1與全部,然後組2與剩下的任何等等。此外,基本的svm
函數不調整超參數,所以您通常會想要使用e1071
中的tune
或包裝中的包裝,如caret
。
無論如何,要分類R中的新個人,您不必手動將數字插入等式。相反,您可以使用泛型函數,該函數具有適用於不同模型(如SVM)的方法。對於這樣的模型對象,通常也可以使用通用函數plot
和summary
。下面是一個使用線性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
列成表格實際類別標籤與模型預測:
> 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
...
感謝您的回答,約翰。因爲我想知道這些方程式的原因是爲了評估分類我的事件時總共哪些參數更重要。 –
@ManuelRamón啊呃。這些被稱爲線性SVM的「權重」。請參閱上面的編輯,瞭解如何從svm模型對象進行計算。祝你好運! –
你的例子只有兩個類別(雜色和弗吉尼亞),你有一個向量有兩個係數,每個變量用於分類虹膜數據。如果我有N個類別,我會從'with(fit,t(coefs)%*%SV')中得到N-1個向量。每個矢量的含義是什麼? –