Я хочу построить глубокую нейронную сеть, которая обрабатывает как категориальные, так и числовые входные слои.У меня есть три категориальные переменные со многими уровнями (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)
Мне известно о необходимости встраивания слоя.Однако я борюсь с подключением числовых и категориальных переменных, поскольку они имеют разный размер.