Red neuronal multicapa en R con Keras – Categorizar con variables numéricas

Instalación de paquetes

# install.packages("keras")
library(keras)
use_session_with_seed(1,disable_parallel_cpu = FALSE)

Generación del conjunto de entrenamiento

# Cargar datos iris desordenados (tipos de flores con sus diferentes características)
data = iris[sample(nrow(iris)),]
head(data)
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
40           5.1         3.4          1.5         0.2     setosa
56           5.7         2.8          4.5         1.3 versicolor
85           5.4         3.0          4.5         1.5 versicolor
134          6.3         2.8          5.1         1.5  virginica
30           4.7         3.2          1.6         0.2     setosa
131          7.4         2.8          6.1         1.9  virginica
# Indicar las variables predictoras
x = data[,1:4]

# Normalizar valores de variables predictoras
x = as.matrix(apply(x, 2, function(x) (x-min(x))/(max(x) - min(x))))
# Indicar la variable categórica a predecir
y = data[, "Species"]

# Crear caracterisiticas ficticias una por cada categoría
levels(y) = 1:length(y)
y = to_categorical(as.integer(y) - 1 , num_classes = 3)

 

Definir el modelo

# Crear el modelo secuencial
model = keras_model_sequential()

# Definir capas del modelo

# Crear el modelo secuencial
model = keras_model_sequential()

# Definir capas del modelo
model %>% 
  # La capa de entrada tendrá el mismo número de entradas que el total de variables predictoras
  layer_dense(input_shape = ncol(x), units = 10, activation = "relu") %>%
  # Las capas intermedias buscan caracteristicas asociadas a los datos
  layer_dense(units = 8, activation = "relu") %>%
  # La capa de salida tendrá el mismo número de salidas que las categorías a predecir
  layer_dense(units = 3, activation = "softmax")

# Visualizar el modelo definido 
summary(model)
_____________________________________________________________________
Layer (type)                  Output Shape                Param #             
=====================================================================
dense_1 (Dense)               (None, 10)                  50
_____________________________________________________________________
dense_2 (Dense)               (None, 8)                   88                 
_____________________________________________________________________
dense_3 (Dense)               (None, 3)                   27          
=====================================================================
Total params: 165
Trainable params: 165
Non-trainable params: 0

 

Compilar el modelo

# Ejecutar la red neuronal
model %>% compile(
 loss = 'categorical_crossentropy',
 optimizer = optimizer_rmsprop(),
 metrics = c('accuracy')
)

 

Entrenar el modelo

# Entrenar el modelo con el dataset generado
fit = model %>%
  fit(
    x = x,
    y = y,
    shuffle = T,
    batch_size = 10,
    validation_split = 0.2,
    epochs = 150,
    verbose = 1
  )
plot(fit)
# Entrenar el modelo con el dataset generado
fit = model %>%
fit(
x = x,
y = y,
shuffle = T,
batch_size = 10,
validation_split = 0.2,
epochs = 150,
verbose = 1
)
plot(fit)
Train on 120 samples, validate on 30 samples
Epoch 1/150
120/120 [==============================] - 0s 2ms/step - loss: 1.0946 - acc: 0.3583 - val_loss: 1.0875 - val_acc: 0.3000
Epoch 2/150
120/120 [==============================] - 0s 184us/step - loss: 1.0575 - acc: 0.5333 - val_loss: 1.0565 - val_acc: 0.6000
Epoch 3/150
120/120 [==============================] - 0s 200us/step - loss: 1.0287 - acc: 0.6833 - val_loss: 1.0324 - val_acc: 0.6000
Epoch 4/150
120/120 [==============================] - 0s 191us/step - loss: 1.0039 - acc: 0.6833 - val_loss: 1.0102 - val_acc: 0.6000
Epoch 5/150
120/120 [==============================] - 0s 191us/step - loss: 0.9810 - acc: 0.6833 - val_loss: 0.9863 - val_acc: 0.6000
E

Otros artículos que pueden ser de interés:

Autor: Diego Calvo