Como obter limites de decisão do SVM linear em R?

9

Estou precisando de um pacote que possa me dar a equação para um modelo SVM linear. Atualmente estou usando o e1071 assim:

library(e1071)
m = svm(data, labels, type='C', kernel='linear', cost=cost, probability=FALSE, scale=scale)
w = t(m$coefs) %*% data[m$index,]  #Weight vector
b = -model$rho #Offset

No entanto, não tenho certeza de como e1071::svm()seleciona classes positivas e negativas, por isso acho que isso pode estragar outros conjuntos de dados. Alguém pode confirmar como essa função decide qual classe é positiva e qual é negativa?

Além disso, existe um pacote melhor para isso?

reisner
fonte
11
Forneci algumas informações sobre isso em um encadeamento relacionado: Computando o limite de decisão de um modelo SVM linear .
chl

Respostas:

1

Para o ponto de dados seu SVM calcula o valor da decisão da seguinte maneira:xd

d <- sum(w * x) + b

Se , o rótulo de é , caso contrário, é . Você também pode obter rótulos ou valores de decisão para a matriz de dados dizendod>0 0x+1 11 1newdata

predict(m, newdata)

ou

predict(m, newdata, decision.values = TRUE)

Seja cauteloso ao usar o SVM do pacote e1071, consulte Problema com o e1071 libsvm? questão. Vários outros pacotes SVM para R são kernlab, klaR e svmpath, consulte esta visão geral: Support Vector Machines in R por A. Karatzoglou e D. Meyer.

Leo
fonte
2
Obrigado, mas minha pergunta é sobre como obtenho os valores de eb. Além disso, sobre o valor da decisão, estou perguntando como o e1071 decide qual rótulo é positivo e negativo para os dados de treinamento quando você os passa.
Reisner # 13/12
11
Não conheço o e1071, mas conheço o SVM. Se uma classe é considerada positiva ou negativa não afetará o resultado. Você pode pegar qualquer conjunto de dados e trocar os rótulos das classes e ainda assim obter o mesmo resultado em termos de classificação de pontos de teste (para os mesmos parâmetros). O positivo e o negativo são usados ​​para determinar se a instância cai no lado direito do limite de decisão.
karenu