Big data, big data, big data por doquier. Desde la explosión de los smartphones y más tarde de los dispositivos IoT, tenemos en el mundo miles de millones de dispositivos generando datos constantemente: nuestras comunicaciones, nuestra posición geográfica, los datos sobre nuestras constantes vitales y nuestra salud, el tráfico, los sensores meteorológicos, etc. Toda esta ingente cantidad de datos debe procesarse para que sean útiles, y la mayor utilidad que se le puede dar a esos datos es hacer predicciones.
Es en ese punto donde entra en juego el Machine Learning, y Python se ha erigido como el lenguage de programación líder indiscutible en este campo. Python no es el más rápido, ni el más potente, ni el más bonito. Pero tiene algo que nadie le puede quitar: su relación entre facilidad de aprendizaje y capacidades. Es un lenguaje fácil de entender, relativamente sencillo de aprender y con un ejército de librerías y módulos que facilitan muchísimo las tareas cotidianas de proceso de datos. Creo que ese es el motivo por el que la comunidad científica y la gente interesada en Machine Learning lo ha adoptado como el lenguaje de facto para análisis de datos.
1. Entrenando nuestro modelo
En este artículo te voy a explicar como entrenar un modelo con Python para calcular el precio de una vivienda en relación a sus metros cuadrados usando datos ya conocidos, y lo más importante, guardar este modelo para poder usarlo posteriormente en otros programas. Lo importante aquí no es el funcionamiento del modelo en si, sino la exportación del mismo para no tener que entrenarlo cada vez que queramos hacer este cálculo. En este ejemplo usamos pocas muestras, pero los datos de entrenamiento pueden tener miles o incluso millones de líneas. Entrenarlos cada vez que se requiera una predicción implicaría un despilfarro considerable de tiempo y energía.
Empecemos definiendo nuestro dataset en un fichero CSV. Esto es el conjunto de datos reales que vamos a usar para enseñar a nuestro modelo a calcular precios:
area,price 60,150000 120,265000 150,300000 260,520000 300,625000
Para entrenar nuestro modelo vamos a usar las siguientes librerías:
- Pandas: principalmente lo usaremos para cargar en memoria nuestro dataset
- Scikit-Learn: la librería más extendida de Machine Learning para Python
El siguiente script train_area_model.py muestra como cargar nuestro dataset en memoria y usar sus datos para entrenar un modelo de regresión lineal que calcule el precio de una vivienda en función de su área.
import pandas as pd from sklearn import linear_model # cargar el dataset en memoria training_dataset = pd.read_csv("area.csv") # crear un modelo que use el algoritmo de regresion lineal # y entrenarlo con los datos de nuestro csv regression_model = linear_model.LinearRegression() print ("Training model...") # entrenamiento del modelo regression_model.fit(training_dataset[['area']], training_dataset.price) print ("Model trained.") # pedir al usuario que introduzca un area y calcular # su precio usando nuestro modelo input_area = int(input("Enter area: ")) proped_price = regression_model.predict([[input_area]]) print ("Proped price:", round(proped_price[0], 2))
Si lo guardamos en el mismo directorio que nuestro dataset area.csv y lo ejecutamos, podremos preguntarle a nuestro modelo cual es el precio adecuado para una casa de 105 metros cuadrados:
$ python3 train_area_model.py Training model... Model trained. Enter area: 105 Proped price: 229569.05
Ahora ya tenemos un programa que entrena un modelo de aprendizaje automático que predice precios de casas en función de sus metros cuadrados.
Supongamos que quiero usar este modelo en otros programas, o quiero compartirlo con mis colegas para que puedan usarlo en sus aplicaciones y beneficiarse así de la experiencia adquirida con mis datos, pero no queremos volver a entrenar nuestro modelo cada vez que ejecutamos el programa y no queremos compartir nuestro dataset. ¿Cómo lo haríamos?
2. Exportando nuestro modelo a un fichero externo
A continuación veremos como exportar nuestro modelo entrenado para usarlo en otros programas. El primer paso es modificar nuestro script train_area_model.py para que elimine la pregunta al usuario y sólo guarde nuestro modelo en un fichero. Usaremos la librería pickle para serializar nuestro modelo y poderlo guardar como un fichero binario. Veamos como debemos modificar nuestro script:
import pandas as pd from sklearn import linear_model import pickle # cargar el dataset en memoria training_dataset = pd.read_csv("area.csv") # crear un modelo que use el algoritmo de regresion lineal # y entrenarlo con los datos de nuestro csv regression_model = linear_model.LinearRegression() # entrenamiento del modelo print ("Training model...") regression_model.fit(training_dataset[['area']], training_dataset.price) # serializar nuestro modelo y salvarlo en el fichero area_model.pickle print ("Model trained. Saving model to area_model.pickle") with open("area_model.pickle", "wb") as file: pickle.dump(regression_model, file) print ("Model saved.")
Como veremos si ejecutamos de nuevo nuestro script, se generará el fichero area_model.pickle.
$ python3 train_area_model.py Training model... Model trained. Saving model to area_model.pickle Model saved. $ ls -l total 24 -rw-r--r-- 1 maf staff 65 4 abr 14:04 area.csv -rw-r--r-- 1 maf staff 514 4 abr 16:10 area_model.pickle -rw-r--r-- 1 maf staff 657 4 abr 14:27 train_area_model.py
El nuevo fichero area_model.pickle es una representación binaria de nuestro modelo entrenado que podemos cargar en cualquier otro script o programa para usarlo como deseemos.
3. Importando nuestro modelo entrenado en otro programa
Si queremos usar nuestro modelo entrenado en otros scripts o programas debemos cargar el fichero generado en el paso anterior. Vamos a ver como hacerlo con un nuevo script llamado predict_pryce.py:
import pickle # Importamos nuestro modelo with open('area_model.pickle', "rb") as file: regression_model = pickle.load(file) # Pedimos al usuario que introduzca un area y calcular # su precio usando el modelo importado input_area = int(input("Enter area: ")) proped_price = regression_model.predict([[input_area]]) print ("Proped price:", round(proped_price[0], 2))
Listo. Atención porque como véis ya no es necesario cargar el dataset de entrenamiento, ni importar la librería sklearn, ni entrenar ningún modelo, haciendo nuestro programa mucho más rápido, ligero y transportable. Ejecutamos nuestro nuevo script y voilà:
$ python3 predict_price.py Enter area: 105 Proped price: 229569.05
La parte buena de esto es que ya no hay que entrenarlo, esta listo para su uso por cualquiera. Podrías compartirlo con tus colegas para que implementaran sus predicciones basadas en tu modelo y dataset, y todo esto sin compartir tus datos de entrenamiento que, en muchos casos, pueden ser privados.
Esta técnica es aplicable a cualquier tipo de algoritmo soportado por sklearn o por otras librerías, incluso fuera del ámbito del Machine Learning, para serializar y guardar objetos python y usarlos posteriormente en otros programas y scripts.