Полиномиальная классификация с использованием пакета нейронных сетей

Этот вопрос должен быть очень простым. Но документация не помогает.

Я использую R. Я должен использовать пакет neuralnet для задачи полиномиальной классификации.

Все примеры относятся к биномиальному или линейному выходу. Я мог бы сделать некоторую реализацию «один против всех», используя биномиальный вывод. Но я считаю, что должен быть в состоянии сделать это, имея 3 единицы в качестве выходного слоя, где каждый является биномиальным (т.е. вероятность того, что это правильный результат). Нет?

Это то, что я бы использовал nnet (который, я считаю, делает то, что я хочу):

data(iris)
library(nnet)
m1 <- nnet(Species ~ ., iris, size = 3)
table(predict(m1, iris, type = "class"), iris$Species)

Это то, что я пытаюсь сделать, используя neuralnet (взлом формулы, потому что neuralnet, похоже, не поддерживает обозначение «.» в формуле):

data(iris)
library(neuralnet)
formula <- paste('Species ~', paste(names(iris)[-length(iris)], collapse='+'))
m2 <- neuralnet(formula, iris, hidden=3, linear.output=FALSE)
# fails !

person Ricardo Magalhães Cruz    schedule 28.12.2013    source источник
comment
Похоже, что пакет neuralnet был обновлен и теперь поддерживает эту функциональность (начиная с версии 1.44.1). Таким образом, приведенный выше код больше не дает сбоев, а также точки в формулах не поддерживаются.   -  person UBod    schedule 25.11.2019


Ответы (2)


Вы правы в том, что интерфейс формулы neuralnet() не поддерживает '.'.

Однако проблема с вашим кодом выше скорее в том, что фактор не принимается в качестве цели. Сначала вы должны расширить фактор Species до трех двоичных переменных. По иронии судьбы, лучше всего это работает с функцией class.ind() из пакета nnet (которому такая функция не нужна, поскольку nnet() и multinom() прекрасно работают с факторами):

trainData <- cbind(iris[, 1:4], class.ind(iris$Species))
neuralnet(setosa + versicolor + virginica ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, trainData)

Это работает - по крайней мере, для меня.

person UBod    schedule 15.02.2014
comment
как бы вы сделали это, если бы ваши выходные слои исчислялись тысячами и вы не могли бы написать это вручную? - person nak5120; 24.02.2017
comment
Предположим, у вас есть 1000 выходов с именами z1...z1000 и 2000 входов с именами x1...x2000, тогда вы можете создать строку с формулой и преобразовать ее в формулу следующим образом: as.formula(paste(paste0(z, 1) :1000, свернуть= + ), ~, вставить0(x, 1:2000, свернуть= + ))) - person UBod; 28.02.2017

Возможно, вам стоит взглянуть на http://cran.r-project.org/web/packages/nnet/nnet.pdf, описание содержимого пакета. Вы можете видеть, что есть функция, называемая multinom, которая помогает вам достичь этого.

По сути, он разделит виды качественных столбцов на количественные столбцы (что и делает class.ind), а затем попытается предсказать значения для этих новых искусственных столбцов.

nn ‹- мультином (вид ~ ., ирис)

Я не уверен, что ответил на ваш вопрос, потому что у меня такое ощущение, что вы пытаетесь сделать с нейронной сетью что-то, что не работает с nnet. Если я ошибаюсь, то... извините ;)

person batiste    schedule 10.02.2014