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
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
...
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ń. –
@ ManuelRamón Ahh gotcha. Są one nazywane "wagami" dla liniowej maszyny SVM. Zobacz powyżej, jak obliczyć z obiektu modelu svm. Powodzenia! –
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? –