{ "cells": [ { "cell_type": "markdown", "id": "594dfbd3", "metadata": {}, "source": [ "# ⭐ Scalling Machine Learning in Three Week course ⭐\n", "\n", "## Intro to MLFlow\n", "\n", "In this excercise, you will use:\n", "* MLflow\n", "* Track runa and experiment\n", "* MLFlow cli\n", "* ElasticNet by sklearn\n", "* Training a simple model to understand MLFlow tracking capabilites.\n", "\n", "\n", "This excercise is part of the [Scaling Machine Learning with Spark book](https://learning.oreilly.com/library/view/scaling-machine-learning/9781098106812/)\n", "available on the O'Reilly platform or on [Amazon](https://amzn.to/3WgHQvd)." ] }, { "cell_type": "code", "execution_count": 1, "id": "b89b3a00", "metadata": {}, "outputs": [], "source": [ "# The data set used in this example is from http://archive.ics.uci.edu/ml/datasets/Wine+Quality\n", "# P. Cortez, A. Cerdeira, F. Almeida, T. Matos and J. Reis.\n", "# Modeling wine preferences by data mining from physicochemical properties. In Decision Support Systems, Elsevier, 47(4):547-553, 2009.\n", "\n", "import os\n", "import warnings\n", "import sys\n", "\n", "import pandas as pd\n", "import numpy as np\n", "from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.linear_model import ElasticNet\n", "from urllib.parse import urlparse\n", "import mlflow\n", "import mlflow.sklearn\n", "\n", "import logging" ] }, { "cell_type": "code", "execution_count": 2, "id": "ab0d501e", "metadata": {}, "outputs": [], "source": [ "logging.basicConfig(level=logging.WARN)\n", "logger = logging.getLogger(__name__)" ] }, { "cell_type": "markdown", "id": "811b51c7", "metadata": {}, "source": [ "## Set eval metrics for \n", "We are using rmse, mae and r2.\n", "\n", "\n", "rmse - Root Mean Squared Error\n", "\n", "mae - Mean Absolute Error\n", "\n", "**RMSE and MAE** - The lower value of MAE, MSE, and RMSE implies higher accuracy of a regression model.\n", "\n", "> In our case of ElasticNet is part of the Linear Regression family where the x (input) and y (output) are assumed to have a linear relationship.\n", "\n", "\n", "\n", "**r2**- A higher value of R square is considered desirable. R Squared & Adjusted R Squared are used for explaining how well the independent variables in the linear regression model explains the variability in the dependent variable.\n", "\n", "### MAE\n", "Mean Absolute Error - In the context of machine learning, absolute error refers to the magnitude of difference between the prediction of an observation and the true value of that observation.\n", "\n", "![text](../figures/mae.jpeg)" ] }, { "cell_type": "markdown", "id": "58cb4edd", "metadata": {}, "source": [ "### RMSE\n", "It measures the average difference between values predicted by a model and the actual values. \n", "\n", "It provides an estimation of how well the model is able to predict the target value (accuracy).\n" ] }, { "cell_type": "markdown", "id": "834128c7", "metadata": {}, "source": [ "### R2 or R Square\n", "\n", "Statistical measure that represents the goodness of fit of a regression model. \n", "\n", "The ideal value for r-square is **1**. \n", "\n", "The closer the value of r-square to 1, the better is the model fitted.\n", "\n", "![text](../figures/rsquare.jpeg)" ] }, { "cell_type": "code", "execution_count": 3, "id": "0b3e8c28", "metadata": {}, "outputs": [], "source": [ "def eval_metrics(actual, pred):\n", " rmse = np.sqrt(mean_squared_error(actual, pred))\n", " mae = mean_absolute_error(actual, pred)\n", " r2 = r2_score(actual, pred)\n", " return rmse, mae, r2" ] }, { "cell_type": "code", "execution_count": 4, "id": "f6c65f3d", "metadata": {}, "outputs": [], "source": [ " # Read the wine-quality csv file from path\n", " csv_path = (\n", " \"../datasets/winequality-red.csv\"\n", " )\n", " try:\n", " data = pd.read_csv(csv_path, sep=\";\")\n", " except Exception as e:\n", " logger.exception(\n", " \"Error: %s\", e)" ] }, { "cell_type": "code", "execution_count": 5, "id": "343dae80", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fixed acidityvolatile aciditycitric acidresidual sugarchloridesfree sulfur dioxidetotal sulfur dioxidedensitypHsulphatesalcoholquality
07.40.7000.001.90.07611.034.00.997803.510.569.45
17.80.8800.002.60.09825.067.00.996803.200.689.85
27.80.7600.042.30.09215.054.00.997003.260.659.85
311.20.2800.561.90.07517.060.00.998003.160.589.86
47.40.7000.001.90.07611.034.00.997803.510.569.45
.......................................
15946.20.6000.082.00.09032.044.00.994903.450.5810.55
15955.90.5500.102.20.06239.051.00.995123.520.7611.26
15966.30.5100.132.30.07629.040.00.995743.420.7511.06
15975.90.6450.122.00.07532.044.00.995473.570.7110.25
15986.00.3100.473.60.06718.042.00.995493.390.6611.06
\n", "

1599 rows × 12 columns

\n", "
" ], "text/plain": [ " fixed acidity volatile acidity citric acid residual sugar chlorides \\\n", "0 7.4 0.700 0.00 1.9 0.076 \n", "1 7.8 0.880 0.00 2.6 0.098 \n", "2 7.8 0.760 0.04 2.3 0.092 \n", "3 11.2 0.280 0.56 1.9 0.075 \n", "4 7.4 0.700 0.00 1.9 0.076 \n", "... ... ... ... ... ... \n", "1594 6.2 0.600 0.08 2.0 0.090 \n", "1595 5.9 0.550 0.10 2.2 0.062 \n", "1596 6.3 0.510 0.13 2.3 0.076 \n", "1597 5.9 0.645 0.12 2.0 0.075 \n", "1598 6.0 0.310 0.47 3.6 0.067 \n", "\n", " free sulfur dioxide total sulfur dioxide density pH sulphates \\\n", "0 11.0 34.0 0.99780 3.51 0.56 \n", "1 25.0 67.0 0.99680 3.20 0.68 \n", "2 15.0 54.0 0.99700 3.26 0.65 \n", "3 17.0 60.0 0.99800 3.16 0.58 \n", "4 11.0 34.0 0.99780 3.51 0.56 \n", "... ... ... ... ... ... \n", "1594 32.0 44.0 0.99490 3.45 0.58 \n", "1595 39.0 51.0 0.99512 3.52 0.76 \n", "1596 29.0 40.0 0.99574 3.42 0.75 \n", "1597 32.0 44.0 0.99547 3.57 0.71 \n", "1598 18.0 42.0 0.99549 3.39 0.66 \n", "\n", " alcohol quality \n", "0 9.4 5 \n", "1 9.8 5 \n", "2 9.8 5 \n", "3 9.8 6 \n", "4 9.4 5 \n", "... ... ... \n", "1594 10.5 5 \n", "1595 11.2 6 \n", "1596 11.0 6 \n", "1597 10.2 5 \n", "1598 11.0 6 \n", "\n", "[1599 rows x 12 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data" ] }, { "cell_type": "markdown", "id": "0af64eb2", "metadata": {}, "source": [ "## Creating Test, Set and parmeters " ] }, { "cell_type": "code", "execution_count": 6, "id": "5792a81a", "metadata": {}, "outputs": [], "source": [ " # Split the data into training and test sets. (0.75, 0.25) split.\n", " train, test = train_test_split(data)\n", "\n", " # The predicted column is \"quality\" which is a scalar from [3, 9]\n", " train_x = train.drop([\"quality\"], axis=1)\n", " test_x = test.drop([\"quality\"], axis=1)\n", " train_y = train[[\"quality\"]]\n", " test_y = test[[\"quality\"]]\n", "\n", " # 1 0r 0.5\n", " alpha = 0.5\n", " # 1 or o.5\n", " l1_ratio = 0.5" ] }, { "cell_type": "markdown", "id": "45c4edf2", "metadata": {}, "source": [ "## MLFlow" ] }, { "cell_type": "markdown", "id": "d87109c3", "metadata": {}, "source": [ "It's time to learn more about MLFlow. \n", "To better gain hands on experience, let's go over the following steps, which are enabled to you by the available code snippets. I do encourage you to experiment and try run different variations of the model by changing the code.\n", "\n", "1. create an experiment\n", "2. try multiple runs within an experiment\n", "3. collect metrics \n", "4. explore experiments directory and runs" ] }, { "cell_type": "code", "execution_count": 7, "id": "0705cb2d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Elasticnet model (alpha=0.500000, l1_ratio=0.500000):\n", " RMSE: 0.7872150893245666\n", " MAE: 0.6382297731300293\n", " R2: 0.11845002046973885\n" ] } ], "source": [ " run_id = 0\n", "\n", " with mlflow.start_run() as run:\n", " run_id = run.info.run_id\n", " lr = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42)\n", " lr.fit(train_x, train_y)\n", "\n", " predicted_qualities = lr.predict(test_x)\n", "\n", " (rmse, mae, r2) = eval_metrics(test_y, predicted_qualities)\n", "\n", " print(\"Elasticnet model (alpha={:f}, l1_ratio={:f}):\".format(alpha, l1_ratio))\n", " print(\" RMSE: %s\" % rmse)\n", " print(\" MAE: %s\" % mae)\n", " print(\" R2: %s\" % r2)\n", "\n", " mlflow.log_param(\"alpha\", alpha)\n", " mlflow.log_param(\"l1_ratio\", l1_ratio)\n", " mlflow.log_metric(\"rmse\", rmse)\n", " mlflow.log_metric(\"r2\", r2)\n", " mlflow.log_metric(\"mae\", mae)\n", "\n", " tracking_url_type_store = urlparse(mlflow.get_tracking_uri()).scheme\n", "\n", " # Model registry does not work with file store\n", " if tracking_url_type_store != \"file\":\n", "\n", " # Register the model\n", " # There are other ways to use the Model Registry, which depends on the use case,\n", " # please refer to the doc for more information:\n", " # https://mlflow.org/docs/latest/model-registry.html#api-workflow\n", " mlflow.sklearn.log_model(lr, \"model\", registered_model_name=\"ElasticnetWineModel\")\n", " else:\n", " mlflow.sklearn.log_model(lr, \"model\")" ] }, { "attachments": { "image.png": { "image/png": "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" } }, "cell_type": "markdown", "id": "d77901c4", "metadata": {}, "source": [ "## 🚀🚀🚀 Great! \n", "\n", "Now, let's go back to **mlrun** folder in your jupyter envirnment, and go over the project there to better understand the stracture of MLflow experiment! \n", "\n", "You will see experiment 0 and all the runs within it: \n", "![image.png](attachment:image.png)" ] }, { "cell_type": "markdown", "id": "98578c49", "metadata": {}, "source": [ "#### Question - which experiment did we run?\n", "Looking at our mlruns directory, there is a folder named 0.\n", "0 is the experiemnt id.\n", "Let's have a look at our experiment details." ] }, { "cell_type": "code", "execution_count": 8, "id": "4eed53b4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Name: Default\n", "Artifact Location: file:///home/jovyan/notebooks/mlruns/0\n", "Lifecycle_stage: active\n" ] } ], "source": [ "experiment_id = \"0\"\n", "experiment = mlflow.get_experiment(experiment_id)\n", "print(\"Name: {}\".format(experiment.name))\n", "print(\"Artifact Location: {}\".format(experiment.artifact_location))\n", "print(\"Lifecycle_stage: {}\".format(experiment.lifecycle_stage))" ] }, { "cell_type": "markdown", "id": "a7c3a2d1", "metadata": {}, "source": [ "You can also run the next command from the terminal:\n", " \n", "> ```mlflow experiments list```" ] }, { "cell_type": "markdown", "id": "186f8c0c", "metadata": {}, "source": [ "#### How about run details?\n", "We can investigate that throught code as well! \n" ] }, { "cell_type": "code", "execution_count": 9, "id": "f0e49c36", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from mlflow.tracking import MlflowClient\n", "\n", "client = MlflowClient()\n", "data = client.get_run(run_id).data\n", "data" ] }, { "cell_type": "code", "execution_count": 10, "id": "d1ade77c", "metadata": {}, "outputs": [], "source": [ "mlflow.end_run()" ] }, { "cell_type": "markdown", "id": "7f0e1512", "metadata": {}, "source": [ "## Well Done! 👏👏👏\n", "## You just finished: Intro to MLflow\n", "## Next: Intro to PySpark" ] }, { "cell_type": "code", "execution_count": null, "id": "41a91d38", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.4" } }, "nbformat": 4, "nbformat_minor": 5 }