2016-04-06 2 views
0

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

Ошибка в scale.default (NewData [, объект $ масштабируется, падение = FALSE], центр = объект $ x.scale $ "масштабируется: центр",: длина 'центра' должно равняться числу столбцы «х»

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

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

+0

Отъезд [это] (http://stackoverflow.com/questions/22149280/support-vector-machine-works-on-training-set-but-not-on-test-set-in-r-using -e10), это может дать некоторое представление. – steveb

ответ

0

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

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

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

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

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

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

0

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

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

Смежные вопросы