Ошибка в обучении модели SVM: Ошибка: для одного или нескольких уровней факторов в результате нет данных: "2"

У меня есть следующий набор данных (дан образец первых 10 строк)

structure(list(variableA = c(11L, 7L, 17L, 7L, 7L, 2L, 
2L, 7L, 7L, 4L), variableB = c(10L, 20L, 4L, 0L, 0L, 1L, 
1L, 0L, 0L, 2L), variableC = c(284L, 
43L, 19L, 0L, 0L, 27L, 27L, 0L, 0L, 20L), variableD = c(299L, 
24L, 28L, 167L, 167L, 27L, 27L, 194L, 194L, 21L), variableE = c(2, 
1, 1, 1, 1, 1, 1, 1, 1, 1), variableF1 = c(0L, 0L, 
0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L), variableF2 = c(0L, 
0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L), variableF3 = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), variableF4 = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), variableF5 = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), variableF6 = c(1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), variableF7 = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), variableF8 = c(0L, 
1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), variableF9 = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), variableF10 = c(0L, 
0L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L), variableG1 = c(1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), variableG2 = c(0L, 
0L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L), variableG3 = c(0L, 
1L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L), clusters = structure(c(3L, 
3L, 3L, 3L, 3L, 3L, 3L, 1L, 6L, 6L), .Label = c("1", "2", "3", 
"4", "5", "6"), class = "factor"), out = structure(c(1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 6L, 6L), .Label = c("3", "1", "2", "4", 
"5", "6"), class = "factor")), row.names = c(1L, 3L, 4L, 5L, 
6L, 8L, 9L, 12L, 13L, 14L), class = "data.frame")

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

модель, которую я пробую, это

set.seed(111)
trctrl <- trainControl(method = "repeatedcv", number = 10, repeats = 3)
svm_Linear <- train(out~`variableA`                   + `variableB`      +              
                      `variableC` +`variableD`+
                      `variableE`                           +`variableF1`            +
                      `variableF2`            + `variableF3`           +
                      `variableF4`            + `variableF5`           + 
                      `variableF6`            + `variableF7`           + 
                      `variableF8`            + `variableF9`           + 
                      `variableF10`            + `variableG1`                  + 
                      `variableG2`                   + `variableG3`  , data= train, method = "svmLinear",
                    trControl=trctrl,
                    preProcess = c("center", "scale"),
                    tuneLength = 10)
svm_Linear

Но я получаю эту ошибку, которую не могу понять.

Error: One or more factor levels in the outcome has no data: '2'

Я видел похожий пост на этом сайте, но ни у одного нет ответа, который мне нужен

1 ответ

Решение

Твой out столбец представляет собой фактор с 6 уровнями, но только 3 представлены в dput вы указали в своем сообщении - вот почему вы получаете эту ошибку.

levels(train$out)
# "3" "1" "2" "4" "5" "6"

unique(train$out)
# 3 1 6
# Levels: 3 1 2 4 5 6

Вероятно, это связано с тем, как вы выполнили разделение на поезд / тест.

Вы можете переопределить levels(out) включить только c(1, 3, 6), но это будет проблемой, если ваши тестовые данные содержат другие уровни ответа.

Вместо этого рассмотрите возможность использования подхода стратифицированной выборки, чтобы убедиться, что ваша переменная ответа правильно представлена ​​в группе поезд / тест. Вопросы о стратифицированной выборке больше подходят для перекрестной проверки, чем для переполнения стека, но есть несколько хороших отправных точек, упомянутых в этом сообщении SO и в этом.

Другие вопросы по тегам