Как правильно объединить категориальные и числовые входы, используя вложения для Keras в R? - PullRequest
0 голосов
/ 29 мая 2019

Я хочу построить глубокую нейронную сеть, которая обрабатывает как категориальные, так и числовые входные слои.У меня есть три категориальные переменные со многими уровнями (300+) и три категориальные переменные только с несколькими уровнями.

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

Однако я борюсь за реализацию своей сетевой архитектуры и сомневаюсь, имеет ли эта структура смысл.У меня есть несколько выходных переменных.

Я сделал воспроизводимый пример с категориальными и числовыми данными.На самом деле мои переменные имеют гораздо больше уровней.

library(dplyr)
library(keras)
library(caret)

#Load the fictional data
data(cars) 

#Set as factor
for(i in 3:18){
  cars[,i] <- as.factor(cars[,i])
}

#Create numerical variables
cars$weight <-runif( 804, 500.0, 700.5)
cars$heigth <-runif( 804, 1.0, 2.0)

#Select Y
Y <- cars[,1:2]

#Categorical X
X_cat <- cars[,-c(1,2)] %>% select_if(.,negate(is.numeric))

#Numerical X
X_num <- cars[,-c(1,2)] %>% select_if(.,is.numeric)


#Format categorical variables to one hot
dmy <- caret::dummyVars(" ~ .", data = X_cat,fullRank=FALSE)
X_cat <- data.frame(predict(dmy, newdata = X_cat))

#Categorical input
cat_layer <- layer_input(shape = 33,  name = 'cat_input') %>% layer_embedding(input_dim = 33, output_dim = 16,trainable = TRUE) %>% layer_dense(units=50, activation= "relu", trainable = TRUE) %>% layer_reshape(target_shape = 50,trainable = TRUE,name="cat_layer")

#Numerical input
num_layer <- layer_input(shape = 2,  name = 'num_input') %>% layer_dense(units=50, activation= "relu",input_shape = 2, trainable = TRUE) %>% layer_reshape(target_shape = 50,trainable = TRUE,name="num_layer")

#make model
model_keras <- keras_model_sequential() %>%

  #COncatenate both inputs
  layer_concatenate(inputs=c(cat_layer,num_layer),trainable = TRUE) %>%

  #Only one hidden layer
layer_dense(
  units              = 2, 
  kernel_initializer = "normal", 
  activation         = "relu", 
  input_shape        = 50) %>% 

  #Compile model
  compile(
    optimizer = 'adam',
    loss      = 'mean_absolute_percentage_error',
    metrics   = 'mean_absolute_percentage_error'
  )

#Fit the model
model_keras %>% fit(list(cat_input, num_input), epochs = 100)

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

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