# # train_diabetes.py # # MLflow model using ElasticNet (sklearn) and Plots ElasticNet Descent Paths # # Uses the sklearn Diabetes dataset to predict diabetes progression using ElasticNet # The predicted "progression" column is a quantitative measure of disease progression one year after baseline # http://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_diabetes.html # Combines the above with the Lasso Coordinate Descent Path Plot # http://scikit-learn.org/stable/auto_examples/linear_model/plot_lasso_coordinate_descent_path.html # Original author: Alexandre Gramfort ; License: BSD 3 clause # # Usage: # python train_diabetes.py 0.01 0.01 # python train_diabetes.py 0.01 0.75 # python train_diabetes.py 0.01 1.0 # import sys import warnings from itertools import cycle import matplotlib.pyplot as plt import numpy as np import pandas as pd from sklearn import datasets from sklearn.linear_model import ElasticNet, enet_path from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score from sklearn.model_selection import train_test_split # Load Diabetes datasets diabetes = datasets.load_diabetes() X = diabetes.data y = diabetes.target # Create pandas DataFrame for sklearn ElasticNet linear_model Y = np.array([y]).transpose() d = np.concatenate((X, Y), axis=1) cols = diabetes.feature_names + ["progression"] data = pd.DataFrame(d, columns=cols) # Import mlflow import mlflow import mlflow.sklearn from mlflow.models import infer_signature # 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 if __name__ == "__main__": 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) # The predicted column is "progression" which is a quantitative measure of disease progression one year after baseline train_x = train.drop(["progression"], axis=1) test_x = test.drop(["progression"], axis=1) train_y = train[["progression"]] test_y = test[["progression"]] alpha = float(sys.argv[1]) if len(sys.argv) > 1 else 0.05 l1_ratio = float(sys.argv[2]) if len(sys.argv) > 2 else 0.05 # 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) (rmse, mae, r2) = eval_metrics(test_y, predicted_qualities) # Print out ElasticNet model metrics print(f"Elasticnet model (alpha={alpha:f}, l1_ratio={l1_ratio:f}):") print(f" RMSE: {rmse}") print(f" MAE: {mae}") print(f" R2: {r2}") # Infer model signature predictions = lr.predict(train_x) signature = infer_signature(train_x, predictions) # Log mlflow attributes for mlflow UI 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, name="model", signature=signature) # Compute paths eps = 5e-3 # the smaller it is the longer is the path print("Computing regularization path using the elastic net.") alphas_enet, coefs_enet, _ = enet_path(X, y, eps=eps, l1_ratio=l1_ratio) # Display results fig = plt.figure(1) ax = plt.gca() colors = cycle(["b", "r", "g", "c", "k"]) neg_log_alphas_enet = -np.log10(alphas_enet) for coef_e, c in zip(coefs_enet, colors): l2 = plt.plot(neg_log_alphas_enet, coef_e, linestyle="--", c=c) plt.xlabel("-Log(alpha)") plt.ylabel("coefficients") title = "ElasticNet Path by alpha for l1_ratio = " + str(l1_ratio) plt.title(title) plt.axis("tight") # Save figures fig.savefig("ElasticNet-paths.png") # Close plot plt.close(fig) # Log artifacts (output files) mlflow.log_artifact("ElasticNet-paths.png")