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 не найдет никаких точек для рисования на неиспользуемом уровне, нет реальной проблемы с выходом из постороннего уровня.
Надеюсь, это поможет кому-то там. Майк