e1071 SVM: ошибка при попытке предсказать

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

Ошибка в scale.default(newdata[, object$scaled, drop = FALSE], center = object$x.scale$"scaled:center",: длина 'center' должна равняться количеству столбцов 'x'

Я использую набор данных радужной оболочки по умолчанию, и вот весь мой код. Это попытка реализации мультиклассового SVM с использованием парного метода.

# pass in the dataframe & the number of classes
multiclass.svm <- function(data) {
  class.vec = data[,length(data)]
  levels = levels(class.vec)
  pair1 <- data[which(class.vec == levels[1]),]
  pair1 <- droplevels(pair1)
  pair2 <- data[which(class.vec == levels[length(levels)]),]
  pair2 <- droplevels(pair2)
  pairs = list(rbind(pair1, pair2))
#  print(pairs)
  for(i in 2:length(levels)){
    L1 <- data[which(class.vec == levels[i-1]),]
    L1 <- droplevels(L1)
    L2 <- data[which(class.vec == levels[i]),]
    L2 <- droplevels(L2)
    pair <- list(rbind(L1, L2))
    pairs <- c(pairs, pair)
  }
  # now we construct our (n choose 2) binary models
  models = list()
  for(pair in pairs){
    classifier = pair[,length(pair)]
    p.svm = svm(formula=classifier~., data=pair)
    models = c(models, list(p.svm))
  }
  for(model in models){
    test = iris[1,]
    print(predict(model, test))
  }
  return(models)
}

Тестирование / использование:

> h = multiclass.svm(iris)
 Show Traceback

 Rerun with Debug
 Error in scale.default(newdata[, object$scaled, drop = FALSE], center = object$x.scale$"scaled:center",  : 
  length of 'center' must equal the number of columns of 'x' 
> 

Буду очень признателен за любую помощь... Я нашел несколько других вопросов на эту тему безрезультатно. Спасибо.

2 ответа

Я испытал ту же проблему. Я исправил ошибку, преобразовав все предикторы в наборе тестов в их правильный класс, т.е. as.factor, as.numeric,

Например, если numeric Предикторная переменная в обучающем наборе находится в памяти как character переменная в вашем тестовом наборе вы получите эту ошибку. Надеюсь, это поможет.

Итак, ответ, к сожалению, довольно сложный (в зависимости от вашего набора данных.) Проблема в том, что в наборе данных радужной оболочки существует ТРИ уровня классификации. Поскольку я разбил классы на пары, каждая из моих моделей имеет только ДВА уровня классификации.

При использовании прогнозирования модели, на которой вы обучались, и значение, которое вы тестируете, должны иметь одинаковые уровни. Таким образом, сложная часть (по крайней мере, в этом случае) удаляет ненужные уровни из каждой пары.

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

Благодарим этого польского блогера за то, что он направил меня в правильном направлении: http://ppiotrow.blogspot.com/2013/04/solved-r-svm-test-data-does-not-match.html

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

Надеюсь, это поможет кому-то там. Майк

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