...
En un primer párrafo se van a importar las librerías que se van a necesitar para llevar a cabo el experimento, así como definir el entorno de trabajo como variable global.
4.1.- Cargar la tabla de datos
We import request for doing rest calls and set global path vars
Code Block | ||
---|---|---|
| ||
%python import warnings import requests import io import pandas as pd import numpy as np import mlflow from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score from sklearn.model_selection import train_test_split from sklearn.linear_model import ElasticNet from sklearn.linear_model import lasso_path, enet_path # Set here the URL of the Platform instance environment = "https://lab.onesaitplatform.com" baseurl = environment + "/controlpanel/api/objectstorage" |
...
Seguidamente, en un nuevo párrafo, se definirán los parámetros de entrada que se ejecutarán como proceso en el Notebook.
Set input params if we want to execute this notebook as process
Code Block | ||
---|---|---|
| ||
%python token = z.input("token") filepath = z.input("filepath") alpha_str = z.input("alpha") l1_ratio_str = z.input("l1_ratio") alpha = float(alpha_str) l1_ratio = float(l1_ratio_str) |
...
FilePath: la localización del archivo de datos que se ha cargado en MinIO, y que se comentó que era interesante apuntar. Como recordatorio, sería: «analyticsbucket/datalake/diabetes_raw/select_diabetes.tab_20230927170218.csv»
Alpha y l1_ratio: dos parámetros del experimento, que se mantendrán con el valor de «0.05».
También podemos importar este archivo que contiene el cuaderno completo para este ejemplo (sólo tienes que establecer el parámetro token).
View file | ||
---|---|---|
|
Tienes algunos párrafos explicativos para el conjunto de datos, pero ve a la sección de código.
El primer párrafo que vas a enfocar es el de importación.
...
Carga muchas librerías y establece la url base para el repositorio MinIO. El siguiente párrafo va a ser el párrafo de parámetros con el fin de establecer variables que pueden venir de fuera.
...
Para obtener la ruta del archivo puedes ir a la sección My Files:
...
Luego a MinIO:
...
Y en la siguiente página puedes obtener la ruta del archivo:
...
El token será algún token X-OP-APIKey que pueda acceder al fichero.
A continuación, en tres apartados, carga el propio fichero csv y el filepath del apartado anterior, léelo como csv con la columna del dataset (necesitamos incluir las columnas en la función read_csv) y muestra el contenido cargado:
...
Ahora que tienes tu archivo como pandas dataframe, puedes dividir los datos en conjuntos de entrenamiento y prueba:
...
Divide también estos conjuntos de datos en conjuntos de datos X e Y para los parámetros de entrada y los resultados esperados:
...
Y ejecuta el entrenamiento de ElasticNet con estos datos y obtenga en lr el modelo de salida:
...
Por último, evalúa alguna métrica para el resultado de la predicción.
Paso 3: Registrar los datos de entrenamiento y del modelo en MLFlow
El Notebook Engine está integrado con el servicio de seguimiento de MLFlow, por lo que lo único que tienes que hacer en el cuaderno es importar la librería "MLFlow" necesaria y utilizar las funciones de seguimiento de MLFlow. Eso se hará en la sección de librerías de importación.
...
Los parámetros de conexión y las variables de entorno ya están hechos, así que ahora puedes registrar los parámetros en MLFlow directamente de esta manera:
...
language | py |
---|
...
A continuación se recuperará el archivo de datos de diabetes desde MinIO. Para ello se generará el siguiente párrafo:
Get file from MinIO
Code Block | ||
---|---|---|
| ||
%python
response = requests.get(url = baseurl + "?filePath=" + filepath, params = {}, headers= {"X-OP-APIKey":token})
stream=response.content |
Si existe algún problema con el token de usuario, mostrando el valor de la variable «stream» mostrará el error correspondiente.
...
Si no hay problemas con el token, se continuará creando un nuevo párrafo en el que se definirá la cabecera de la tabla, así como se creará la tabla en el Notebook.
We set the column for the dataset and read the content as csv
Code Block | ||
---|---|---|
| ||
%python
colnames=['age', 'sex','bmi','bp','s1','s2','s3','s4','s5','s6', 'progression']
data = pd.read_csv(io.StringIO(stream.decode('utf-8')), sep="\t", header=0, names=colnames ) |
Info |
---|
La última columna tiene como nombre «Y» en el archivo CSV original. Sin embargo, aquí se renombra como «progression» para referenciarla mejor. |
Referencia técnica: pandas.read_csv
Para comprobar que la tabla se ha generado correctamente, se puede mostrar la tabla con el siguiente párrafo:
Show the file loaded as dataframe
Code Block | ||
---|---|---|
| ||
%python
data |
La salida debería mostrar la tabla:
...
Si la tabla no llegase a cargar correctamente, se mostrará un mensaje que indica «Empty DataFrame»:
...
4.2.- Preparar los datos para el entrenamiento
Una vez que la tabla está cargada y los datos se muestran correctamente, seguidamente se va a preparar los datasets de entrenamiento y pruebas.
Para ello, se preparará un nuevo párrafo en el que se desactivarán los avisos, se generará una nueva semilla aleatoria, y se separará el dataset en dos grupos de datos: uno de entrenamiento, que contendrá el 75% de los datos, y otro de prueba, que contará con el 25% de datos restantes.
Split the data in train a test
Code Block | ||
---|---|---|
| ||
%python
warnings.filterwarnings("ignore")
np.random.seed(40)
# Split the data into training and test sets. (0.75, 0.25) split.
train, test = train_test_split(data) |
Para comprobar los datasets de entrenamiento y prueba, se pueden generar dos nuevos párrafos con el siguiente código:
Show train set
Code Block | ||
---|---|---|
| ||
%python
train |
Que mostrará:
...
Show test set
Code Block | ||
---|---|---|
| ||
%python
test |
Que en este caso mostrará:
...
Con esto se comprueba que los datasets ya están preparados. Sin embargo, hay un campo que no hace falta, y es el de «progression», ya que esta columna predicha es una medida cuantitativa de la progresión de la enfermedad un año después del inicio.
Por tanto, se va a quitar dicha columna de los datasets de entrenamiento y prueba mediante el siguiente párrafo:
Split for target column
Code Block | ||
---|---|---|
| ||
%python
train_x = train.drop(["progression"], axis=1)
test_x = test.drop(["progression"], axis=1)
train_y = train[["progression"]]
test_y = test[["progression"]] |
Para comprobar cómo quedan los datasets, se podrá mostrar los datos se manera similar a cómo se hizo previamente con estos párrafos:
Show train_x
Code Block | ||
---|---|---|
| ||
%python
train_x |
...
Show train_y
Code Block | ||
---|---|---|
| ||
%python
train_y |
...
Show test_x
Code Block | ||
---|---|---|
| ||
%python
test_x |
...
Show test_y
Code Block |
---|
%python
test_y |
...
Una vez que se ha comprobado que los datos son correctos, se procederá a realizar el entrenamiento con ElasticNet:
Run train with input params
Code Block | ||
---|---|---|
| ||
%python
# Run ElasticNet
lr = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42)
lr.fit(train_x, train_y)
predicted_qualities = lr.predict(test_x) |
Este párrafo no devolverá ninguna información, por lo que habrá que crear otro párrafo con la evaluación de las métricas para mostrar los resultados del modelo de entrenamiento:
Metrics Evaluation
Code Block | ||
---|---|---|
| ||
%python
# Evaluate metrics
def eval_metrics(actual, pred):
rmse = np.sqrt(mean_squared_error(actual, pred))
mae = mean_absolute_error(actual, pred)
r2 = r2_score(actual, pred)
return rmse, mae, r2
(rmse, mae, r2) = eval_metrics(test_y, predicted_qualities)
# Print out ElasticNet model metrics
print("Elasticnet model (alpha=%f, l1_ratio=%f):" % (alpha, l1_ratio))
print(" RMSE: %s" % rmse)
print(" MAE: %s" % mae)
print(" R2: %s" % r2) |
Al ejecutarlo, debería de salir los siguientes resultados:
...
Se considera que, para este experimento, estos resultados son correctos, por lo que únicamente faltará registrar el experimento en la interfaz del componente MLFlow.
Paso 5.- Registrar los datos de entrenamiento y del modelo en MLFlow
Para registrar el experimento en el módulo de MLFlow, se creará un nuevo párrafo con el siguiente código:
Code Block | ||
---|---|---|
| ||
%python with mlflow.start_run(): mlflow.set_tag("mlflow.runName", "DiabetesModelGenerator") mlflow.log_param("alpha", alpha) mlflow.log_param("l1_ratio", l1_ratio) mlflow.log_metric("rmse", rmse) mlflow.log_metric("r2", r2) mlflow.log_metric("mae", mae) ##mlflow.sklearn.log_model(lr, "model") mlflow.sklearn.log_model(lr, sk_model=lr, artifact_path="model") mlflow.end_run() |
Si todo va correctamente, el resultado será como el siguiente:
...
También podemos importar este archivo que contiene el cuaderno completo para este ejemplo (sólo tienes que establecer el parámetro token).
View file | ||
---|---|---|
|
Paso 6: Registrar los datos de entrenamiento y del modelo en MLFlow
Este es el código estándar para el seguimiento de un experimento en MLFlow. Incluye todo dentro de “with mlflow.start_run()“ para iniciar un nuevo experimento.
...
Y si vas a la pestaña modelo, puedes verlo y trabajar con él.
Paso
...
7: Crear una función Serverless en Python que evalúe los datos contra el modelo MLFlow
Con el modelo generado anteriormente, vas a crear una función Python que, con una entrada simple o múltiple, pueda obtener una predicción usando el modelo.
...
El último paso es poner las variables de entorno para el modelo con el botón:
...
Paso
...
8: Evaluación del modelo
Ahora puedes probar el modelo con la API REST con Postman por ejemplo enviando un array de JSON con la entrada:
...