Machine Learning en Power BI con R: poniendo en producción un proyecto de ML

En este post voy a ilustrar e ir explicando como poner un proyecto Machine Learning desarrollado con R en producción, iniciando desde 0

Vamos a desarrollar el proyecto en RStudio, y vamos a realizar algo muy simple. No vamos a detenernos en muchos detalles, ya que este es un post ilustrativo.

Antes de iniciar, asegurese de tener instalado tanto R como RStudio en su equipo local, así como R y RStudio en Power BI correctamente configurado.

Para saber si esta debidamente configurado, solo tiene que ir a ‘Opciones y Configuración > Opciones > R scripting, y asegúrese que Power BI ha detectado el directorio donde esta instalado R y RStudio respectivamente

No alt text provided for this image

Vamos a usar un dataset que ya esta disponible en R, que se llama ‘Sonar’. Vamos a echar un vistazo, y observamos que contiene 208 observaciones (líneas) y 61 variables (columnas).

Todas las columnas que están tituladas desde la V1 hasta la V60 contienen datos numéricos, y la ultima columna ‘Class’ contiene 2 categorías: ‘M’ y ‘R’.

Nuestro objetivo es ser capaces de predecir si ‘Class’ es ‘M’ o ‘R’, si conocemos los valores numéricos de las otras 60 columnas, de la V1 a la V60.

Para ello, usaremos un algoritmo supervisado de clasificación bi-variable, que generara un modelo ‘Random Forest’, de la familia de árboles. Es un modelo estadístico muy potente para realizar análisis predictivo cuando tenemos gran cantidad de variables.

No alt text provided for this image

Por si quieren reusar el código, aquí se los dejo:

# Instalen los siguientes paquetes, en caso de que no los tengan

install.packages(“caret”)

install.packages(“mlbench”)

install.packages(“randomForest”)

# Cargamos las librerias

library(caret)

library(mlbench)

library(randomForest)

# cargamos el dataset. Usaremos 'Sonar' que ya viene pre-cargado

data(Sonar)

Sonar <- Sonar

# exploramos el dataset

Sonar

set.seed(7)

# Hacemos una particicion 80%/20% para entrenamiento y validacion

validacion_indice <- createDataPartition(Sonar$Class, p=0.80, list=FALSE)

validacion <- Sonar[-validacion_indice,]

entrenamiento <- Sonar[validacion_indice,]

# creamos el modelo predictivo

set.seed(7)

modelo_final <- randomForest(Class~., entrenamiento, mtry=2, ntree=2000)

# guardamos el modelo predictivo

saveRDS(final_model, "./final_rf_model.rds")

 En este punto, deben haber guardado el modelo final en un documento ‘.rds’, en su directorio de trabajo. He llamado a este modelo final (con su pipeline) ‘final_rf_model.rds’

No alt text provided for this image

Ahora debemos ir a Power BI y poner el modelo en producción para hacer nuevas predicciones.

Para ello, necesitamos cargar datos en memoria en Power BI que cumplan algunos requisitos:

-      Las columnas tienen que ser denominadas exactamente iguales que las columnas que se usaron para generar el modelo predictivo

-      Los tipos de datos (numero, texto, fecha, etcétera) deben ser iguales a los que se usaron para generar el modelo predictivo

-      No es necesario incluir la columna ‘Class’ que se usó para el modelo predictivo, ya que es la que queremos predecir, y que contiene los valores ‘M’ o ‘R’

Teniendo todo esto en cuenta, he creado un dataset en formato csv con 60 columnas y 50 líneas (además de la línea 1 de los títulos de cabecera), de la V1 a la V60 y con valores aleatorios de 0 a 1 en cada celda. No he incluido la columna ‘Class’, que es la que queremos predecir.

Vamos a cargar estos datos en Power BI, como un documento csv de texto habitual. 

No alt text provided for this image

Una vez cargados en Power Query, me aseguro que los títulos de columna están correctamente ubicados y también el tipo de dato en todas las columnas es tipo ‘numero decimal’

No alt text provided for this image

Una vez cargados los datos en Power Query, vamos a abrir el script de R en la sección ‘Transform’, donde vamos a insertar el nuevo código que necesitamos

No alt text provided for this image

Una vez aquí, vamos a importar el modelo que hemos generado en RStudio sobre este nuevo dataset, y generar una predicción que vamos a insertar como nueva columna en el mismo dataset.

No alt text provided for this image

Este es el código que necesitamos insertar en el script de R

library(mlbench)

library(randomForest)

modelo <- readRDS("C:\\Users\\Pablo_J_Moreno\\Documents\\final_rf_model.rds")

prediccion <- predict(modelo, dataset)

Sonar_prediccion <- cbind(dataset, prediccion)

Tras presionar el OK, nos solicitara los permisos de privacidad, que ignoramos en nuestro caso.

No alt text provided for this image
No alt text provided for this image

Ya el modelo se cargó, se ejecuta y realiza la predicción. El resultado es una nueva tabla que incluye la nueva columna, que expandimos

No alt text provided for this image

Y tenemos nuestra tabla original, aunque si mueven la barra hacia la derecha, verán al final una nueva columna que se llama ‘prediccion’, con la predicción de los valores ‘M’ o ‘R’

No alt text provided for this image

Cerramos y aplicamos, y vamos a crear una simple visualización

No alt text provided for this image

Piense que en este caso usamos un documento estático .csv para realizar la predicción, pero funciona perfectamente si conecta los datos a una base de datos u otra fuente más dinámica y transaccional. Esto le permitiría realizar predicciones de manera dinámica.

Por otra parte, puede subir el documento Power BI al servicio y funcionara igualmente, sin embargo, necesita configurar el Gateway (puerta de enlace) en modo personal, ya que el script de R en Power Query esta usando su maquina local para generar predicciones.

Espero que les haya sido de utilidad

Saludos

Pablo J Moreno

Sr Data Scientist