Я использовал пакет neuralnet для построения модели классификации в R. Однако столкнулся с известной ошибкой:
Error in cbind(1, pred) %*% weights [[num_hidden_layers + 1]]:
requires numeric/complex matrix/vector arguments
Здесь есть много других подобных вопросов, но ни один из них не решил мою проблему. Вот шаги, которые я предпринимаю:
model.matrix
для создания фиктивных столбцов (гарантируя, что ни один столбец не является фактором или строкой)paste
neuralnet
с использованием набора данных с горячим кодированием на шаге 1 и формулы, созданной на шаге 2.До сих пор все в порядке. Нет ошибки. Модель сходится после 5000 итераций. Однако, когда я использую функции compute или predict для предсказания тестовых данных, это дает мне указанную выше ошибку.
Я почти уверен, что столбцы одинаковы и имеют одно и то же имя. Кроме того, класс является числовым для каждого атрибута. Я сказал себе, что, возможно, тестовый набор плохо трансформируется с помощью model.matrix, поэтому я использовал тот же тренировочный набор в функции прогнозирования/вычисления! Удивительно, но для одного и того же тренировочного набора выдает аналогичную ошибку! Если данные не являются числовой/сложной матрицей, как они сначала обучаются и не могут быть предсказаны сейчас?
PS: я не могу поделиться данными из-за проблемы с конфиденциальностью. Это упрощенный код:
trainset = model.matrix(~., data=train_roig)
NN_model = neuralnet(f, trainset[,-c(1:2)], hidden = c(4,2))
# NO ERROR
compute(NN_model, trainset[,-c(1:2)])
# GIVES ME THE ERROR
predict(NN_model, trainset[,-c(1:2)])
# GIVES ME THE SAME ERROR
Двойная проверка имен столбцов:
NN_model$model.list$variables == colnames(trainset[,-c(1:2)])
# TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Проверка состава поезда после применения model.matrix:
str(trainset)
# num [1:134260, 1:19] 0 0 0 0 0 0 0 0 0 ...
# -attr(*, "dimnames") = list of 2
# ..$ : chr [1:134260] "1" "2" "3" "4" ...
# ..$ : chr [1:19] "Y" "n_trips" "age" "sexM" ...
@MrFlick Поскольку мне не удалось скопировать и вставить код с удаленного рабочего стола, я набрал их. Это причина отсутствия ) или ]. Я исправил их здесь. Там они правильные. Это очень специфическая проблема, и создать для нее какой-либо другой воспроизводимый пример непросто. Какие другие шаги отладки вы предлагаете? Вы упомянули проблему с данными. Что именно вы имеете в виду?
Какие типы данных столбцов задействованы? Что возвращает str(trainset)? Кажется, это работает с образцом на странице справки nn <- neuralnet(Species == "setosa" ~ Petal.Length + Petal.Width, iris, hidden=c(4,2)); predict(nn, iris), так чем ваши данные отличаются? У вас есть какие-либо NA или бесконечные значения? Попробуйте использовать debugonce(neuralnet:::predict.nn), чтобы просмотреть код, чтобы увидеть, что происходит в функции.
Нет значения NA или бесконечного числа. набор данных iris — это фрейм данных; однако я использовал model.matrix для преобразования столбцов факторов в числовые. Поэтому результат функции str немного странный. Я добавил результат str к своему исходному вопросу, если это поможет.
Одной из возможных проблем является конвергенция. Если число stepmax достигает, но значение по умолчанию threshold не соответствует, то модель не будет генерировать никакого веса.
Используйте plot(trainset), чтобы убедиться, что ваши веса сгенерированы. Если не удалось построить вашу сеть из-за отсутствия веса, вам нужно увеличить threshold или stepmax, чтобы модель подошла.
Эта проблема возникает только с neuralnet. Другие функции, с которыми я работал, даже если они не сходятся, дадут вам последний вес перед последним шагом. Однако этот пакет освобождает веса только в том случае, если он сходится.
Кажется, у вас есть некоторые синтаксические ошибки здесь. Такие вещи, как отсутствие ] и ). Вы уверены, что это код, который вы используете? Сообщение об ошибке, безусловно, звучит как проблема с данными, но если вы не можете поделиться воспроизводимым примером, вам будет очень сложно помочь.