Линейный SVM и извлечение весов - PullRequest
1 голос
/ 09 июня 2019

Я практикую SVM в R, используя набор данных радужной оболочки, и я хочу получить весовые коэффициенты / коэффициенты функции из моей модели, но я думаю, что, возможно, что-то неправильно истолковал, учитывая, что мой вывод дает мне 32 вектора поддержки. Я предполагал, что получу четыре, если проанализирую четыре переменные. Я знаю, что есть способ сделать это при использовании функции svm(), но я пытаюсь использовать функцию train() из каретки для создания моего SVM.

library(caret)

# Define fitControl
fitControl <- trainControl(## 5-fold CV
              method = "cv",
              number = 5,
              classProbs = TRUE,
              summaryFunction = twoClassSummary )

# Define Tune
grid<-expand.grid(C=c(2^-5,2^-3,2^-1))

########## 
df<-iris head(df)
df<-df[df$Species!='setosa',]
df$Species<-as.character(df$Species)
df$Species<-as.factor(df$Species)

# set random seed and run the model
set.seed(321)
svmFit1 <- train(x = df[-5],
                 y=df$Species,
                 method = "svmLinear", 
                 trControl = fitControl,
                 preProc = c("center","scale"),
                 metric="ROC",
                 tuneGrid=grid )
svmFit1

Я думал, что это просто svmFit1$finalModel@coef, но я получаю 32 вектора, когда считаю, что должен получить 4. Почему это?

1 Ответ

5 голосов
/ 12 июня 2019

То есть coef не является весом W векторов поддержки.Вот соответствующий раздел ksvm класса в документах :

coef Соответствующие коэффициенты умноженные на обучающие метки.

Toчтобы получить то, что вы ищете, вам нужно будет сделать следующее:

coefs <- svmFit1$finalModel@coef[[1]]
mat <- svmFit1$finalModel@xmatrix[[1]]

coefs %*% mat

Воспроизводимый пример приведен ниже.

library(caret)
#> Loading required package: lattice
#> Loading required package: ggplot2
#> Warning: package 'ggplot2' was built under R version 3.5.2

# Define fitControl
fitControl <- trainControl(
  method = "cv",
  number = 5,
  classProbs = TRUE,
  summaryFunction = twoClassSummary
)

# Define Tune
grid <- expand.grid(C = c(2^-5, 2^-3, 2^-1))

########## 
df <- iris 

df<-df[df$Species != 'setosa', ]
df$Species <- as.character(df$Species)
df$Species <- as.factor(df$Species)

# set random seed and run the model
set.seed(321)
svmFit1 <- train(x = df[-5],
                 y=df$Species,
                 method = "svmLinear", 
                 trControl = fitControl,
                 preProc = c("center","scale"),
                 metric="ROC",
                 tuneGrid=grid )

coefs <- svmFit1$finalModel@coef[[1]]
mat <- svmFit1$finalModel@xmatrix[[1]]

coefs %*% mat
#>      Sepal.Length Sepal.Width Petal.Length Petal.Width
#> [1,]   -0.1338791  -0.2726322    0.9497457    1.027411

Создано в 2019-06-11 представлением пакета (v0.2.1.9000)

Источники

  1. https://www.researchgate.net/post/How_can_I_find_the_w_coefficients_of_SVM

  2. http://r.789695.n4.nabble.com/SVM-coefficients-td903591.html

  3. https://stackoverflow.com/a/1901200/6637133

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...