e1071 tune.svm: экстремально низкий показатель best.performance и не лучший параметр в показанном результате - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу провести классификацию текста SVM по двум различным измерениям (одно двоичное, другое мультиклассовое (3) и несбалансированное) (но с теми же данными).Я предварительно обработал тестовые и обучающие данные (stemming, stop-words, ...), так что у меня есть данные как в dtm, но в кадре данных с моей классификацией в качестве дополнительного столбца (как фактор, остальная частьячейки числовые).Теперь я хочу настроить его, чтобы найти лучший C-параметр, как рекомендуется.

Однако, когда я запускаю функцию tune () или tune.svm (), вывод, который я получаю для сводки (tune_level)странно.Параметр best.parameter не задан (пространство для него оставлено пустым), отображается только тип проверки и best.performance (который ниже 10% для обеих переменных!).Когда я это делаю, это прямая линия, которая остается для каждого значения C со значением «best.performance».Я не уверен, что я делаю здесь не так.

Я уже пытался использовать разные значения для C, и я также масштабировал данные до [-1; 1], но я все еще получаю тот же результат.Я также пытался сделать классификацию отдельным фактором от фрейма данных, но это также не имело никакого значения.

мой весовой вектор

wts_ideo <- 1000/table(train_test_ideo)

        1         2         3 
0.7662835 6.8027211 8.4033613 

Код настройки

tunepara_ideo <- tune.svm( ideo_tt~. , data = train_ideo, kernel="linear",
  cost=10^(-1:2), class.weights=wts_ideo, tunecontrol = tune.control(cross = 5))

tunepara_level <- tune.svm( level_tt~. , data = train_level, 
  cost=5^(-1:2), tunecontrol = tune.control(cross = 5))

Я подозреваю, что что-то не так с формой моих данных, однако я понятия не имею, в чем может быть проблема.Сначала я подумал, что это из-за class.weight (или потому что классификация не двоичная), но так как моя другая переменная, которая не использует class.weight, а также двоичная, тоже не работает, я не думаю, что это такбольше.

Вот небольшая выдержка из данных, которые я использую

> dput(a)
structure(list(support = structure(c(1.61435223135001, 1.61435223135001, 
-0.348610118070166, -0.348610118070166, -0.348610118070166), .Dim = c(5L, 
1L)), who = structure(c(-0.121854107613728, -0.121854107613728, 
-0.121854107613728, -0.121854107613728, 8.20131124287177), .Dim = c(5L, 
1L)), will = structure(c(-0.247064839669383, -0.247064839669383, 
-0.247064839669383, 1.8065799387465, -0.247064839669383), .Dim = c(5L, 
1L)), promot = structure(c(-0.206975612356537, -0.206975612356537, 
2.86055917077667, -0.206975612356537, -0.206975612356537), .Dim = c(5L, 
1L)), child = structure(c(-0.260431623180936, 3.03906902211947, 
-0.260431623180936, -0.260431623180936, -0.260431623180936), .Dim = c(5L, 
1L)), surviv = structure(c(-0.175707952396644, -0.175707952396644, 
-0.175707952396644, -0.175707952396644, 5.45770415403452), .Dim = c(5L, 
1L)), beyond = structure(c(-0.0981527714501276, -0.0981527714501276, 
10.1817141584266, -0.0981527714501276, -0.0981527714501276), .Dim = c(5L, 
1L)), die = structure(c(-0.136853020267148, -0.136853020267148, 
-0.136853020267148, 6.18656153384136, -0.136853020267148), .Dim = c(5L, 
1L)), kill = structure(c(-0.367191144103825, 2.02640755874725, 
-0.367191144103825, 2.02640755874725, -0.367191144103825), .Dim = c(5L, 
1L)), somehow = structure(c(-0.161586150207654, 6.18470989919798, 
-0.161586150207654, -0.161586150207654, -0.161586150207654), .Dim = c(5L, 
1L))), row.names = c(1095L, 1239L, 1140L, 1517L, 1112L), class = "data.frame")

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 06 мая 2019

Я думаю, что лучшая производительность в этом случае означает, что чем ниже, тем лучше. Выберите самое низкое значение, используя параметры шланга, и снова запустите svm, чтобы увидеть его точность

...