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
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.
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’
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.
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’
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
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.
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.
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
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’
Cerramos y aplicamos, y vamos a crear una simple visualización
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