Deep learning: Neural network

Vamos a implementar una red neuronal utilizada para prediccion de valores.

Idea

Vamos a trabajar para poder predecir la fortaleza del concreto, si bien es un material amplisimamente utilizado, debido a que esta compuesto por una gran cantidad de materiales es dificil precedir su fortaleza en el producto final.

El objetivo es predecir la fortaleza del concreto dado un conjunto de materiales de entrada.

Consideraciones generales

Normalizacion de los datos

Los algoritmos de NN funcionan mejor cuando los datos de entrada estan dentro de una escala lo mas cercana a cero (en la medida de lo posible), entonces una de las principales tareas al momento de explorar la data, es verificar cual es la escala de nuestros datos a traves de la funcion summary, en nuestro caso vemos que el rango va desde 0 a 1000.

normalize <- function (x){
  return ((x - min(x)) / (max(x) - min(x)))
}

concrete_norm <- as.data.frame(lapply(concrete, normalize))

summary(concrete$strength)
summary(concrete_norm$strength)

En otros ejemplos anteriores, utilizamos la funcion normalize que tambien utilizaremos en este caso, aplicandola a todos nuestros datos de entrada,  esto es, aplicandola a todo el dataset.

Algoritmos de NN

Si bien es claro que vamos a utilizar neural network tambien es necesario aclarar que existen distintas implementaciones:

  • neuralnetwork package nos ofrece una implementacion estandar y por sobre todo facil de usar.
  • RSNNS package, nos ofrece todas las funcionalidades de una red neural, pero la curva de aprendizaje es mas alta.

Verificacion de los datos obtenidos

Para poder generar predicciones acerca de futuros datos vamos a utilizar la funcion neuralnet::compute esto nos va a devolver dos componentes:

  • $neurons, donde se almacenan los neurones de cada capa de la red
  • $net.results, donde se almacenan los valores que se predijeron

Luego analizamos la correlacion entre los resultados obtenidos por el modelo y los ejemplos que se dejaron en el dataset de test, de forma de verificar la correspondencia entre ambos conjuntos de datos.

Capas ocultas

Cuando trabajamos para mejorar el modelo una de las primeras cosas que podemos hacer es incluir capas ocultas. La gran pregunta es como determinamos el numero de capas que nos va a permitir alcanzar los mejores resultados, pues bien, la respuesta no es sencilla o directa y en gran parte depende de prueba y error. Algunos lineamientos basicos son:

  • No siempre incluir muchas capas permite alcanzar los mejores resultados.
  • Para set de datos con pocos datos, un numero adecuado suele ser 5.
  • Prueba y error.

En nuestro ejemplo, encontramos que luego de varios cambios en la cantidad de layers el mejor resultado posible se alcanza con 4 capas.

Correlation results with different hidden layers

Hidden
1234510152025
Correlation0.72220282270.75376852190.71528441860.78782226970.78152487820.73361178430.70446051940.64742221980.597629634

Implementacion tecnica

Get the data and exploring the data

## Step 1. Get data
url_data <- "https://raw.githubusercontent.com/stedy/Machine-Learning-with-R-datasets/master/concrete.csv"
concrete <- read_csv(url(url_data))

## Step 2. Exploring and Analyzing data
str(concrete)
concrete_train <- concrete_norm[1:773,]
concrete_test <- concrete_norm[774:1030,]

Creating the model and verifying the model

## Step 3: Creating model 
concrete_model <- neuralnet::neuralnet(strength ~ cement + slag + ash + water + superplastic + coarseagg + fineagg + age, 
                                       data = concrete_train)

plot(concrete_model)

## Step 4: Evaluating the model
model_results <- neuralnet::compute(concrete_model, concrete_test[1:8])
predicted_strenght <- model_results$net.result
cor(predicted_strenght, concrete_test$strength)
# 0.7188351766

Improving the model

## Step 5: Improving model performance
concrete_model2 <- neuralnet::neuralnet(strength ~ cement + slag + 
                                                    ash + water + superplastic + 
                                                    coarseagg + fineagg + age, 
                                       data = concrete_train,
                                       hidden = 10)

plot(concrete_model2)

## Step 6: Evaluating the improved model
model_results2 <- neuralnet::compute(concrete_model2, concrete_test[1:8])
predicted_strenght2 <- model_results2$net.result
cor(predicted_strenght2, concrete_test$strength)

 

Sources

Bibliografia

Machine Learning with R by Brett Lantz