El otro día me comentaba un científico de datos al que respeto profundamente que está flipando con poder usar sus modelos de python guardados en pickle dentro de R usando la librería reticulate
y crear una shiny app, de hecho su comentario literal fue “estoy haciendo unos shinys
monísimos”.
El tema es que ayer me puse a investigar la maravillosa librería de la gente de databricks MLflow, ¡gracias Diego por animarme a probarla!, la cual merece por sí sola varias entradas. Total, que cómo yo soy usuario impenitente de R, que para eso soy el vice de la Comunidad R-Hispano pues me puse a instalar la librería de MLflow para R y ejecutar este ejemplo en Rstudio
library(mlflow)
# Read parameters
column <- mlflow_log_param("column", 1)
# Log total rows
mlflow_log_metric("rows", nrow(iris))
# Train model
model <- lm(Sepal.Width ~ iris[[column]], iris)
# Log models intercept
mlflow_log_metric("intercept", model$coefficients[["(Intercept)"]])
mlflow::mlflow_ui()
Y nada, que se me queja de que no encuentra el conda
binary, y pienso, pero si está instalado y configurado el path en mi .bashrc
. Investigando un poco resulta que Rstudio en ubuntu pasa olímpicamenteq del .bashrc
del usuario, así que he creado un .Rprofile
en el proyecto de rstudio dónde estoy probando estas cosas.
.Rprofile
Sys.setenv(PATH ="/home/jose/Descargas/anaconda3/bin:/home/jose/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/db/bin:/usr/lib/jvm/java-8-oracle/jre/bin:/home/jose/Descargas/sublime_text_3")
Sys.setenv(RETICULATE_PYTHON = "/home/jose/Descargas/anaconda3/bin/python")
Y con esto ya puedes hacer
mlflow_install()
que instala un entorno de conda que llama r-mlflow
con las librerías necesarias.
Para usar ese entorno podemos usar
reticulate::use_condaenv("r-mlflow")
En ese entorno tengo instalado también pandas
, numpy
y sklearn
así que veamos un ejemplito tonto de cómo reticulate convierte al vuelo entre ambos lenguajes.
library(reticulate)
library(tidyverse)
## ── Attaching packages ─────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.1.0 ✔ purrr 0.3.2
## ✔ tibble 2.1.1 ✔ dplyr 0.8.0.1
## ✔ tidyr 0.8.3 ✔ stringr 1.4.0
## ✔ readr 1.3.1 ✔ forcats 0.4.0
## ── Conflicts ────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
Importamos numpy
y pandas
dentro de R!
np <- import("numpy")
pd <- import("pandas")
Y podemos utilizar los métodos de numpy y pandas usando el $
x <- rnorm(10000, 2, 3)
x_mean_np <- np$mean(x)
x_mean_np
## [1] 1.991266
x_python <- r_to_py(x)
class(x_python)
## [1] "python.builtin.list" "python.builtin.object"
Con np$mean(x)
convierte al vuelo el array de R a lista de python calcula la media y devuelve un numeric
de R. reticulate
convierte muchas estructuras de datos entre los dos lenguajes, de forma que, tal y como comentaba mi amigo, podemos usar modelos entrenadas en python y guardados en un pickle para predecir sobre data.frames de R. ¡Qué cosas!