Как я могу использовать категориальный / факторный ввод для модели Neura lNet с R - PullRequest
0 голосов
/ 15 января 2020

Я попытался выполнить искусственную нейронную сеть (ann) с R, и мои данные имеют некоторые категориальные / факторные переменные. Насколько я знаю, мне нужно создать несколько фиктивных переменных для решения этой проблемы, и, вероятно, мне нужно будет ввести переменные в модель.

Я попытался использовать метод model.matrix и создал модель ann. Однако я не смог вычислить его с тестовыми данными, которые имеют точно такой же формат, что и данные обучения, за исключением столбца продаж.

Я знаю, что проблема возникает после того, как я создал фиктивные переменные. Модель не может найти то же имя столбца и не может вычислить. Как я могу использовать свои тестовые данные и вычислить год?

Вот моя строка данных;

'data.frame':   142 obs. of  19 variables:
 $ category: Factor w/ 3 levels "WJP","WPI","WSLS": 3 3 3 3 3 3 3 3 3 3 ...
 $ mm      : Factor w/ 2 levels "A","B": 1 1 1 1 1 1 1 1 1 1 ...
 $ profile : Factor w/ 4 levels "K","L","M","X": 1 1 1 1 1 1 1 1 1 1 ...
 $ nv      : int  0 0 0 0 0 0 0 0 0 1 ...
 $ vp      : int  0 0 0 0 0 0 0 1 1 0 ...
 $ color   : Factor w/ 17 levels "B","BEG","BL",..: 17 1 9 3 14 15 3 17 3 17 ...
 $ cli     : Factor w/ 2 levels "OTHER","SEASON": 2 2 2 2 2 2 2 2 2 2 ...
 $ stylec  : int  3 3 3 3 6 3 6 3 3 3 ...
 $ rtn     : int  17 2 2 2 2 2 4 7 2 2 ...
 $ dev     : num  2.51 2.25 2.25 2.25 2.25 ...
 $ stosale : num  10.75 2.25 2.25 2.25 2.25 ...
 $ dm1     : num  19507.8 19.6 14.6 19.6 36.9 ...
 $ dm2     : num  3092.74 5 4.2 5 7.74 ...
 $ dm3     : num  1691.04 3.75 3.31 3.75 5.25 ...
 $ grossp  : num  2710.98 2.25 2.25 2.25 2.25 ...
 $ grossDM : num  2.48 2.25 2.25 2.25 2.25 ...
 $ firstsp : num  39.67 2.25 2.25 2.25 2.25 ...
 $ qty     : num  106213 7661 6671 23500 18722 ...
 $ sales   : num  272.25 2.25 2.25 2.25 2.25 ...

Вот код:

library(neuralnet)
df<- read.csv("de2.csv",sep=";")

df_matrix <- model.matrix(~ category+ mm + profile + nv + vp + color + cli + stylec + rtn + dev + stosale + dm1 + dm2 + dm3 + grossp + grossDM + firstsp + qty + sales, data=df)
colnames(df_matrix)

col_list <- paste(c(colnames(df_matrix[,-c(1,39)])),collapse="+")
col_list <- paste(c("sales~",col_list),collapse="")
f <- formula(col_list)

set.seed(7896129)
nn1=neuralnet(f, data=df_matrix, hidden=3, act.fct = "logistic", linear.output = FALSE)

dft<- read.csv("deft.csv",sep=";")
result=compute(nn1, dft)
result$net.result

====================== =====

Я нашел решение для своей проблемы, но все же хотел бы получить ответ на мой вопрос. В качестве решения я разделил свои данные на данные поезда и теста, а затем запустил neura lnet с данными поезда, следуя кодам. Поэтому вместо чтения тестовых данных из другого CSV-файла в необработанном виде я использовал те же данные. Но все же я хотел бы запустить мою модель для необработанных данных, если это возможно, как в первую очередь.

index <- sample(1:nrow(df_matrix),round(0.75*nrow(df_matrix)))
train <- df_matrix[index,]
test <- df_matrix[-index,]

nn1=neuralnet(f, data=train, hidden=3, act.fct = "logistic", linear.output =FALSE)
result=compute(nn1, test[,1:38])

1 Ответ

0 голосов
/ 14 марта 2020

У вас есть 142 наблюдения и 19 переменных. Одна из ваших переменных, 'color', имеет 17 уровней. Когда вы разделяете ваши данные на поезд / тест в пропорциях 75/25, это означает, что ваш тестовый набор будет иметь 0,25 * 142 или около 35 наблюдений. Это предполагает, что с переменной с 17 категориями вы можете обнаружить, что некоторые или даже многие категории отсутствуют в наблюдениях в тесте. Возможно, вам нужно больше данных или меньше категорий. Можно ли объединить «цветные» категории в меньшее число? Что происходит, когда вы отбрасываете «цвет» с вашей модели?

Можете ли вы получить больше данных? Если это невозможно, вы можете использовать методы «джиттера» для увеличения размера ваших данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...