<jupyter_start><jupyter_text>Entrenador de modelosEste script contiene el código para entrenar un modelo de regresión lineal a partir de datos de ventas históricos. El modelo como tal es muy sencillo y probablemente no muy bueno, pero el objetivo del ejercicio es mostrar la arquitectura del sistema completo.Una vez se ejecuta el comando `.fit` el modelo está listo para predecir. En ese momento el modelo es un objeto de Python en memoria. ¿Qué ocurre si el proceso que lo ha entrenado se cae por un cuelgue, un fallo en el datacenter, etc.? ¿Cómo podemos usar el modelo en varios proceso para poder paralelizar las predicciones? Es habitual guardar el modelo en disco con `pickle` (aunque la librería de scikit-learn ofrece [alternativas](https://scikit-learn.org/stable/modules/model_persistence.html)). Este proceso se denomina serialización y es común a cualquier lenguaje de programación.Aparte de la simplicidad del modelo, es relevante observar que no hay una sola referencia a Kafka o a sus topics: la entrada es el fichero `historic.csv` y la salida es un fichero `.pickle`. Este código puede ejecutarse al margen del estado de los topics.<jupyter_code>import pandas as pd
import numpy as np
from ejercicios.houses import SEED, MODEL_STORE, HISTORIC
np.random.seed(SEED)
ds = pd.read_csv(HISTORIC)
ds.head()
features = list(ds.columns)
target = 'price'
features.remove('price')
features.remove('id')
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

x_train, x_test, y_train, y_test = train_test_split(ds[features], ds[target], random_state=SEED, test_size=0.3)

# Creación de un modelo
model = LinearRegression()
model.fit(x_train, y_train)

predict_train = model.predict(x_train)
predict_test = model.predict(x_test)<jupyter_output><empty_output><jupyter_text>La celda anterior pretende ser una version muy simplificada de un pipeline de machine learning. Podríamos añadir etapas como diferentes algoritmos, generación de variables, optimización de parámetros, etc., complicando el modelo tanto como necesitemos. El objetivo, en cualquier caso, es conseguir un objeto `model` que nos sirva para ejecutar un `model.predict`. Eso sí, aquí no vamos a predecir, sólo vamos a guardar el modelo.<jupyter_code># Evaluación de R2
# Lo imprimimos simplemente para comprobar que sucesivos entrenamiento tendrán diferente rendimiento
print('R^2 en entrenamiento es: ', model.score(x_train, y_train))
print('R^2 en validación es: ', model.score(x_test, y_test))
import pickle
f = open(MODEL_STORE, 'wb')
pickle.dump(model, f)
f.flush()
f.close()
!ls -l *.pickle<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07180650037792895, 'fraction_numerical': 0.001889644746787604, 'mean_word_length': 5.787179487179487, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '18656', 'license': 'Apache-2.0', 'n_tokens_mistral': 878, 'n_tokens_neox': 871, 'n_words': 327, 'path': 'python/ejercicios/houses/model_trainer.ipynb', 'repo_name': 'fhuertas/uah-mbi-2019-streaming', 'size': '2646'}