diff --git a/1-prep_and_gather_data.ipynb b/1-prep_and_gather_data.ipynb new file mode 100644 index 0000000..8a017a6 --- /dev/null +++ b/1-prep_and_gather_data.ipynb @@ -0,0 +1,822 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "73878580-3986-4fc3-81b6-f598e0783b4f", + "metadata": {}, + "source": [ + "# Demo project - Wine quality prediction" + ] + }, + { + "cell_type": "markdown", + "id": "53536e98-387e-4457-9d03-5a1d435837a6", + "metadata": {}, + "source": [ + "## Contents:\n", + "* [Import packages](#first-bullet)\n", + "* [Load Data](#second-bullet)\n", + "* [Exploratory data analysis](#third-bullet)\n", + "* [Prepare dataset for training model](#forth-bullet)\n", + "* [Build a baseline model](#fifth-bullet)\n", + "* [Experiment with a new model](#sixth-bullet)\n", + "* [Predict](#seventh-bullet)" + ] + }, + { + "cell_type": "markdown", + "id": "ff902f5d-7bc1-49c9-8994-d4c3e1cff7e8", + "metadata": {}, + "source": [ + "## Import packages " + ] + }, + { + "cell_type": "markdown", + "id": "d73dd05b-5b58-4587-a1df-02a9c96d1996", + "metadata": {}, + "source": [ + "We will need to install and import packages as we develop our notebook. We've created a couple of starter cells for you but you will need to add more as you work through the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e3744f2b-4d07-4f10-84f0-1daa05cb8573", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "!pip install s3fs\n", + "# Install more modules that you need here\n", + "!pip install seaborn" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa3a0921-36d0-4b26-8378-cd5adab57fb8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas\n", + "# Import more modules and classes that you need here - REMEMBER TO RERUN THE CELL AFTER MODIFYING!\n", + "import os\n", + "import seaborn" + ] + }, + { + "cell_type": "markdown", + "id": "c5ac7837-ae31-4b73-9fd0-e8d8dddbafb6", + "metadata": { + "tags": [] + }, + "source": [ + "## Load Data " + ] + }, + { + "cell_type": "markdown", + "id": "7e0d066b-1b2f-47ac-a9a3-f01d62f22969", + "metadata": {}, + "source": [ + "You have access to a Minio-based S3 storage where your datasets are available, and where you will eventually push models. This storage is defined using a 'Data Connection' in your Data Science Project. You can access this data connection using environment variables. Run the following shell block to determine the environment variable names:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "780f041d-f811-4927-b039-13eed4dd151e", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "!env | grep AWS" + ] + }, + { + "cell_type": "markdown", + "id": "edbe5e0f-9470-4228-88be-43fb588ede9d", + "metadata": {}, + "source": [ + "You will need to assign these to Python variables to be able to use them in code blocks. We've started you off with some code below, but you'll also need variables set for the endpoint and bucket. Remember to import modules as needed in the import block at the top of the Notebook and re-run the cell below again after importing any modules." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2aa0f94-5b37-4873-9467-44e6703af9c8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']\n", + "AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']\n", + "# Add variable assignments for AWS_S3_ENDPOINT and AWS_S3_Bucket below.\n", + "AWS_S3_ENDPOINT = os.environ['AWS_S3_ENDPOINT']\n", + "AWS_S3_BUCKET = os.environ['AWS_S3_BUCKET']\n" + ] + }, + { + "cell_type": "markdown", + "id": "d0fdc153-bb03-4e42-8df2-01de01b4f47d", + "metadata": {}, + "source": [ + "Check that your variables have been correctly set:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2dfbd5d1-2f81-4432-be43-fc6101d97ea3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "print(\"AWS_ACCESS_KEY is \" + AWS_ACCESS_KEY_ID)\n", + "print(\"AWS_SECRET_ACCESS_KEY is \" + AWS_SECRET_ACCESS_KEY)\n", + "print(\"AWS_S3_ENDPOINT is \" + AWS_S3_ENDPOINT)\n", + "print(\"AWS_S3_BUCKET is \" + AWS_S3_BUCKET)\n" + ] + }, + { + "cell_type": "markdown", + "id": "6e94b018-a5c8-4814-8619-0eece4e5d246", + "metadata": {}, + "source": [ + "## Exploratory data analysis \n", + "Have a look in the Minio UI and you will see that you have two datafiles in your bucket, called winequality-red.csv and winequality-white.csv. Let's set up some code to pull these from the storage into memory so that we can start some statistical exploration and visualisation. We will use the Pandas module to do this." + ] + }, + { + "cell_type": "markdown", + "id": "0da01133-3435-48e2-b67e-184d25a3270f", + "metadata": {}, + "source": [ + "First we define a function, read_data() which uses a pandas method to read CSVs directly from S3 storage. Note how we pass our S3 credentials to the method. Because this is a function definition it won't actually do anything when you execute the code cell. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3131849f-2412-4468-93b2-b21e73f91aa7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def read_data(datasrc):\n", + " data = pandas.read_csv(\n", + " \"s3://\" + AWS_S3_BUCKET + \"/\" + datasrc, sep=';',\n", + " storage_options={\n", + " \"key\": AWS_ACCESS_KEY_ID,\n", + " \"secret\": AWS_SECRET_ACCESS_KEY,\n", + " \"endpoint_url\": AWS_S3_ENDPOINT,\n", + " }\n", + " )\n", + " return data" + ] + }, + { + "cell_type": "markdown", + "id": "d96f7e23-18f1-4749-987c-1b0a1ee1f84e", + "metadata": {}, + "source": [ + "Let's try reading our two CSV files into memory now." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0ab7588-f839-4325-a4cb-22486498884d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "white_wine = read_data('winequality-white.csv')\n", + "red_wine = read_data('winequality-red.csv')" + ] + }, + { + "cell_type": "markdown", + "id": "46ce3744-1bcd-4571-9613-d1b9a0ba024a", + "metadata": {}, + "source": [ + "Let's have a look at our white wine data:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "00ee462f-ff94-44ba-b68a-53d2211e8939", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "white_wine.head(5)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7dac8273-016a-4771-9026-0b8b77f44bf7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# add a command in this cell to inspect our red wine data\n", + "red_wine.head(5)" + ] + }, + { + "cell_type": "markdown", + "id": "9197769d-d945-491a-abdc-3939a8b3a3a5", + "metadata": {}, + "source": [ + "We would like to run analysis on both our red and white wine datasets simultaneously, so it makes sense to merge these two datasets into one. But how will we then tell the difference between our red and white wines? Well, we simply add another feature - the feature is calles 'is_red' and is essentially a Boolean indicating whether the wine is red, or 'not red' i.e. white.\n", + "\n", + "(Extra credit for anyone who can point out what might be problematic about this approach!)" + ] + }, + { + "cell_type": "markdown", + "id": "bbeed573-c132-4e8b-b1bb-e261812faa71", + "metadata": {}, + "source": [ + "Let's define a function to definte our additional feature in each dataset, and then concatenate them." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6af49215-b766-4ca4-a140-6e21f8d7ecb7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def transformdata(red_wine,white_wine):\n", + " red_wine['is_red'] = 1\n", + " white_wine['is_red'] = 0\n", + " data = pandas.concat([red_wine, white_wine], axis=0)\n", + " # lets get rid of those annoying spaces in our column names\n", + " data.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)\n", + " return data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27a5d750-0307-43ca-abf5-1562fc8191f2", + "metadata": {}, + "outputs": [], + "source": [ + "Now, invoke your method and show the first 5 lines of the merged data below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa3e4777-76c2-4687-a8da-6e10c18fe536", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Write your code here\n", + "# data = insert your method call here\n", + "data = transformdata(red_wine,white_wine)\n", + "data.head(5)" + ] + }, + { + "cell_type": "markdown", + "id": "bd056fae-7cf1-4e54-99d9-0f19c014534b", + "metadata": {}, + "source": [ + "SLIDES TO DISCUSS EXPLORATORY STATS COVERING:\n", + "- visualisation basics\n", + "- mean, median, deviation, skew\n", + "- quartiles and outliers\n", + "- correlation\n", + "\n", + "\n", + "Let's visualise our data using the seaborn module. Remember you may to install and/or import the module in the block at the beginning of the notebook (and re-run). Seaborn is a Python data visualization library based on matplotlib. It provides a high-level interface for drawing attractive and informative statistical graphics.You can read more about it here: https://seaborn.pydata.org/" + ] + }, + { + "cell_type": "markdown", + "id": "4effa559-432c-4130-b41d-2e3f11ec0465", + "metadata": {}, + "source": [ + "This will plot a histogram of the quality of our wine. Experiement with plotting different features of the dataset, e.g. alcohol content, pH etc." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b4e1d074-f5fb-41b1-afc7-1150550db01f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "seaborn.displot(data.quality, kde=False)" + ] + }, + { + "cell_type": "markdown", + "id": "494dfe1e-15a4-4a41-adda-f4700bac5835", + "metadata": {}, + "source": [ + "Let's simplify things by converting quality from a 1-10 scale to a simple boolean. A wine is either of high quality, or it is not. This quality feature will be our output feature when we run an inference model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c06e500-1871-4c71-816a-b898cb8633d1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def settarget(data):\n", + " high_quality = (data.quality >= 7).astype(int)\n", + " data.quality = high_quality\n", + " return data\n", + "\n", + "data = settarget(data)\n", + "data.tail(5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "661daf61-7b01-4dcd-9f26-30a0dfa3c51a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import seaborn as sns\n", + "sns.displot(data.quality, kde=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e4fec16b-9490-46a1-9f98-fe917796f219", + "metadata": {}, + "outputs": [], + "source": [ + "## median, upper and lower quartile, IQR\n", + "## histogram for distribution" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f886882-1fd1-4633-af8b-602dc90d369a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dims = (3, 4)\n", + "\n", + "f, axes = plt.subplots(dims[0], dims[1], figsize=(25, 15))\n", + "axis_i, axis_j = 0, 0\n", + "for col in data.columns:\n", + " if col == 'is_red' or col == 'quality':\n", + " continue # Box plots cannot be used on indicator variables\n", + " sns.boxplot(x=data['quality'], y=data[col], ax=axes[axis_i, axis_j])\n", + " axis_j += 1\n", + " if axis_j == dims[1]:\n", + " axis_i += 1\n", + " axis_j = 0" + ] + }, + { + "cell_type": "markdown", + "id": "206b8310-cd76-4012-ba6f-f2f621cd3fde", + "metadata": {}, + "source": [ + "Check missing value" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dee4b83a-a069-4ed8-a9c5-935e45539cd3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "## scenarios for missing data - decision for the missing data\n", + "## if alcohol is not an indicator, delete that record\n", + "\n", + "## what are we going to do with the outliers? are they real outliers?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31857042-ba20-42b5-9739-6a017f6b1951", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "data.isna().any()" + ] + }, + { + "cell_type": "markdown", + "id": "6b89fa04-ee75-4782-ac57-b2f5f2f45239", + "metadata": {}, + "source": [ + "## Prepare dataset for training model \n", + "Split the input data into 3 sets:\n", + "\n", + "- Train (60% of the dataset used to train the model)\n", + "- Validation (20% of the dataset used to tune the hyperparameters)\n", + "- Test (20% of the dataset used to report the true performance of the model on an unseen dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "757d77d2-d54e-4a2b-8b8d-1eba01ba61ce", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def get_trainingdata(data):\n", + " X = data.drop([\"quality\"], axis=1)\n", + " y = data.quality\n", + "\n", + " # Split out the training data\n", + " X_train, X_rem, y_train, y_rem = train_test_split(X, y, train_size=0.6, random_state=123)\n", + "\n", + " # Split the remaining data equally into validation and test\n", + " X_val, X_test, y_val, y_test = train_test_split(X_rem, y_rem, test_size=0.5, random_state=123)\n", + " return (X_train,X_val,X_test,y_train,y_val,y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61d6a7b2-974c-4c6c-a31f-3df48760c805", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "(X_train,X_val,X_test,y_train,y_val,y_test) = get_trainingdata(data)" + ] + }, + { + "cell_type": "markdown", + "id": "cfe73322-99ac-4e6b-8ed6-c475d418e108", + "metadata": { + "tags": [] + }, + "source": [ + "## Build a baseline model (random forest classifier) \n", + "Build a simple classifier using scikit-learn. Use MLflow to keep track of the model accuracy. You can read about Classification - ROC and AUC here if you want \n", + "https://developers.google.com/machine-learning/crash-course/classification/roc-and-auc" + ] + }, + { + "cell_type": "markdown", + "id": "4ea89452-6ec8-43cc-923c-de443450ff35", + "metadata": {}, + "source": [ + "Enable MLflow autologging" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b53a514-9eab-491d-9237-80448e4cea20", + "metadata": {}, + "outputs": [], + "source": [ + "experiment_name = \"WineQuality\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6628b383-14a4-493e-9add-e6076adf6ad5", + "metadata": {}, + "outputs": [], + "source": [ + "# check if experiment name already exists\n", + "mlflow.set_tracking_uri(\"http://mlflow:5500\")\n", + "mlflow.set_experiment(experiment_name)\n", + "\n", + "# enable autologging\n", + "mlflow.sklearn.autolog(log_input_examples=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f9e8cf7-0458-49d1-9dfa-a3061bbc00d4", + "metadata": {}, + "outputs": [], + "source": [ + "def log_featureimportance(model):\n", + " tmpdir = tempfile.mkdtemp()\n", + " filepath = os.path.join(tmpdir, 'feature_importance.json')\n", + " feature_importances = pd.DataFrame(model.feature_importances_, index=X_train.columns.tolist(), columns=['importance'])\n", + " feature_importances.sort_values('importance', ascending=False).to_json(filepath)\n", + " mlflow.log_artifact(filepath)\n", + " return" + ] + }, + { + "cell_type": "markdown", + "id": "01bdefde-fc6a-4e7d-8c68-649528667fd4", + "metadata": {}, + "source": [ + "Train random forest" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9f2832df-baa7-4125-8ef3-681517dbe8b0", + "metadata": {}, + "outputs": [], + "source": [ + "class SklearnModelWrapper(mlflow.pyfunc.PythonModel):\n", + " def __init__(self, model):\n", + " self.model = model\n", + "\n", + " def predict(self, context, model_input):\n", + " return self.model.predict_proba(model_input)[:,1]\n", + "\n", + "def train_randomforest(X_train,y_train,X_test,y_test):\n", + "\n", + " with mlflow.start_run(run_name='untuned_random_forest'):\n", + " n_estimators = 10\n", + " model = RandomForestClassifier(n_estimators=n_estimators, random_state=np.random.RandomState(123))\n", + " model.fit(X_train, y_train)\n", + "\n", + " predictions_test = model.predict_proba(X_test)[:,1]\n", + " auc_score = roc_auc_score(y_test, predictions_test)\n", + " mlflow.log_param('n_estimators', n_estimators) #specify the interested parameter/metric\n", + " mlflow.log_metric('auc', auc_score)\n", + " wrappedModel = SklearnModelWrapper(model)\n", + "\n", + " signature = infer_signature(X_train, wrappedModel.predict(None, X_train))\n", + "\n", + " conda_env = _mlflow_conda_env(\n", + " additional_conda_deps=None,\n", + " additional_pip_deps=[\"cloudpickle=={}\".format(cloudpickle.__version__), \"scikit-learn=={}\".format(sklearn.__version__)],\n", + " additional_conda_channels=None,\n", + " )\n", + " mlflow.pyfunc.log_model(\"random_forest_model\", python_model=wrappedModel, conda_env=conda_env, signature=signature)\n", + " log_featureimportance(model)\n", + " return model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d8957943-d0dc-4803-aab5-6c6ceb8ba34d", + "metadata": {}, + "outputs": [], + "source": [ + "model = train_randomforest(X_train,y_train,X_test,y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c8cdc21-a1df-429b-8be3-3e4d1ea5ff2d", + "metadata": {}, + "outputs": [], + "source": [ + "# Sanity-check: This should match the AUC logged by MLflow\n", + "print(f'AUC: {roc_auc_score(y_test, model.predict_proba(X_test)[:,1])}')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6eba2f19-7755-412e-bc67-2e586817582c", + "metadata": {}, + "outputs": [], + "source": [ + "# Sanity-check: This should match the feature importance logged by MLflow\n", + "feature_importances = pd.DataFrame(model.feature_importances_, index=X_train.columns.tolist(), columns=['importance'])\n", + "feature_importances.sort_values('importance', ascending=False)" + ] + }, + { + "cell_type": "markdown", + "id": "b4206c08-5021-43dd-a11d-e7e7f687ebef", + "metadata": {}, + "source": [ + "## Experiment with a new model (xgboost) \n", + "Use the xgboost library to train a more accurate model. Run hyperparameter tuning to train multiple models. As before, the code tracks the performance of each parameter configuration with MLflow." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "84cf68d6-86a4-4daa-927b-b4dc53f8cc9d", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "search_space = {\n", + " 'max_depth': scope.int(hp.quniform('max_depth', 50, 100, 10)),\n", + " 'learning_rate': hp.loguniform('learning_rate', -3, 0),\n", + " 'reg_alpha': hp.loguniform('reg_alpha', -5, -1),\n", + " 'reg_lambda': hp.loguniform('reg_lambda', -6, -1),\n", + " 'min_child_weight': hp.loguniform('min_child_weight', -1, 3),\n", + " 'objective': 'binary:logistic',\n", + " 'seed': 123, # Set a seed for deterministic training\n", + "}\n", + "\n", + "def train_model(params):\n", + "\n", + " mlflow.xgboost.autolog()\n", + " with mlflow.start_run(nested=True):\n", + " train = xgb.DMatrix(data=X_train, label=y_train)\n", + " validation = xgb.DMatrix(data=X_val, label=y_val)\n", + "\n", + " booster = xgb.train(params=params, dtrain=train, num_boost_round=100,\\\n", + " evals=[(validation, \"validation\")], early_stopping_rounds=50)\n", + " validation_predictions = booster.predict(validation)\n", + " auc_score = roc_auc_score(y_val, validation_predictions)\n", + " mlflow.log_metric('auc', auc_score) #specify the interested parameter/metric\n", + "\n", + " signature = infer_signature(X_train, booster.predict(train))\n", + " mlflow.xgboost.log_model(booster, \"model\", signature=signature)\n", + "\n", + " return {'status': STATUS_OK, 'loss': -1*auc_score, 'booster': booster.attributes()}\n", + "\n", + "with mlflow.start_run(run_name='xgboost_models'):\n", + " best_params = fmin(\n", + " fn=train_model,\n", + " space=search_space,\n", + " algo=tpe.suggest,\n", + " max_evals=10,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12fb65af-5545-4563-a70a-ad62d11e6615", + "metadata": {}, + "outputs": [], + "source": [ + "best_run = mlflow.search_runs(order_by=['metrics.auc DESC']).iloc[0]\n", + "best_run_id = best_run[\"run_id\"]\n", + "print(f'AUC of Best Run: {best_run[\"metrics.auc\"]}')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2df971e0-1748-489c-b36d-dd481c211a0d", + "metadata": {}, + "outputs": [], + "source": [ + "best_run_id" + ] + }, + { + "cell_type": "markdown", + "id": "1f57f0bc-ec52-463c-9241-0bf897465b1b", + "metadata": { + "tags": [] + }, + "source": [ + "## Predict " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db412034-daab-4942-b3ae-0c5410a3e5a5", + "metadata": {}, + "outputs": [], + "source": [ + "# model = mlflow.pyfunc.load_model(f\"models:/TestModelD/production\")\n", + "model = mlflow.pyfunc.load_model(\"runs:/\" + best_run_id + \"/model\")\n", + "\n", + "test_predictions = model.predict(X_test)\n", + "print(f'AUC: {roc_auc_score(y_test, test_predictions)}')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b5593581-c563-4c1a-aa80-f10d77f53209", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.metrics import classification_report\n", + "\n", + "class_labels = ['white wine', 'red wine']\n", + "test_predictions = np.where(test_predictions>0.5, 1, 0)\n", + "print(classification_report(y_test, test_predictions, target_names=class_labels))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0ebe7ec-a7e2-49bc-88bb-2b5ea79f3807", + "metadata": {}, + "outputs": [], + "source": [ + "cm = confusion_matrix(y_test, test_predictions)\n", + "disp = ConfusionMatrixDisplay(confusion_matrix=cm)\n", + "\n", + "disp.plot()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d9f40cc8-9a79-4521-9783-6a3aa0b0127a", + "metadata": {}, + "outputs": [], + "source": [ + "# register the best model\n", + "new_model_version = mlflow.register_model(f\"runs:/{best_run_id}/model\", \"WineQuality\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d6d78d2a-563d-41de-a2a9-1dbddbdcb3cc", + "metadata": {}, + "outputs": [], + "source": [ + "# # Promote the new model version to Production\n", + "# client.transition_model_version_stage(\n", + "# name=\"TestModelD\",\n", + "# version=new_model_version.version,\n", + "# stage=\"Production\"\n", + "# )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d112aed5-fe65-47b3-aff3-899a96010bdf", + "metadata": {}, + "outputs": [], + "source": [ + "# # clean up models\n", + "# from mlflow.tracking import MlflowClient\n", + "# client = MlflowClient()\n", + "# client.delete_registered_model(name=\"winequality\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9", + "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.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/1-prep_and_gather_data_instructor.ipynb b/1-prep_and_gather_data_instructor.ipynb new file mode 100644 index 0000000..f72a9e5 --- /dev/null +++ b/1-prep_and_gather_data_instructor.ipynb @@ -0,0 +1,771 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "73878580-3986-4fc3-81b6-f598e0783b4f", + "metadata": {}, + "source": [ + "# Demo project - Wine quality prediction" + ] + }, + { + "cell_type": "markdown", + "id": "53536e98-387e-4457-9d03-5a1d435837a6", + "metadata": {}, + "source": [ + "## Contents:\n", + "* [Import packages](#first-bullet)\n", + "* [Load Data](#second-bullet)\n", + "* [Exploratory data analysis](#third-bullet)\n", + "* [Prepare dataset for training model](#forth-bullet)\n", + "* [Build a baseline model](#fifth-bullet)\n", + "* [Experiment with a new model](#sixth-bullet)\n", + "* [Predict](#seventh-bullet)" + ] + }, + { + "cell_type": "markdown", + "id": "ff902f5d-7bc1-49c9-8994-d4c3e1cff7e8", + "metadata": {}, + "source": [ + "## Import packages " + ] + }, + { + "cell_type": "markdown", + "id": "d73dd05b-5b58-4587-a1df-02a9c96d1996", + "metadata": {}, + "source": [ + "In addition to the s3fs package, we will need to import hyperopt, cloudpickle, mlflow, and xgboost
\n", + "Modify the following cell to make this happen
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e3744f2b-4d07-4f10-84f0-1daa05cb8573", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "!pip install s3fs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa3a0921-36d0-4b26-8378-cd5adab57fb8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import boto3\n", + "import pandas\n" + ] + }, + { + "cell_type": "markdown", + "id": "c5ac7837-ae31-4b73-9fd0-e8d8dddbafb6", + "metadata": { + "tags": [] + }, + "source": [ + "## Load Data " + ] + }, + { + "cell_type": "markdown", + "id": "f0fb050a-b46a-4de4-8fdd-0fe8e3b61d3e", + "metadata": {}, + "source": [ + "Assumption: the bucket is already created and \"winequality-red.csv\" & \"winequality-white.csv\" are uploaded into the bucket
\n", + "Read data from object store
\n", + "Connect to object store and instantiate a client object using boto3 session:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2aa0f94-5b37-4873-9467-44e6703af9c8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']\n", + "AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']\n", + "AWS_S3_ENDPOINT = os.environ['AWS_S3_ENDPOINT']\n", + "AWS_S3_BUCKET = os.environ['AWS_S3_BUCKET']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47ae3876-523d-47f1-b895-e26bfb65977f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "s3conn = boto3.Session(aws_access_key_id=S3ACCESS_KEY,\n", + " aws_secret_access_key=S3SECRET_KEY)\n", + "s3_client = s3conn.client('s3',endpoint_url = S3ENDPOINT, verify=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4d5bb280-9473-46a0-b575-dfa64f9872cf", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "s3_client.list_objects(Bucket='data')" + ] + }, + { + "cell_type": "markdown", + "id": "7cd65395-3135-45a0-8d7a-227ff2a05840", + "metadata": {}, + "source": [ + "Using the s3_client, retrieve data from objective store:
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9207c9a6-bcc4-42fc-abf1-ff84c431dbbd", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "objectname = \"winequality-red.csv\"\n", + "file_addr = \"data/winequality-red.csv\"\n", + "response = s3_client.download_file(bucket_name, objectname, file_addr)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e472d265-819b-4881-9fd4-b2fda3933179", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "objectname = \"winequality-white.csv\"\n", + "file_addr = \"data/winequality-white.csv\"\n", + "response = s3_client.download_file(bucket_name, objectname, file_addr)" + ] + }, + { + "cell_type": "markdown", + "id": "6e94b018-a5c8-4814-8619-0eece4e5d246", + "metadata": {}, + "source": [ + "## Exploratory data analysis " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3131849f-2412-4468-93b2-b21e73f91aa7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import s3fs\n", + "def read_data(datasrc):\n", + " data = pd.read_csv(\n", + " \"s3://\" + AWS_S3_BUCKET + \"/\" + datasrc, sep=';',\n", + " storage_options={\n", + " \"key\": AWS_ACCESS_KEY_ID,\n", + " \"secret\": AWS_SECRET_ACCESS_KEY,\n", + " \"endpoint_url\": AWS_S3_ENDPOINT,\n", + " }\n", + " )\n", + " return data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0ab7588-f839-4325-a4cb-22486498884d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "## after concatanation, setting the value of is_red for which is a red wine, which is a white wine - feature" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6af49215-b766-4ca4-a140-6e21f8d7ecb7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def transformdata(red_wine,white_wine):\n", + " red_wine['is_red'] = 1\n", + " white_wine['is_red'] = 0\n", + " data = pd.concat([red_wine, white_wine], axis=0)\n", + " data.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)\n", + " return data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa3e4777-76c2-4687-a8da-6e10c18fe536", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "white_wine = read_data('winequality-white.csv')\n", + "red_wine = read_data('winequality-red.csv')\n", + "data = transformdata(red_wine, white_wine)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a8620947-ab99-43cb-9a56-128f9ff03fc5", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "data.head(5)" + ] + }, + { + "cell_type": "markdown", + "id": "bd056fae-7cf1-4e54-99d9-0f19c014534b", + "metadata": {}, + "source": [ + "Visualize data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cad8a920-4a11-4a5f-b60e-6eaf9d882bb2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "!pip install seaborn" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b4e1d074-f5fb-41b1-afc7-1150550db01f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import seaborn as sns\n", + "sns.displot(data.quality, kde=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee8a4a2e-3f5d-4699-a278-21b2c7c8a17f", + "metadata": {}, + "outputs": [], + "source": [ + "## set type boolean" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c06e500-1871-4c71-816a-b898cb8633d1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def settarget(data):\n", + " high_quality = (data.quality >= 7).astype(int)\n", + " data.quality = high_quality\n", + " return data\n", + "\n", + "data = settarget(data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "661daf61-7b01-4dcd-9f26-30a0dfa3c51a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import seaborn as sns\n", + "sns.displot(data.quality, kde=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e4fec16b-9490-46a1-9f98-fe917796f219", + "metadata": {}, + "outputs": [], + "source": [ + "## median, upper and lower quartile, IQR\n", + "## histogram for distribution" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f886882-1fd1-4633-af8b-602dc90d369a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dims = (3, 4)\n", + "\n", + "f, axes = plt.subplots(dims[0], dims[1], figsize=(25, 15))\n", + "axis_i, axis_j = 0, 0\n", + "for col in data.columns:\n", + " if col == 'is_red' or col == 'quality':\n", + " continue # Box plots cannot be used on indicator variables\n", + " sns.boxplot(x=data['quality'], y=data[col], ax=axes[axis_i, axis_j])\n", + " axis_j += 1\n", + " if axis_j == dims[1]:\n", + " axis_i += 1\n", + " axis_j = 0" + ] + }, + { + "cell_type": "markdown", + "id": "206b8310-cd76-4012-ba6f-f2f621cd3fde", + "metadata": {}, + "source": [ + "Check missing value" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dee4b83a-a069-4ed8-a9c5-935e45539cd3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "## scenarios for missing data - decision for the missing data\n", + "## if alcohol is not an indicator, delete that record\n", + "\n", + "## what are we going to do with the outliers? are they real outliers?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31857042-ba20-42b5-9739-6a017f6b1951", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "data.isna().any()" + ] + }, + { + "cell_type": "markdown", + "id": "6b89fa04-ee75-4782-ac57-b2f5f2f45239", + "metadata": {}, + "source": [ + "## Prepare dataset for training model \n", + "Split the input data into 3 sets:\n", + "\n", + "- Train (60% of the dataset used to train the model)\n", + "- Validation (20% of the dataset used to tune the hyperparameters)\n", + "- Test (20% of the dataset used to report the true performance of the model on an unseen dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "757d77d2-d54e-4a2b-8b8d-1eba01ba61ce", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def get_trainingdata(data):\n", + " X = data.drop([\"quality\"], axis=1)\n", + " y = data.quality\n", + "\n", + " # Split out the training data\n", + " X_train, X_rem, y_train, y_rem = train_test_split(X, y, train_size=0.6, random_state=123)\n", + "\n", + " # Split the remaining data equally into validation and test\n", + " X_val, X_test, y_val, y_test = train_test_split(X_rem, y_rem, test_size=0.5, random_state=123)\n", + " return (X_train,X_val,X_test,y_train,y_val,y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61d6a7b2-974c-4c6c-a31f-3df48760c805", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "(X_train,X_val,X_test,y_train,y_val,y_test) = get_trainingdata(data)" + ] + }, + { + "cell_type": "markdown", + "id": "cfe73322-99ac-4e6b-8ed6-c475d418e108", + "metadata": { + "tags": [] + }, + "source": [ + "## Build a baseline model (random forest classifier) \n", + "Build a simple classifier using scikit-learn. Use MLflow to keep track of the model accuracy. You can read about Classification - ROC and AUC here if you want \n", + "https://developers.google.com/machine-learning/crash-course/classification/roc-and-auc" + ] + }, + { + "cell_type": "markdown", + "id": "4ea89452-6ec8-43cc-923c-de443450ff35", + "metadata": {}, + "source": [ + "Enable MLflow autologging" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b53a514-9eab-491d-9237-80448e4cea20", + "metadata": {}, + "outputs": [], + "source": [ + "experiment_name = \"WineQuality\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6628b383-14a4-493e-9add-e6076adf6ad5", + "metadata": {}, + "outputs": [], + "source": [ + "# check if experiment name already exists\n", + "mlflow.set_tracking_uri(\"http://mlflow:5500\")\n", + "mlflow.set_experiment(experiment_name)\n", + "\n", + "# enable autologging\n", + "mlflow.sklearn.autolog(log_input_examples=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f9e8cf7-0458-49d1-9dfa-a3061bbc00d4", + "metadata": {}, + "outputs": [], + "source": [ + "def log_featureimportance(model):\n", + " tmpdir = tempfile.mkdtemp()\n", + " filepath = os.path.join(tmpdir, 'feature_importance.json')\n", + " feature_importances = pd.DataFrame(model.feature_importances_, index=X_train.columns.tolist(), columns=['importance'])\n", + " feature_importances.sort_values('importance', ascending=False).to_json(filepath)\n", + " mlflow.log_artifact(filepath)\n", + " return" + ] + }, + { + "cell_type": "markdown", + "id": "01bdefde-fc6a-4e7d-8c68-649528667fd4", + "metadata": {}, + "source": [ + "Train random forest" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9f2832df-baa7-4125-8ef3-681517dbe8b0", + "metadata": {}, + "outputs": [], + "source": [ + "class SklearnModelWrapper(mlflow.pyfunc.PythonModel):\n", + " def __init__(self, model):\n", + " self.model = model\n", + "\n", + " def predict(self, context, model_input):\n", + " return self.model.predict_proba(model_input)[:,1]\n", + "\n", + "def train_randomforest(X_train,y_train,X_test,y_test):\n", + "\n", + " with mlflow.start_run(run_name='untuned_random_forest'):\n", + " n_estimators = 10\n", + " model = RandomForestClassifier(n_estimators=n_estimators, random_state=np.random.RandomState(123))\n", + " model.fit(X_train, y_train)\n", + "\n", + " predictions_test = model.predict_proba(X_test)[:,1]\n", + " auc_score = roc_auc_score(y_test, predictions_test)\n", + " mlflow.log_param('n_estimators', n_estimators) #specify the interested parameter/metric\n", + " mlflow.log_metric('auc', auc_score)\n", + " wrappedModel = SklearnModelWrapper(model)\n", + "\n", + " signature = infer_signature(X_train, wrappedModel.predict(None, X_train))\n", + "\n", + " conda_env = _mlflow_conda_env(\n", + " additional_conda_deps=None,\n", + " additional_pip_deps=[\"cloudpickle=={}\".format(cloudpickle.__version__), \"scikit-learn=={}\".format(sklearn.__version__)],\n", + " additional_conda_channels=None,\n", + " )\n", + " mlflow.pyfunc.log_model(\"random_forest_model\", python_model=wrappedModel, conda_env=conda_env, signature=signature)\n", + " log_featureimportance(model)\n", + " return model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d8957943-d0dc-4803-aab5-6c6ceb8ba34d", + "metadata": {}, + "outputs": [], + "source": [ + "model = train_randomforest(X_train,y_train,X_test,y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c8cdc21-a1df-429b-8be3-3e4d1ea5ff2d", + "metadata": {}, + "outputs": [], + "source": [ + "# Sanity-check: This should match the AUC logged by MLflow\n", + "print(f'AUC: {roc_auc_score(y_test, model.predict_proba(X_test)[:,1])}')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6eba2f19-7755-412e-bc67-2e586817582c", + "metadata": {}, + "outputs": [], + "source": [ + "# Sanity-check: This should match the feature importance logged by MLflow\n", + "feature_importances = pd.DataFrame(model.feature_importances_, index=X_train.columns.tolist(), columns=['importance'])\n", + "feature_importances.sort_values('importance', ascending=False)" + ] + }, + { + "cell_type": "markdown", + "id": "b4206c08-5021-43dd-a11d-e7e7f687ebef", + "metadata": {}, + "source": [ + "## Experiment with a new model (xgboost) \n", + "Use the xgboost library to train a more accurate model. Run hyperparameter tuning to train multiple models. As before, the code tracks the performance of each parameter configuration with MLflow." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "84cf68d6-86a4-4daa-927b-b4dc53f8cc9d", + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "search_space = {\n", + " 'max_depth': scope.int(hp.quniform('max_depth', 50, 100, 10)),\n", + " 'learning_rate': hp.loguniform('learning_rate', -3, 0),\n", + " 'reg_alpha': hp.loguniform('reg_alpha', -5, -1),\n", + " 'reg_lambda': hp.loguniform('reg_lambda', -6, -1),\n", + " 'min_child_weight': hp.loguniform('min_child_weight', -1, 3),\n", + " 'objective': 'binary:logistic',\n", + " 'seed': 123, # Set a seed for deterministic training\n", + "}\n", + "\n", + "def train_model(params):\n", + "\n", + " mlflow.xgboost.autolog()\n", + " with mlflow.start_run(nested=True):\n", + " train = xgb.DMatrix(data=X_train, label=y_train)\n", + " validation = xgb.DMatrix(data=X_val, label=y_val)\n", + "\n", + " booster = xgb.train(params=params, dtrain=train, num_boost_round=100,\\\n", + " evals=[(validation, \"validation\")], early_stopping_rounds=50)\n", + " validation_predictions = booster.predict(validation)\n", + " auc_score = roc_auc_score(y_val, validation_predictions)\n", + " mlflow.log_metric('auc', auc_score) #specify the interested parameter/metric\n", + "\n", + " signature = infer_signature(X_train, booster.predict(train))\n", + " mlflow.xgboost.log_model(booster, \"model\", signature=signature)\n", + "\n", + " return {'status': STATUS_OK, 'loss': -1*auc_score, 'booster': booster.attributes()}\n", + "\n", + "with mlflow.start_run(run_name='xgboost_models'):\n", + " best_params = fmin(\n", + " fn=train_model,\n", + " space=search_space,\n", + " algo=tpe.suggest,\n", + " max_evals=10,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12fb65af-5545-4563-a70a-ad62d11e6615", + "metadata": {}, + "outputs": [], + "source": [ + "best_run = mlflow.search_runs(order_by=['metrics.auc DESC']).iloc[0]\n", + "best_run_id = best_run[\"run_id\"]\n", + "print(f'AUC of Best Run: {best_run[\"metrics.auc\"]}')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2df971e0-1748-489c-b36d-dd481c211a0d", + "metadata": {}, + "outputs": [], + "source": [ + "best_run_id" + ] + }, + { + "cell_type": "markdown", + "id": "1f57f0bc-ec52-463c-9241-0bf897465b1b", + "metadata": { + "tags": [] + }, + "source": [ + "## Predict " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db412034-daab-4942-b3ae-0c5410a3e5a5", + "metadata": {}, + "outputs": [], + "source": [ + "# model = mlflow.pyfunc.load_model(f\"models:/TestModelD/production\")\n", + "model = mlflow.pyfunc.load_model(\"runs:/\" + best_run_id + \"/model\")\n", + "\n", + "test_predictions = model.predict(X_test)\n", + "print(f'AUC: {roc_auc_score(y_test, test_predictions)}')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b5593581-c563-4c1a-aa80-f10d77f53209", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.metrics import classification_report\n", + "\n", + "class_labels = ['white wine', 'red wine']\n", + "test_predictions = np.where(test_predictions>0.5, 1, 0)\n", + "print(classification_report(y_test, test_predictions, target_names=class_labels))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0ebe7ec-a7e2-49bc-88bb-2b5ea79f3807", + "metadata": {}, + "outputs": [], + "source": [ + "cm = confusion_matrix(y_test, test_predictions)\n", + "disp = ConfusionMatrixDisplay(confusion_matrix=cm)\n", + "\n", + "disp.plot()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d9f40cc8-9a79-4521-9783-6a3aa0b0127a", + "metadata": {}, + "outputs": [], + "source": [ + "# register the best model\n", + "new_model_version = mlflow.register_model(f\"runs:/{best_run_id}/model\", \"WineQuality\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d6d78d2a-563d-41de-a2a9-1dbddbdcb3cc", + "metadata": {}, + "outputs": [], + "source": [ + "# # Promote the new model version to Production\n", + "# client.transition_model_version_stage(\n", + "# name=\"TestModelD\",\n", + "# version=new_model_version.version,\n", + "# stage=\"Production\"\n", + "# )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d112aed5-fe65-47b3-aff3-899a96010bdf", + "metadata": {}, + "outputs": [], + "source": [ + "# # clean up models\n", + "# from mlflow.tracking import MlflowClient\n", + "# client = MlflowClient()\n", + "# client.delete_registered_model(name=\"winequality\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9", + "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.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/demo_project.ipynb b/demo_project.ipynb index d6698e2..7eace38 100644 --- a/demo_project.ipynb +++ b/demo_project.ipynb @@ -36,209 +36,25 @@ "id": "d73dd05b-5b58-4587-a1df-02a9c96d1996", "metadata": {}, "source": [ - "Before import packages, install packages as is required by requirements.txt
\n", + "Before import packages, install packages as required
\n", "Any pypi packages can be installed
" ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "id": "e3744f2b-4d07-4f10-84f0-1daa05cb8573", "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting s3fs\n", - " Downloading s3fs-2024.6.0-py3-none-any.whl (29 kB)\n", - "Requirement already satisfied: aiohttp!=4.0.0a0,!=4.0.0a1 in /opt/app-root/lib/python3.9/site-packages (from s3fs) (3.9.5)\n", - "Collecting aiobotocore<3.0.0,>=2.5.4\n", - " Downloading aiobotocore-2.13.0-py3-none-any.whl (76 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m76.6/76.6 kB\u001b[0m \u001b[31m9.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting fsspec==2024.6.0.*\n", - " Downloading fsspec-2024.6.0-py3-none-any.whl (176 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m176.9/176.9 kB\u001b[0m \u001b[31m128.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: botocore<1.34.107,>=1.34.70 in /opt/app-root/lib/python3.9/site-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs) (1.34.89)\n", - "Collecting aioitertools<1.0.0,>=0.5.1\n", - " Downloading aioitertools-0.11.0-py3-none-any.whl (23 kB)\n", - "Requirement already satisfied: wrapt<2.0.0,>=1.10.10 in /opt/app-root/lib/python3.9/site-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs) (1.16.0)\n", - "Requirement already satisfied: attrs>=17.3.0 in /opt/app-root/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs) (23.2.0)\n", - "Requirement already satisfied: aiosignal>=1.1.2 in /opt/app-root/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs) (1.3.1)\n", - "Requirement already satisfied: multidict<7.0,>=4.5 in /opt/app-root/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs) (6.0.5)\n", - "Requirement already satisfied: yarl<2.0,>=1.0 in /opt/app-root/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs) (1.9.4)\n", - "Requirement already satisfied: async-timeout<5.0,>=4.0 in /opt/app-root/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs) (4.0.3)\n", - "Requirement already satisfied: frozenlist>=1.1.1 in /opt/app-root/lib/python3.9/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs) (1.4.1)\n", - "Requirement already satisfied: typing_extensions>=4.0 in /opt/app-root/lib/python3.9/site-packages (from aioitertools<1.0.0,>=0.5.1->aiobotocore<3.0.0,>=2.5.4->s3fs) (4.11.0)\n", - "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/app-root/lib/python3.9/site-packages (from botocore<1.34.107,>=1.34.70->aiobotocore<3.0.0,>=2.5.4->s3fs) (1.0.1)\n", - "Requirement already satisfied: urllib3<1.27,>=1.25.4 in /opt/app-root/lib/python3.9/site-packages (from botocore<1.34.107,>=1.34.70->aiobotocore<3.0.0,>=2.5.4->s3fs) (1.26.18)\n", - "Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /opt/app-root/lib/python3.9/site-packages (from botocore<1.34.107,>=1.34.70->aiobotocore<3.0.0,>=2.5.4->s3fs) (2.9.0.post0)\n", - "Requirement already satisfied: idna>=2.0 in /opt/app-root/lib/python3.9/site-packages (from yarl<2.0,>=1.0->aiohttp!=4.0.0a0,!=4.0.0a1->s3fs) (3.7)\n", - "Requirement already satisfied: six>=1.5 in /opt/app-root/lib/python3.9/site-packages (from python-dateutil<3.0.0,>=2.1->botocore<1.34.107,>=1.34.70->aiobotocore<3.0.0,>=2.5.4->s3fs) (1.16.0)\n", - "Installing collected packages: fsspec, aioitertools, aiobotocore, s3fs\n", - " Attempting uninstall: fsspec\n", - " Found existing installation: fsspec 2024.3.1\n", - " Uninstalling fsspec-2024.3.1:\n", - " Successfully uninstalled fsspec-2024.3.1\n", - "Successfully installed aiobotocore-2.13.0 aioitertools-0.11.0 fsspec-2024.6.0 s3fs-2024.6.0\n", - "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip available: \u001b[0m\u001b[31;49m22.2.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.0\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" - ] - } - ], - "source": [ - "!pip install s3fs" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "37a5e193-27e4-4fc2-b315-72fbaf745bd1", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting hyperopt\n", - " Downloading hyperopt-0.2.7-py2.py3-none-any.whl (1.6 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 MB\u001b[0m \u001b[31m18.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", - "\u001b[?25hCollecting cloudpickle\n", - " Downloading cloudpickle-3.0.0-py3-none-any.whl (20 kB)\n", - "Collecting mlflow\n", - " Downloading mlflow-2.13.2-py3-none-any.whl (25.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m25.0/25.0 MB\u001b[0m \u001b[31m100.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", - "\u001b[?25hCollecting xgboost\n", - " Downloading xgboost-2.0.3-py3-none-manylinux2014_x86_64.whl (297.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m297.1/297.1 MB\u001b[0m \u001b[31m81.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tqdm in /opt/app-root/lib/python3.9/site-packages (from hyperopt) (4.66.2)\n", - "Collecting py4j\n", - " Downloading py4j-0.10.9.7-py2.py3-none-any.whl (200 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m200.5/200.5 kB\u001b[0m \u001b[31m153.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: numpy in /opt/app-root/lib/python3.9/site-packages (from hyperopt) (1.26.4)\n", - "Requirement already satisfied: six in /opt/app-root/lib/python3.9/site-packages (from hyperopt) (1.16.0)\n", - "Requirement already satisfied: networkx>=2.2 in /opt/app-root/lib/python3.9/site-packages (from hyperopt) (3.2.1)\n", - "Requirement already satisfied: scipy in /opt/app-root/lib/python3.9/site-packages (from hyperopt) (1.12.0)\n", - "Collecting future\n", - " Downloading future-1.0.0-py3-none-any.whl (491 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m491.3/491.3 kB\u001b[0m \u001b[31m168.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: docker<8,>=4.0.0 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (7.0.0)\n", - "Collecting querystring-parser<2\n", - " Downloading querystring_parser-1.2.4-py2.py3-none-any.whl (7.9 kB)\n", - "Collecting alembic!=1.10.0,<2\n", - " Downloading alembic-1.13.1-py3-none-any.whl (233 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m233.4/233.4 kB\u001b[0m \u001b[31m99.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: Jinja2<4,>=2.11 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (3.1.3)\n", - "Requirement already satisfied: entrypoints<1 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (0.4)\n", - "Requirement already satisfied: scikit-learn<2 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (1.4.2)\n", - "Collecting sqlalchemy<3,>=1.4.0\n", - " Downloading SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m120.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: cachetools<6,>=5.0.0 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (5.3.3)\n", - "Requirement already satisfied: protobuf<5,>=3.12.0 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (4.25.3)\n", - "Collecting opentelemetry-sdk<3,>=1.0.0\n", - " Downloading opentelemetry_sdk-1.25.0-py3-none-any.whl (107 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m107.0/107.0 kB\u001b[0m \u001b[31m116.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: click<9,>=7.0 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (8.1.7)\n", - "Requirement already satisfied: gitpython<4,>=3.1.9 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (3.1.43)\n", - "Collecting Flask<4\n", - " Downloading flask-3.0.3-py3-none-any.whl (101 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m101.7/101.7 kB\u001b[0m \u001b[31m180.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: pytz<2025 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (2024.1)\n", - "Collecting graphene<4\n", - " Downloading graphene-3.3-py2.py3-none-any.whl (128 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m128.2/128.2 kB\u001b[0m \u001b[31m140.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: pyyaml<7,>=5.1 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (6.0.1)\n", - "Collecting pyarrow<16,>=4.0.0\n", - " Downloading pyarrow-15.0.2-cp39-cp39-manylinux_2_28_x86_64.whl (38.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m38.3/38.3 MB\u001b[0m \u001b[31m113.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", - "\u001b[?25hCollecting sqlparse<1,>=0.4.0\n", - " Downloading sqlparse-0.5.0-py3-none-any.whl (43 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m44.0/44.0 kB\u001b[0m \u001b[31m128.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting opentelemetry-api<3,>=1.0.0\n", - " Downloading opentelemetry_api-1.25.0-py3-none-any.whl (59 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m59.9/59.9 kB\u001b[0m \u001b[31m89.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting markdown<4,>=3.3\n", - " Downloading Markdown-3.6-py3-none-any.whl (105 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m105.4/105.4 kB\u001b[0m \u001b[31m100.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: matplotlib<4 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (3.8.4)\n", - "Requirement already satisfied: pandas<3 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (2.2.2)\n", - "Requirement already satisfied: packaging<25 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (24.0)\n", - "Requirement already satisfied: importlib-metadata!=4.7.0,<8,>=3.7.0 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (7.1.0)\n", - "Requirement already satisfied: requests<3,>=2.17.3 in /opt/app-root/lib/python3.9/site-packages (from mlflow) (2.31.0)\n", - "Collecting gunicorn<23\n", - " Downloading gunicorn-22.0.0-py3-none-any.whl (84 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m84.4/84.4 kB\u001b[0m \u001b[31m152.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting Mako\n", - " Downloading Mako-1.3.5-py3-none-any.whl (78 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m78.6/78.6 kB\u001b[0m \u001b[31m103.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: typing-extensions>=4 in /opt/app-root/lib/python3.9/site-packages (from alembic!=1.10.0,<2->mlflow) (4.11.0)\n", - "Requirement already satisfied: urllib3>=1.26.0 in /opt/app-root/lib/python3.9/site-packages (from docker<8,>=4.0.0->mlflow) (1.26.18)\n", - "Collecting Werkzeug>=3.0.0\n", - " Downloading werkzeug-3.0.3-py3-none-any.whl (227 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m227.3/227.3 kB\u001b[0m \u001b[31m177.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting itsdangerous>=2.1.2\n", - " Downloading itsdangerous-2.2.0-py3-none-any.whl (16 kB)\n", - "Collecting blinker>=1.6.2\n", - " Downloading blinker-1.8.2-py3-none-any.whl (9.5 kB)\n", - "Requirement already satisfied: gitdb<5,>=4.0.1 in /opt/app-root/lib/python3.9/site-packages (from gitpython<4,>=3.1.9->mlflow) (4.0.11)\n", - "Collecting graphql-core<3.3,>=3.1\n", - " Downloading graphql_core-3.2.3-py3-none-any.whl (202 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m202.9/202.9 kB\u001b[0m \u001b[31m184.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting aniso8601<10,>=8\n", - " Downloading aniso8601-9.0.1-py2.py3-none-any.whl (52 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m52.8/52.8 kB\u001b[0m \u001b[31m151.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting graphql-relay<3.3,>=3.1\n", - " Downloading graphql_relay-3.2.0-py3-none-any.whl (16 kB)\n", - "Requirement already satisfied: zipp>=0.5 in /opt/app-root/lib/python3.9/site-packages (from importlib-metadata!=4.7.0,<8,>=3.7.0->mlflow) (3.18.1)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /opt/app-root/lib/python3.9/site-packages (from Jinja2<4,>=2.11->mlflow) (2.1.5)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /opt/app-root/lib/python3.9/site-packages (from matplotlib<4->mlflow) (4.51.0)\n", - "Requirement already satisfied: pillow>=8 in /opt/app-root/lib/python3.9/site-packages (from matplotlib<4->mlflow) (10.3.0)\n", - "Requirement already satisfied: pyparsing>=2.3.1 in /opt/app-root/lib/python3.9/site-packages (from matplotlib<4->mlflow) (3.1.2)\n", - "Requirement already satisfied: kiwisolver>=1.3.1 in /opt/app-root/lib/python3.9/site-packages (from matplotlib<4->mlflow) (1.4.5)\n", - "Requirement already satisfied: cycler>=0.10 in /opt/app-root/lib/python3.9/site-packages (from matplotlib<4->mlflow) (0.12.1)\n", - "Requirement already satisfied: importlib-resources>=3.2.0 in /opt/app-root/lib/python3.9/site-packages (from matplotlib<4->mlflow) (6.4.0)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /opt/app-root/lib/python3.9/site-packages (from matplotlib<4->mlflow) (1.2.1)\n", - "Requirement already satisfied: python-dateutil>=2.7 in /opt/app-root/lib/python3.9/site-packages (from matplotlib<4->mlflow) (2.9.0.post0)\n", - "Requirement already satisfied: deprecated>=1.2.6 in /opt/app-root/lib/python3.9/site-packages (from opentelemetry-api<3,>=1.0.0->mlflow) (1.2.14)\n", - "Collecting opentelemetry-semantic-conventions==0.46b0\n", - " Downloading opentelemetry_semantic_conventions-0.46b0-py3-none-any.whl (130 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m130.5/130.5 kB\u001b[0m \u001b[31m116.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: tzdata>=2022.7 in /opt/app-root/lib/python3.9/site-packages (from pandas<3->mlflow) (2024.1)\n", - "Requirement already satisfied: idna<4,>=2.5 in /opt/app-root/lib/python3.9/site-packages (from requests<3,>=2.17.3->mlflow) (3.7)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /opt/app-root/lib/python3.9/site-packages (from requests<3,>=2.17.3->mlflow) (2024.2.2)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /opt/app-root/lib/python3.9/site-packages (from requests<3,>=2.17.3->mlflow) (3.3.2)\n", - "Requirement already satisfied: joblib>=1.2.0 in /opt/app-root/lib/python3.9/site-packages (from scikit-learn<2->mlflow) (1.4.0)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/app-root/lib/python3.9/site-packages (from scikit-learn<2->mlflow) (3.4.0)\n", - "Collecting greenlet!=0.4.17\n", - " Downloading greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (614 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m614.3/614.3 kB\u001b[0m \u001b[31m103.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: wrapt<2,>=1.10 in /opt/app-root/lib/python3.9/site-packages (from deprecated>=1.2.6->opentelemetry-api<3,>=1.0.0->mlflow) (1.16.0)\n", - "Requirement already satisfied: smmap<6,>=3.0.1 in /opt/app-root/lib/python3.9/site-packages (from gitdb<5,>=4.0.1->gitpython<4,>=3.1.9->mlflow) (5.0.1)\n", - "Installing collected packages: py4j, aniso8601, Werkzeug, sqlparse, querystring-parser, pyarrow, Mako, itsdangerous, gunicorn, greenlet, graphql-core, future, cloudpickle, blinker, xgboost, sqlalchemy, opentelemetry-api, markdown, hyperopt, graphql-relay, Flask, opentelemetry-semantic-conventions, graphene, alembic, opentelemetry-sdk, mlflow\n", - " Attempting uninstall: pyarrow\n", - " Found existing installation: pyarrow 16.0.0\n", - " Uninstalling pyarrow-16.0.0:\n", - " Successfully uninstalled pyarrow-16.0.0\n", - "Successfully installed Flask-3.0.3 Mako-1.3.5 Werkzeug-3.0.3 alembic-1.13.1 aniso8601-9.0.1 blinker-1.8.2 cloudpickle-3.0.0 future-1.0.0 graphene-3.3 graphql-core-3.2.3 graphql-relay-3.2.0 greenlet-3.0.3 gunicorn-22.0.0 hyperopt-0.2.7 itsdangerous-2.2.0 markdown-3.6 mlflow-2.13.2 opentelemetry-api-1.25.0 opentelemetry-sdk-1.25.0 opentelemetry-semantic-conventions-0.46b0 py4j-0.10.9.7 pyarrow-15.0.2 querystring-parser-1.2.4 sqlalchemy-2.0.30 sqlparse-0.5.0 xgboost-2.0.3\n", - "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip available: \u001b[0m\u001b[31;49m22.2.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.0\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" - ] - } - ], + "outputs": [], "source": [ - "!pip install hyperopt cloudpickle mlflow xgboost" + "!pip install s3fs hyperopt cloudpickle mlflow xgboost" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "id": "fa3a0921-36d0-4b26-8378-cd5adab57fb8", "metadata": { "tags": [] @@ -280,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "id": "6b6d8a33-66ff-492d-b85e-0e73587d93f8", "metadata": { "tags": [] @@ -342,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": null, "id": "f2aa0f94-5b37-4873-9467-44e6703af9c8", "metadata": { "tags": [] @@ -357,7 +173,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "id": "47ae3876-523d-47f1-b895-e26bfb65977f", "metadata": { "tags": [] @@ -371,66 +187,13 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "id": "4d5bb280-9473-46a0-b575-dfa64f9872cf", "metadata": { "scrolled": true, "tags": [] }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'ResponseMetadata': {'RequestId': '17D8412F76BD3277',\n", - " 'HostId': 'dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8',\n", - " 'HTTPStatusCode': 200,\n", - " 'HTTPHeaders': {'accept-ranges': 'bytes',\n", - " 'content-length': '1265',\n", - " 'content-security-policy': 'block-all-mixed-content',\n", - " 'content-type': 'application/xml',\n", - " 'server': 'MinIO',\n", - " 'strict-transport-security': 'max-age=31536000; includeSubDomains',\n", - " 'vary': 'Origin, Accept-Encoding',\n", - " 'x-amz-id-2': 'dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8',\n", - " 'x-amz-request-id': '17D8412F76BD3277',\n", - " 'x-content-type-options': 'nosniff',\n", - " 'x-xss-protection': '1; mode=block',\n", - " 'date': 'Wed, 12 Jun 2024 12:22:09 GMT'},\n", - " 'RetryAttempts': 0},\n", - " 'IsTruncated': False,\n", - " 'Marker': '',\n", - " 'Contents': [{'Key': 'wine_quality.csv',\n", - " 'LastModified': datetime.datetime(2024, 6, 12, 11, 43, 12, 11000, tzinfo=tzlocal()),\n", - " 'ETag': '\"17fbffe83c746612cc247b182e9f7278\"',\n", - " 'Size': 264425,\n", - " 'StorageClass': 'STANDARD',\n", - " 'Owner': {'DisplayName': 'minio',\n", - " 'ID': '02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4'}},\n", - " {'Key': 'winequality-red.csv',\n", - " 'LastModified': datetime.datetime(2024, 6, 12, 11, 55, 5, 250000, tzinfo=tzlocal()),\n", - " 'ETag': '\"2daeecee174368f8a33b82c8cccae3a5\"',\n", - " 'Size': 84199,\n", - " 'StorageClass': 'STANDARD',\n", - " 'Owner': {'DisplayName': 'minio',\n", - " 'ID': '02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4'}},\n", - " {'Key': 'winequality-white.csv',\n", - " 'LastModified': datetime.datetime(2024, 6, 12, 11, 55, 5, 250000, tzinfo=tzlocal()),\n", - " 'ETag': '\"5d9ff0f7f716dace19e3ab4578775fd7\"',\n", - " 'Size': 264426,\n", - " 'StorageClass': 'STANDARD',\n", - " 'Owner': {'DisplayName': 'minio',\n", - " 'ID': '02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4'}}],\n", - " 'Name': 'data',\n", - " 'Prefix': '',\n", - " 'MaxKeys': 1000,\n", - " 'EncodingType': 'url'}" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "s3_client.list_objects(Bucket='data')" ] @@ -445,7 +208,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "id": "9207c9a6-bcc4-42fc-abf1-ff84c431dbbd", "metadata": { "tags": [] @@ -459,7 +222,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "id": "e472d265-819b-4881-9fd4-b2fda3933179", "metadata": { "tags": [] @@ -481,7 +244,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": null, "id": "3131849f-2412-4468-93b2-b21e73f91aa7", "metadata": { "tags": [] @@ -503,7 +266,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": null, "id": "b0ab7588-f839-4325-a4cb-22486498884d", "metadata": { "tags": [] @@ -515,7 +278,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": null, "id": "6af49215-b766-4ca4-a140-6e21f8d7ecb7", "metadata": { "tags": [] @@ -532,7 +295,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": null, "id": "fa3e4777-76c2-4687-a8da-6e10c18fe536", "metadata": { "tags": [] @@ -546,161 +309,12 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": null, "id": "a8620947-ab99-43cb-9a56-128f9ff03fc5", "metadata": { "tags": [] }, - "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", - "
fixed_acidityvolatile_aciditycitric_acidresidual_sugarchloridesfree_sulfur_dioxidetotal_sulfur_dioxidedensitypHsulphatesalcoholqualityis_red
07.40.700.001.90.07611.034.00.99783.510.569.451
17.80.880.002.60.09825.067.00.99683.200.689.851
27.80.760.042.30.09215.054.00.99703.260.659.851
311.20.280.561.90.07517.060.00.99803.160.589.861
47.40.700.001.90.07611.034.00.99783.510.569.451
\n", - "
" - ], - "text/plain": [ - " fixed_acidity volatile_acidity citric_acid residual_sugar chlorides \\\n", - "0 7.4 0.70 0.00 1.9 0.076 \n", - "1 7.8 0.88 0.00 2.6 0.098 \n", - "2 7.8 0.76 0.04 2.3 0.092 \n", - "3 11.2 0.28 0.56 1.9 0.075 \n", - "4 7.4 0.70 0.00 1.9 0.076 \n", - "\n", - " free_sulfur_dioxide total_sulfur_dioxide density pH sulphates \\\n", - "0 11.0 34.0 0.9978 3.51 0.56 \n", - "1 25.0 67.0 0.9968 3.20 0.68 \n", - "2 15.0 54.0 0.9970 3.26 0.65 \n", - "3 17.0 60.0 0.9980 3.16 0.58 \n", - "4 11.0 34.0 0.9978 3.51 0.56 \n", - "\n", - " alcohol quality is_red \n", - "0 9.4 5 1 \n", - "1 9.8 5 1 \n", - "2 9.8 5 1 \n", - "3 9.8 6 1 \n", - "4 9.4 5 1 " - ] - }, - "execution_count": 85, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "data.head(5)" ] @@ -715,76 +329,24 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": null, "id": "cad8a920-4a11-4a5f-b60e-6eaf9d882bb2", "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting seaborn\n", - " Downloading seaborn-0.13.2-py3-none-any.whl (294 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m294.9/294.9 kB\u001b[0m \u001b[31m9.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: pandas>=1.2 in /opt/app-root/lib/python3.9/site-packages (from seaborn) (2.2.2)\n", - "Requirement already satisfied: numpy!=1.24.0,>=1.20 in /opt/app-root/lib/python3.9/site-packages (from seaborn) (1.26.4)\n", - "Requirement already satisfied: matplotlib!=3.6.1,>=3.4 in /opt/app-root/lib/python3.9/site-packages (from seaborn) (3.8.4)\n", - "Requirement already satisfied: cycler>=0.10 in /opt/app-root/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (0.12.1)\n", - "Requirement already satisfied: pillow>=8 in /opt/app-root/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (10.3.0)\n", - "Requirement already satisfied: packaging>=20.0 in /opt/app-root/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (24.0)\n", - "Requirement already satisfied: python-dateutil>=2.7 in /opt/app-root/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (2.9.0.post0)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /opt/app-root/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (4.51.0)\n", - "Requirement already satisfied: pyparsing>=2.3.1 in /opt/app-root/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (3.1.2)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /opt/app-root/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.2.1)\n", - "Requirement already satisfied: importlib-resources>=3.2.0 in /opt/app-root/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (6.4.0)\n", - "Requirement already satisfied: kiwisolver>=1.3.1 in /opt/app-root/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.4.5)\n", - "Requirement already satisfied: tzdata>=2022.7 in /opt/app-root/lib/python3.9/site-packages (from pandas>=1.2->seaborn) (2024.1)\n", - "Requirement already satisfied: pytz>=2020.1 in /opt/app-root/lib/python3.9/site-packages (from pandas>=1.2->seaborn) (2024.1)\n", - "Requirement already satisfied: zipp>=3.1.0 in /opt/app-root/lib/python3.9/site-packages (from importlib-resources>=3.2.0->matplotlib!=3.6.1,>=3.4->seaborn) (3.18.1)\n", - "Requirement already satisfied: six>=1.5 in /opt/app-root/lib/python3.9/site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.4->seaborn) (1.16.0)\n", - "Installing collected packages: seaborn\n", - "Successfully installed seaborn-0.13.2\n", - "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip available: \u001b[0m\u001b[31;49m22.2.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.0\u001b[0m\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" - ] - } - ], + "outputs": [], "source": [ "!pip install seaborn" ] }, { "cell_type": "code", - "execution_count": 86, + "execution_count": null, "id": "b4e1d074-f5fb-41b1-afc7-1150550db01f", "metadata": { "tags": [] }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 86, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import seaborn as sns\n", "sns.displot(data.quality, kde=False)" @@ -802,7 +364,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": null, "id": "5c06e500-1871-4c71-816a-b898cb8633d1", "metadata": { "tags": [] @@ -819,33 +381,12 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": null, "id": "661daf61-7b01-4dcd-9f26-30a0dfa3c51a", "metadata": { "tags": [] }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 88, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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WqRTp041aCAAAPC/GvUz6V/96lf8vd0AADSSRo10fn6+WrRo0ZiHBACg2arX29133nmn133LsnTkyBF9+umnevTRRxtlMAAAmrt6RToiIsLrfnBwsHr37q3Fixdr9OjRjTIYAADNXb0ivW7dusaeAwAAfE+9Il2noKBABw4ckCT169dP//Zv/9YoQwEAgHpG+ujRo7rnnnuUk5OjyMhISVJZWZlGjhypjRs3qmPHjo05IwAAzVK9frp7+vTpOnnypPbt26cTJ07oxIkT2rt3rzwej/7jP/6jsWcEAKBZqtcr6a1bt+qdd95R37597W2JiYnKyMjgB8cAAGgk9XolXVtbe953SEtSWFiYamtrGzwUAACoZ6RHjRql3/72tzp8+LC97ZtvvlF6erpuvvnmRhsOAIDmrF6Rfvrpp+XxeNS1a1f16NFDPXr0ULdu3eTxePTUU0819owAADRL9fpMOj4+Xrt27dI777yjgwcPSpL69u2r5OTkRh0OAIDmzKdX0jt27FBiYqI8Ho+CgoJ0yy23aPr06Zo+fbquvfZa9evXT++//35TzQoAQLPiU6RXrVqlBx98UE6n87x9ERER+vWvf60VK1Y02nAAADRnPkX6b3/7m376059edP/o0aNVUFDQ4KEAAICPkS4tLb3gr17VCQ0N1bFjxxo8FAAA8DHSP/nJT7R3796L7v/ss88UFxfX4KEAAICPkR4zZoweffRRnT179rx9Z86c0cKFC3Xbbbc12nAAADRnPv0K1vz58/Xqq6+qV69emjZtmnr37i1JOnjwoDIyMlRTU6N58+Y1yaAAADQ3PkU6JiZGeXl5evjhhzV37lxZliVJCgoKUkpKijIyMhQTE9MkgwIA0Nz4/JeZdOnSRVu2bNG3336rL774QpZl6aqrrlK7du2aYj4AAJqtev2NY5LUrl07XXvttY05CwAAOEe9/u5uAADQ9Ig0AACGItIAABiKSAMAYCgiDQCAoYg0AACGItIAABiKSAMAYCgiDQCAoYg0AACGItIAABiKSAMAYCgiDQCAoYg0AACGItIAABiKSAMAYCgiDQCAoYg0AACGItIAABiKSAMAYCgiDQCAoYg0AACGItIAABiKSAMAYCgiDQCAoYg0AACGItIAABiKSAMAYCgiDQCAoYg0AACGItIAABgqoJFesmSJrr32WrVt21bR0dEaO3asioqKvNacPXtWaWlpat++vdq0aaNx48aptLTUa01JSYlSU1PVqlUrRUdHa9asWaqurvZak5OTo0GDBsnhcKhnz57KzMxs6tMDAKBBAhrp3NxcpaWl6aOPPlJ2draqqqo0evRonT592l6Tnp6uN998U6+88opyc3N1+PBh3Xnnnfb+mpoapaamqrKyUnl5eVq/fr0yMzO1YMECe01xcbFSU1M1cuRIFRYWasaMGZoyZYq2bdvm1/MFAMAXQZZlWYEeos6xY8cUHR2t3Nxc3XjjjSovL1fHjh21YcMG3XXXXZKkgwcPqm/fvsrPz9ewYcP01ltv6bbbbtPhw4cVExMjSVqzZo3mzJmjY8eOKTw8XHPmzFFWVpb27t1rP9c999yjsrIybd269bw5KioqVFFRYd/3eDyKj49XeXm5nE5ng85x165dSkpK0i3z1ikqoXeDjnUpJ0qKlP3HB1RQUKBBgwY12fMAAJqOUZ9Jl5eXS5KioqIkSQUFBaqqqlJycrK9pk+fPkpISFB+fr4kKT8/X/3797cDLUkpKSnyeDzat2+fvebcY9StqTvG9y1ZskQRERH2LT4+vvFOEgCAy2RMpGtrazVjxgxdf/31uvrqqyVJbrdb4eHhioyM9FobExMjt9ttrzk30HX76/Zdao3H49GZM2fOm2Xu3LkqLy+3b4cOHWqUcwQAwBehgR6gTlpamvbu3asPPvgg0KPI4XDI4XAEegwAQDNnxCvpadOmafPmzXr33XfVuXNne3tsbKwqKytVVlbmtb60tFSxsbH2mu//tHfd/R9a43Q61bJly8Y+HQAAGkVAI21ZlqZNm6bXXntNO3bsULdu3bz2JyUlKSwsTNu3b7e3FRUVqaSkRC6XS5Lkcrm0Z88eHT161F6TnZ0tp9OpxMREe825x6hbU3cMAABMFNC3u9PS0rRhwwb99a9/Vdu2be3PkCMiItSyZUtFRERo8uTJmjlzpqKiouR0OjV9+nS5XC4NGzZMkjR69GglJiZqwoQJWrp0qdxut+bPn6+0tDT7LeupU6fq6aef1uzZszVp0iTt2LFDmzZtUlZWVsDOHQCAHxLQV9LPPvusysvLNWLECMXFxdm3l19+2V6zcuVK3XbbbRo3bpxuvPFGxcbG6tVXX7X3h4SEaPPmzQoJCZHL5dKvfvUr3XfffVq8eLG9plu3bsrKylJ2drauueYaLV++XC+88IJSUlL8er4AAPgioK+kL+dXtFu0aKGMjAxlZGRcdE2XLl20ZcuWSx5nxIgR2r17t88zAgAQKEb84BgAADgfkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQ4UGegAAABqqpKREx48f98tzdejQQQkJCX55LiINALiilZSUqE+fvjpz5ju/PF/Llq108OABv4SaSAMArmjHjx/XmTPfaeikhXLGdW3S5/Ic+Vo71/5ex48fJ9IAAFwuZ1xXRSX0DvQYjYofHAMAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMFdBIv/fee7r99tvVqVMnBQUF6fXXX/fab1mWFixYoLi4OLVs2VLJycn6/PPPvdacOHFC48ePl9PpVGRkpCZPnqxTp055rfnss880fPhwtWjRQvHx8Vq6dGlTnxoAAA0W0EifPn1a11xzjTIyMi64f+nSpXryySe1Zs0a7dy5U61bt1ZKSorOnj1rrxk/frz27dun7Oxsbd68We+9954eeughe7/H49Ho0aPVpUsXFRQU6IknntCiRYv03HPPNfn5AQDQEKGBfPJbb71Vt9566wX3WZalVatWaf78+brjjjskSf/93/+tmJgYvf7667rnnnt04MABbd26VZ988okGDx4sSXrqqac0ZswYLVu2TJ06ddJLL72kyspKrV27VuHh4erXr58KCwu1YsUKr5gDAGAaYz+TLi4ultvtVnJysr0tIiJCQ4cOVX5+viQpPz9fkZGRdqAlKTk5WcHBwdq5c6e95sYbb1R4eLi9JiUlRUVFRfr2228v+NwVFRXyeDxeNwAA/M3YSLvdbklSTEyM1/aYmBh7n9vtVnR0tNf+0NBQRUVFea250DHOfY7vW7JkiSIiIuxbfHx8w08IAAAfGRvpQJo7d67Ky8vt26FDhwI9EgCgGTI20rGxsZKk0tJSr+2lpaX2vtjYWB09etRrf3V1tU6cOOG15kLHOPc5vs/hcMjpdHrdAADwN2Mj3a1bN8XGxmr79u32No/Ho507d8rlckmSXC6XysrKVFBQYK/ZsWOHamtrNXToUHvNe++9p6qqKntNdna2evfurXbt2vnpbAAA8F1AI33q1CkVFhaqsLBQ0v/+sFhhYaFKSkoUFBSkGTNm6A9/+IPeeOMN7dmzR/fdd586deqksWPHSpL69u2rn/70p3rwwQf18ccf68MPP9S0adN0zz33qFOnTpKke++9V+Hh4Zo8ebL27dunl19+WatXr9bMmTMDdNYAAFyegP4K1qeffqqRI0fa9+vCOXHiRGVmZmr27Nk6ffq0HnroIZWVlemGG27Q1q1b1aJFC/sxL730kqZNm6abb75ZwcHBGjdunJ588kl7f0REhN5++22lpaUpKSlJHTp00IIFC/j1KwCA8QIa6REjRsiyrIvuDwoK0uLFi7V48eKLromKitKGDRsu+TwDBgzQ+++/X+85AQAIBGM/kwYAoLkj0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgKCINAIChiDQAAIYi0gAAGIpIAwBgqGYV6YyMDHXt2lUtWrTQ0KFD9fHHHwd6JAAALqrZRPrll1/WzJkztXDhQu3atUvXXHONUlJSdPTo0UCPBgDABTWbSK9YsUIPPvigHnjgASUmJmrNmjVq1aqV1q5dG+jRAAC4oNBAD+APlZWVKigo0Ny5c+1twcHBSk5OVn5+/nnrKyoqVFFRYd8vLy+XJHk8ngbPcurUKUnSiX8UqbriTIOPdzEed4kkqaCgwH7OphQcHKza2lqex+Dn+rE9jz+f68f2PP58Ln88T1FRkaSm/3NV+r8/W0+dOtUoTWjbtq2CgoIuvsBqBr755htLkpWXl+e1fdasWdaQIUPOW79w4UJLEjdu3Lhx49akt/Ly8kv2q1m8kvbV3LlzNXPmTPt+bW2tTpw4ofbt21/6/3gug8fjUXx8vA4dOiSn09nQUX+0uE4/jGt0ebhOl4frdHka+zq1bdv2kvubRaQ7dOigkJAQlZaWem0vLS1VbGzseesdDoccDofXtsjIyEadyel08h/CZeA6/TCu0eXhOl0ertPl8dd1ahY/OBYeHq6kpCRt377d3lZbW6vt27fL5XIFcDIAAC6uWbySlqSZM2dq4sSJGjx4sIYMGaJVq1bp9OnTeuCBBwI9GgAAF9RsIn333Xfr2LFjWrBggdxutwYOHKitW7cqJibGr3M4HA4tXLjwvLfT4Y3r9MO4RpeH63R5uE6Xx9/XKciyLMsvzwQAAHzSLD6TBgDgSkSkAQAwFJEGAMBQRBoAAEMR6Sbg61divvLKK+rTp49atGih/v37a8uWLX6aNLB8uU7PP/+8hg8frnbt2qldu3ZKTk5uFl81Wt+vV924caOCgoI0duzYph3QEL5ep7KyMqWlpSkuLk4Oh0O9evVqFv/d+XqdVq1apd69e6tly5aKj49Xenq6zp4966dp/e+9997T7bffrk6dOikoKEivv/76Dz4mJydHgwYNksPhUM+ePZWZmdm4QzXiX5ENy7I2btxohYeHW2vXrrX27dtnPfjgg1ZkZKRVWlp6wfUffvihFRISYi1dutTav3+/NX/+fCssLMzas2ePnyf3L1+v07333mtlZGRYu3fvtg4cOGDdf//9VkREhPXPf/7Tz5P7j6/XqE5xcbH1k5/8xBo+fLh1xx13+GfYAPL1OlVUVFiDBw+2xowZY33wwQdWcXGxlZOTYxUWFvp5cv/y9Tq99NJLlsPhsF566SWruLjY2rZtmxUXF2elp6f7eXL/2bJlizVv3jzr1VdftSRZr7322iXXf/XVV1arVq2smTNnWvv377eeeuopKyQkxNq6dWujzUSkG9mQIUOstLQ0+35NTY3VqVMna8mSJRdc/4tf/MJKTU312jZ06FDr17/+dZPOGWi+Xqfvq66uttq2bWutX7++qUYMuPpco+rqauu6666zXnjhBWvixInNItK+Xqdnn33W6t69u1VZWemvEY3g63VKS0uzRo0a5bVt5syZ1vXXX9+kc5riciI9e/Zsq1+/fl7b7r77bislJaXR5uDt7kZU95WYycnJ9rZLfSWmJOXn53utl6SUlJSLrv8xqM91+r7vvvtOVVVVioqKaqoxA6q+12jx4sWKjo7W5MmT/TFmwNXnOr3xxhtyuVxKS0tTTEyMrr76av3pT39STU2Nv8b2u/pcp+uuu04FBQX2W+JfffWVtmzZojFjxvhl5iuBP/78bjZ/45g/HD9+XDU1Nef9LWYxMTE6ePDgBR/jdrsvuN7tdjfZnIFWn+v0fXPmzFGnTp3O+w/kx6I+1+iDDz7Qiy++qMLCQj9MaIb6XKevvvpKO3bs0Pjx47VlyxZ98cUX+s1vfqOqqiotXLjQH2P7XX2u07333qvjx4/rhhtukGVZqq6u1tSpU/Wf//mf/hj5inCxP789Ho/OnDmjli1bNvg5eCWNK87jjz+ujRs36rXXXlOLFi0CPY4RTp48qQkTJuj5559Xhw4dAj2O0WpraxUdHa3nnntOSUlJuvvuuzVv3jytWbMm0KMZJScnR3/605/0zDPPaNeuXXr11VeVlZWlxx57LNCjNSu8km5Evn4lpiTFxsb6tP7HoD7Xqc6yZcv0+OOP65133tGAAQOacsyA8vUaffnll/r66691++2329tqa2slSaGhoSoqKlKPHj2adugAqM+/S3FxcQoLC1NISIi9rW/fvnK73aqsrFR4eHiTzhwI9blOjz76qCZMmKApU6ZIkvr376/Tp0/roYce0rx58xQczGu8i/357XQ6G+VVtMQr6UZVn6/EdLlcXuslKTs7+0f9FZr1/erQpUuX6rHHHtPWrVs1ePBgf4waML5eoz59+mjPnj0qLCy0bz/72c80cuRIFRYWKj4+3p/j+019/l26/vrr9cUXX9j/EyNJf//73xUXF/ejDLRUv+v03XffnRfiuv+xsfjKB0l++vO70X4EDZZl/e+vOTgcDiszM9Pav3+/9dBDD1mRkZGW2+22LMuyJkyYYP3ud7+z13/44YdWaGiotWzZMuvAgQPWwoULm82vYPlynR5//HErPDzc+stf/mIdOXLEvp08eTJQp9DkfL1G39dcfrrb1+tUUlJitW3b1po2bZpVVFRkbd682YqOjrb+8Ic/BOoU/MLX67Rw4UKrbdu21p///Gfrq6++st5++22rR48e1i9+8YtAnUKTO3nypLV7925r9+7dliRrxYoV1u7du61//OMflmVZ1u9+9ztrwoQJ9vq6X8GaNWuWdeDAASsjI4NfwboSPPXUU1ZCQoIVHh5uDRkyxProo4/sfTfddJM1ceJEr/WbNm2yevXqZYWHh1v9+vWzsrKy/DxxYPhynbp06WJJOu+2cOFC/w/uR77+u3Su5hJpy/L9OuXl5VlDhw61HA6H1b17d+uPf/yjVV1d7eep/c+X61RVVWUtWrTI6tGjh9WiRQsrPj7e+s1vfmN9++23/h/cT959990L/jlTd10mTpxo3XTTTec9ZuDAgVZ4eLjVvXt3a926dY06E19VCQCAofhMGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGkCTWbRokQYOHGjfv//++zV27NiAzQNcafgWLAB+s3r1aq8vZxgxYoQGDhyoVatWBW4owGBEGoDfREREBHoE4IrC291AM3X69Gndd999atOmjeLi4rR8+XKNGDFCM2bMkCQFBQXp9ddf93pMZGSkMjMz7ftz5sxRr1691KpVK3Xv3l2PPvqoqqqqLvqc577dff/99ys3N1erV69WUFCQgoKCVFxcrJ49e2rZsmVejyssLFRQUJC++OKLxjh14IpBpIFmatasWcrNzdVf//pXvf3228rJydGuXbt8Okbbtm2VmZmp/fv3a/Xq1Xr++ee1cuXKy3rs6tWr5XK59OCDD+rIkSM6cuSIEhISNGnSJK1bt85r7bp163TjjTeqZ8+ePs0HXOmINNAMnTp1Si+++KKWLVumm2++Wf3799f69etVXV3t03Hmz5+v6667Tl27dtXtt9+uRx55RJs2bbqsx0ZERCg8PFytWrVSbGysYmNjFRISovvvv19FRUX6+OOPJUlVVVXasGGDJk2a5PN5Alc6PpMGmqEvv/xSlZWVGjp0qL0tKipKvXv39uk4L7/8sp588kl9+eWXOnXqlKqrq+V0Ohs0W6dOnZSamqq1a9dqyJAhevPNN1VRUaGf//znDToucCXilTSACwoKCtL3v27+3M+b8/PzNX78eI0ZM0abN2/W7t27NW/ePFVWVjb4uadMmaKNGzfqzJkzWrdune6++261atWqwccFrjS8kgaaoR49eigsLEw7d+5UQkKCJOnbb7/V3//+d910002SpI4dO+rIkSP2Yz7//HN999139v28vDx16dJF8+bNs7f94x//8GmO8PBw1dTUnLd9zJgxat26tZ599llt3bpV7733nk/HBX4siDTQDLVp00aTJ0/WrFmz1L59e0VHR2vevHkKDv6/N9dGjRqlp59+Wi6XSzU1NZozZ47CwsLs/VdddZVKSkq0ceNGXXvttcrKytJrr73m0xxdu3bVzp079fXXX6tNmzaKiopScHCw/dn03LlzddVVV8nlcjXauQNXEt7uBpqpJ554QsOHD9ftt9+u5ORk3XDDDUpKSrL3L1++XPHx8Ro+fLjuvfdePfLII15vOf/sZz9Tenq6pk2bpoEDByovL0+PPvqoTzM88sgjCgkJUWJiojp27KiSkhJ73+TJk1VZWakHHnig4ScLXKGCrO9/6ASg2TLpbwB7//33dfPNN+vQoUOKiYkJ9DhAQPB2NwCjVFRU6NixY1q0aJF+/vOfE2g0a7zdDcAof/7zn9WlSxeVlZVp6dKlgR4HCCje7gYAwFC8kgYAwFBEGgAAQxFpAAAMRaQBADAUkQYAwFBEGgAAQxFpAAAMRaQBADDU/wOtDldW1UEYoAAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import seaborn as sns\n", "sns.displot(data.quality, kde=False)" @@ -864,23 +405,12 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": null, "id": "2f886882-1fd1-4633-af8b-602dc90d369a", "metadata": { "tags": [] }, - "outputs": [ - { - "data": { - "image/png": "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kbu7u6PTQw1Up04du8YBriwsLEwxMTGKjY3VhAkTjPaAgADFxMQoLCzMgdnB0Tw8PLR06VK9+uqrxjn8uuuuU8uWLR2dGmqpwMBASdIHH3ygDRs2KCMjw+jz9/fXDTfcYBMHAKhe27dvV7du3SRJy5Yt03XXXae1a9fqu+++09ixYynGAwBQTS65GD9z5kw1aNDA2D5fMR4AUPXq1q1rM/q0qKjIpgh/dhxwPvXq1dMjjzzi6DRQSxw/ftyucYCrCwsLU8+ePcuMQGVEPEq1bdtWbdu2dXQacAERERGaM2eOvvzyS/Xo0UOTJ082Zuz46KOP9NVXX8lsNisiIsLRqQKASyoqKpKnp6ck6fvvv9egQYMkSe3bt1d6erojUwMAwKVccjF+1KhRxvaDDz5oj1wAAJfh3nvv1cyZMysVB1zIb7/9ptTUVBUWFtq0l355ByorKyvLrnEAzkxZX7qUCHC2gwcP6ssvvyz3HD5jxgwHZYXaymKxyMvLS3l5edq1a5f27dunpk2bat++fdq1a5ekM0tkcbMQADhGhw4dFBcXpzvuuEOrVq3Sq6++KunM8iGNGjVycHYAALgOu6wZ/80338hisahv37427d99952sVqvCw8Pt8TIAgPNo3LixXePgmvbt26c777xTv/76q0wmk0pKSiTJmAHHarU6Mj3UQKX/huwVBwAo3+rVqzVo0CC1bt1aO3fuVMeOHbV//36VlJTo+uuvd3R6qIWSk5OVl5enPn366Mcff9T06dONPovFoj59+uj7779XcnIyNxABgAP84x//0J133qm33npLo0aNUqdOnSRJX375pTF9PQAAqHpmexzkhRdeKPfifHFxsV544QV7vAQA4AI++eQTu8bBNT3xxBMKCgrSX3/9pbp162rHjh1KTExU165dtWbNGkenhxrIbK7cx83KxgE4c2PU1q1btXr1am3dupUbpSBJmjhxop555hn9+uuv8vLy0meffaY///xTN910k4YOHero9FALZWZmSpK6d+9eZoRlo0aN1L17d5s4AED16t27t44ePaqjR49q4cKFRvsjjzyiuLg4Y3/t2rUqKChwRIoAALgEu4yM/+OPP3TttdeWaW/fvr327Nljj5cAAFxARkaGsd2xY0ft3r1bRUVFcnd3V9u2bbV9+/YyccC5kpKS9MMPP6hx48Yym80ym83q1auXpk2bpscff1xbt251dIqoYUqnr61MHIALS0xMVGxsrM353N/fX+PHj1dYWJgDM4Oj/f777/rnP/8pSXJzc9OpU6dUv359vfLKK4qIiNC4ceMcnCFqGz8/P0nS66+/rtDQUEVHRxtrxsfHx+v111+3iQMAVD+LxSJfX1+btlatWtnsh4eHa9u2bWrdunU1ZgYAgOuwyxAkHx8f7du3r0z7nj17VK9evUofJzExUQMHDlRgYKBMJpO++OILm/6SkhJNmTJFAQEBqlOnjvr06aM//vjjctMHgFqh9C5ms9ms7du3q7CwUCUlJSosLNT27duNaca52xnnY7Va1aBBA0lnljRIS0uTJLVs2dJY+xO4GB4eHnaNA1xZYmKioqOj1bp1a82ePVvffPONZs+erdatWys6OlqJiYmOThEOVK9ePWOd+ICAAO3du9foO3r0qKPSQi3WoUMHWSwWNWzYUK+88oo6dOigunXrqkOHDnrllVfUsGFDWSwWdejQwdGpAgDOgyXDAACoWnYpxkdEROjJJ5+0+bK/Z88ePf300xo0aFClj5Obm6tOnTpp9uzZ5fa/+eabevfddxUXF6f169erXr166tu3r/Lz8y/7PcCxLBaLXeMAV1Q6NWRxcbGkMzdKNWzYUD4+PpL+9+Xq3CkkgbN17NhRv/zyi6QzU46++eabWrt2rV555RXuksclcXd3t2sc4KqsVqtiY2MVGhqqKVOm6LffftO8efP022+/acqUKQoNDdWcOXOYst6F9ejRQz///LMkqX///nr66af12muvKTIyUj169HBwdqiNduzYIavVquPHj2vKlCnasWOH8vLytGPHDk2ZMkXHjx+X1WrVjh07HJ0qAAAAADiMXaapf/PNN9WvXz+1b99eV155pSTp4MGDuvHGG/X2229X+jjh4eEKDw8vt6+kpESzZs3SpEmTFBERIUn68MMP1bRpU33xxRcaMWLE5b8ROEz9+vV14sSJSsUBKJ+/v78OHDhg7Ff0O+Xv719dKaEGmjRpknJzcyVJr7zyigYMGKAbb7xRjRo10tKlSx2cHWqiys7GwawdwPklJycrIyNDHTt21B133GFTdI+Li9PNN9+s9PR0JScnKyQkxIGZwlFmzJihnJwcSVJMTIxycnK0dOlSXX311ZoxY4aDs0NtVLoW/EsvvaQFCxZowoQJRl9AQIBeeukl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UJMmTcodTVnKZDJd1A2Z3bt31w033KD33ntP0pl/Y82bN9djjz2mF1544YLPnzVrlqZMmaL09HTVq1dP0pmR8VlZWTbF24vBOd75bN26tVJrDs+cOVMhISHVkBFQMy1dulRz5syRh4eHzY1NpUrbx40bp+HDhzsgQ5yrppyTfH19bfaLioqUl5cnDw8P1a1bV5mZmRc8xldffSWLxaKrr75aJSUl+uCDD/TWW29p69at6tChg8aNG6evv/5aixcvlo+Pjx599FGZzeaLWuZOqjk/U1dVWFioFStWKC0tTYGBgYqIiODmIAC1VlWcky55ZHxISEilp50/e9oyAEDV6NGjR6WK8T169KiGbFCTdO7cWSaT6YIz2FzshXwAgP0kJycrIyNDkydPLlN0NZvNGjlypCZMmKDk5GSKXi7k7HWFz96+HIWFhdq8ebMmTpxotJnNZvXp00dJSUmVOsaCBQs0YsQIoxBfas2aNWrSpIl8fX11yy23aOrUqWrUqFG5xygoKFBBQYGxn52dfQnvBlWpMkWci4kDXNWvv/4q6czfX5PJpKuvvlqBgYFKS0vTH3/8YRTof/31V4rxuCjHjx8v0/bHH39o3LhxevbZZyt1jHPXln/ttdc0Z84crVu3TldeeaUWLFigTz75RLfccoskadGiRbrmmmu0bt06rj/VIqVT1gMALs0lF+MHDx5sbOfn5ys2NlbXXnutse7MunXrtGPHDo0fP/6ykwQAXNhff/1l1zi4jpSUFEenAAC4gNJiVlBQkKxWq5KTk5WZmSk/Pz8FBwcrKCjIJg6upaioSP369VNcXJyuvvrqyzrW0aNHZbVay0wv27RpU+3cufOCz9+wYYO2b9+uBQsW2LT369dPQ4YMUVBQkPbu3asXX3xR4eHhSkpKKnc2h2nTpikmJuay3guq1qZNmyodd+utt1ZxNkDN5e7ubrN/9pIPZw+EOjcOuBRXX3213njjDd13332VOq+fzWq1KiEhQbm5uQoNDdXmzZtVVFSkPn36GDHt27dXixYtlJSUdN5iPDfdAQBcySUX46Ojo43thx56SI8//rheffXVMjF//vnnpWcHAKi0jRs32jUOrqNly5aOTgEAcAF+fn6SpOXLl+urr75SRkaG0efv768BAwbYxMG1uLu7X9SyM1VpwYIFuu6669StWzeb9hEjRhjb1113nYKDg9WmTRutWbOm3ELtxIkTFRUVZexnZ2erefPmVZc4Ltq///1vm30vLy9jOu38/HybuOeff7660wNqjMOHDxvbDRs21G233aZmzZrp0KFDWrVqlTG6+ew44HK4ubkpLS2t0vG//vqrQkNDlZ+fr/r162v58uW69tprtW3bNnl4eKhhw4Y28U2bNrX5rFoebroDALiSSy7Gny0hIaHcO6Lvu+8+de3aVQsXLrTHywAAzuPc6cMtFovq1KmjU6dO2fQxzTjO9eWXXyo8PFzu7u768ssvzxs7aNCgasoKAHC24OBgNWzYUPPmzVNoaKgmT56soKAgY534+fPny9fXV8HBwY5OFQ5y3333acGCBXrjjTcu6ziNGzeWxWIpU/Q5fPiw/P39z/vc3NxcLVmyRK+88soFX6d169Zq3Lix9uzZU24x3tPTU56enheXPBwqPz/fpggPoHLy8vKM7ePHj2vZsmUXjAMq49zv9yUlJUpPT9d7772nnj17Vvo47dq107Zt23TixAl9+umnGjVqlH766afLyo2b7gAArsQuxfg6depo7dq1ZabDW7t2rby8vOzxEgCAC/Dz89PRo0clSfXr19ff//53hYaGKikpSe+//75ycnKMOOBsgwcPVkZGhpo0aWKzDM25WDMeAJxbSUmJo1OAA50+fVoLFy7U999/ry5dupRZr33GjBmVOo6Hh4e6dOmi1atXG58LiouLtXr1aj366KPnfW5CQoIKCgp03333XfB1Dh48qGPHjikgIKBSeQEAgItz7vd7k8mkK664QrfccoumT59e6eN4eHjoqquukiR16dJFGzdu1DvvvKPhw4ersLBQWVlZNqPjK3MDHzfdAQBciV2K8U8++aTGjRunLVu2GFPRrV+/XgsXLtTkyZPt8RIAgAs4ePCgsZ2Tk1PhF6uz4wDpzAX28rYBAM4jOTlZWVlZevjhh/XVV19pwoQJRl9AQIAefvhhzZs3T8nJyQoJCXFgpnCU7du36/rrr5ckY63hSxUVFaVRo0apa9eu6tatm2bNmqXc3FyNHj1akvTAAw+oWbNmmjZtms3zFixYoMGDB6tRo0Y27Tk5OYqJidFdd90lf39/7d27V88995yuuuoq9e3b97JyheNYLJZK3ahpsViqIRug5urQoYP2799fqTjgYlTV9/vi4mIVFBSoS5cucnd31+rVq3XXXXdJ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tkzSmSnIUlNT9fzzzzOlLQAANYjVatXMmTO1bNkypaamlrl4mpmZ6aDMAMC1JScnKyMjQ4cPH1ZoaKgmT56soKAgpaSkKD4+XklJSSopKVFycrJCQkIcnS6qSXJysjp27Ciz2awTJ07o119/rTCWEZUA4JzKm220orgnn3yyapNBrRIXF6dnnnlG9957r3GTh5ubm8aMGaO33nrLwdkBAOA67FKMnz59uu6++241adJEp06d0k033aSMjAyFhobqtddes8dLAACAahATE6P58+fr6aef1qRJk/TSSy9p//79+uKLLzRlyhRHpwcALuvo0aOSpG7dumnq1Kkym82SpA4dOmjq1KmaOHGi1q9fb8TBNXTu3FkZGRlq0qSJOnfuXOEa3iaTSVar1QEZAgAu5ODBg5LO/K0+e1S8JBUVFRl/20vjgMqqW7euYmNj9dZbb2nv3r2SpDZt2qhevXoOzgwAANdil2K8j4+PVq1apbVr1+qXX35RTk6Orr/+evXp08cehwcAANUkPj5e8+bN0x133KGXX35Z99xzj9q0aaPg4GCtW7dOjz/+uKNTBACXlJWVJUm68cYbjUJ8KbPZrF69emn9+vVGHFxDSkqKseRHSkqKg7MBAFwKT09PSTJupmrVqpUeeeQRzZ07V/v37zfaS+OAi1WvXj1myMFlKSws1IoVK5SWlqbAwEBFRETIw8PD0WkBQI1hl2L8zp071b59e/Xs2VM9e/a06Vu5cqX69u1rj5cBAABVLCMjQ9ddd50kqX79+jpx4oQkacCAAZo8ebIjUwMAl9awYUNJ0n/+8x/179/fpiBfXFysn3/+2SYOrqFly5bG9ieffKKmTZsqMjLSJmbhwoU6cuSInn/++epODwBQCcHBwVq7dq0k6dNPP1Xjxo0lSX/729909OhR3X333UYccCFDhgzR4sWL5e3tfcF14T///PNqygo1WVxcnBISEmxmWYqLi9PQoUM1duxYB2YGADWHXYrx119/vd566y1NmDDBaCsoKNDTTz+t+fPnKz8/3x4vAwAAqtiVV16p9PR0tWjRQm3atNF3332n66+/Xhs3bmQkBgA4UOmF+fXr1+vZZ59VSkqK8vLyVLduXQUFBWnz5s02cXA977//vj755JMy7R06dNCIESMoxgOAk1qyZImxPWLECLVq1UpeXl7Kz8/X/v37beKGDx/u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Hq5HHnlEJ06caMynAgAAAAAAAACAV7BnPAAAqLeNGzcqOTlZV155pU6cOKHHH39cN9xwg3bs2KHWrVu7+40fP14zZ850H7dq1cr9sdPp1LBhwxQREaGPPvpI+/fv16hRoxQUFKQ5c+Y06vMBAAAAAAAAAKC+KMYDAIB6W79+vcfx4sWLFR4erk2bNikhIcHd3qpVK0VERNR5j/fee087duzQ+++/L6vVqri4OD355JOaOnWqnnjiCQUHBzfocwAAAAAAAAAAwJtYph4AAHhdRUWFJCksLMyjfenSperQoYMuv/xypaam6ujRo+5zRUVF6t27t6xWq7stMTFRlZWV2r59e+MEBwAAAAAAAADAS5gZDwAAvMrlcmnKlCkaNGiQLr/8cnf7nXfeqc6dOysqKkrFxcWaOnWqdu7cqTfffFOSZLfbPQrxktzHdru9zs/lcDjkcDjcx5WVld5+OgAAAAAAAAAAnBeK8QAAwKuSk5P15Zdf6oMPPvBonzBhgvvj3r17KzIyUtddd52+/fZbXXLJJef1uTIzM5WRkVGvvAAAAAAAAAAANASWqQcAAF4zefJkrVmzRv/85z910UUXnbHvgAEDJEnffPONJCkiIkKlpaUefU4en26f+dTUVFVUVLgf33//fX2fAgAAAAAAAAAAXkExHgAA1FtNTY0mT56st956S//4xz8UExPzq9ds3bpVkhQZGSlJstls2rZtmw4cOODus2HDBoWGhqpnz5513sNsNis0NNTjAQAAAAAAAACAL2CZegAAUG/JyclatmyZVq9erbZt27r3eLdYLGrZsqW+/fZbLVu2TDfddJMuuOACFRcX66GHHlJCQoJiY2MlSTfccIN69uypu+++W88884zsdrvS0tKUnJwss9ls5NMDAAAAAAAAAOCcMTMeAADUW25urioqKjR48GBFRka6HytWrJAkBQcH6/3339cNN9yg7t27649//KNuu+02vf322+57mEwmrVmzRiaTSTabTXfddZdGjRqlmTNnGvW0AAAAAAAAAAA4b8yMBwAA9VZTU3PG8506ddLGjRt/9T6dO3fWunXrvBULAAAAjcDpdKq4uFhlZWUKCwtTbGysTCaT0bEAAAAAwHAU4wEAAAAAAHBeCgsLlZOT496mSJIiIiI0adIkJSQkGJgMAAAAAIzHMvUAAAAAAAA4Z4WFhUpPT1eX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4u7TvXt3RUdHq6ioSJJUVFSk3r17y2q1uvskJiaqsrJS27dvr/PzOBwOVVZWejwAAICUkpKi5ORkrVixQjU1Nfr00081e/Zspaam6tFHHzU6HpqAs90Lnj3jAQAAADRnFOPhE5xOp3JycmSz2TRt2jRt2LBBM2bM0IYNGzRt2jTZbDbl5uayZD0AeJHL5arz5+q///1vtW3btl73nTJligYNGqTLL79ckmS32xUcHKx27dp59LVare7VUOx2u0ch/uT5k+fqkpmZKYvF4n506tTpvHMDANCU3HvvvXr66aeVlpamo0eP6s4771Rubq5eeOEF3XHHHWd9n9zcXMXGxio0NFShoaGy2Wx655133OePHTum5ORkXXDBBWrTpo1uu+02lZaWetyjpKREw4YNU6tWrRQeHq5HHnlEJ06c8NpzhTFO/n9d7969tWbNGs2bN0/Tp0/XvHnztGbNGvXu3dujHwAAAAA0RyxTD59QXFwsu92u8PBwDRs2zN3++eefa9WqVYqNjdX+/ftVXFzM8nYA4CU33HCDsrKyNH/+fElSQECAjhw5ovT0dN10003nfd/k5GR9+eWX+uCDD7wV9bRSU1OVkpLiPq6srKQgDwDA/y8pKUlJSUk6evSojhw5ovDw8HO+x0UXXaSnnnpKl156qWpqarRkyRINHz5cW7ZsUa9evfTQQw9p7dq1WrlypSwWiyZPnqxbb71VH374oaSf33g9bNgwRURE6KOPPtL+/fs1atQoBQUFac6cOd5+yjCIyWTy+F3d5XIZmAYAAAAAfAfFePiEk8vWFRcX13n+ZDvL2wGA9zz//PNKTExUz549dezYMd155536+uuv1aFDB/35z38+r3tOnjxZa9asUWFhoS666CJ3e0REhKqrq1VeXu4xO6q0tFQRERHuPp9++qnH/U7OrDvZ55fMZrPMZvN5ZQUAoLlo1aqVWrVqdV7X3nLLLR7Hs2fPVm5urj7++GNddNFFevXVV7Vs2TJde+21kqRFixapR48e+vjjjzVw4EC999572rFjh95//31ZrVbFxcXpySef1NSpU/XEE0/U2i4H/qO8vFyStG3bNqWlpSkpKUkxMTHavXu3li5dqm3btnn0AwAAAIDmiGI8fEKbNm3cH5tMJt1+++266aabtG7dOq1YscK9jPKp/QAA9XPRRRfpiy++0PLly1VcXKwj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1axZU5999pk6d+7s5Jhwd3369NGiRYv06aefqmPHjoqKilJYWJhSUlK0YsUKffrppzKZTOrTp4/RUQGXl5iYqNjY2GI3tYwdO1YREREGJoOrefXVV/XQQw9p06ZN9hVIkpKSdOzYMX3++ecGpwMAAM5Qs2ZN3X777UbHAAAAAACgSrquYvwHH3ygJ554QpK0fv16paSk6Oeff9aKFSs0ZcoUbdmyxakh4f7MZrO8vb117tw5HThwQEeOHFFAQICOHDmiAwcOSJJq1KjBzF7gKhITExUdHS2LxeJwU0t8fLyio6MVExNDQR529957rw4ePKiFCxfq559/liT169dPY8eOZSUSAAAqoX79+mn58uXy8fFRv379rtj3o48+qqBUAAAAAABUXddVjP/9998VGBgoSfr888/Vv39/NWvWTMOGDdP8+fOdGhBVQ3Jyss6dO6euXbvqm2++0dy5c+3nzGazunTpooSEBCUnJ6tNmzYGJgVcl81mU2xsrCwWi2bOnCmTySRJatGihWbOnKmpU6dq0aJF6tSpEze2wC44OFizZs0yOgYAAHACX19feXh42B8DAAAAAABjXVcxPiAgQPv371dQUJA2btyoRYsWSZLOnTtHgQfXJSMjQ5IUGRmpSZMmad26dTpx4oSCg4PVp08f5efnKyEhwd4PQHHJycmyWq2KioqyF+KLmEwmDRo0SOPGjeOmliouOTlZLVu2lMlkUnJy8hX7hoeHV1AqAADgDMuWLSvxMQAAAAAAMMZ1FeOHDh2qv//97woKCpKHh4e6du0qSdq2bZuaN2/u1ICoGvz9/SVJKSkpatGihfr37+9w/pdffnHoB6C4optVwsLCSjxf1M5NLVVb69atZbVa1aBBA7Vu3VoeHh4qLCws1s/Dw0M2m82AhAAAAAAAAAAAuIfrKsZPnz5dLVu21LFjx9S/f395eXlJuric+AsvvODUgKgawsPDFRgYqPj4eMXExGjv3r3KyMiQv7+/WrZsqfj4eAUFBTFLE7iCv97U8lcpKSkO/VA1paSkqH79+vbHAADAfbRp08a+TP3V7Nq1q5zTAAAAZ/jmm2903333GR0DAABcp+sqxkvS3/72N0nShQsX7G2DBw8ueyJUSWazWWPHjtW0adPUq1cv5eTk2M95pBILDQABAABJREFUeXkpJydHM2bMYBsE4Aouvanl0j3jJamgoICbWiBJCg0NLfExAACo/Pr27Wt/fOHCBcXGxuq2226TxWKRJG3dulX79u3T2LFjDUoIAACuVffu3dWoUSMNHTpUgwcPVuPGjY2OBAAArsF1FeNtNpteeuklxcXFKT09XQcPHlSTJk0UFRWlG2+8UcOHD3d2TlQhlxbiSzoGULKim1qio6M1depUDRo0SGFhYUpJSVF8fLySkpIUExPDTS1V3Kefflrqvg8//HA5JgEAAM4WHR1tfzxixAg988wzevHFF4v1OXbsWEVHAwAA1+m3337TihUr9O677yomJkb333+/hg8frr59+8rT09PoeAAA4Co8CkvaKPYqZsyYoXfffVczZszQyJEjtXfvXjVp0kRr1qzRvHnzlJSUVB5ZnSI7O1u+vr7KysqSj4+P0XHwv2w2mx599FFlZmaqevXqysvLs58rOq5bt64++OADConAVSQmJio2NlZWq9XeFhQUpDFjxigiIsLAZPgrI8akS1dMkFRsz/hLl7atjHvGM84DAFyF0WOSr6+vduzYoaZNmzq0//LLL2rXrp2ysrIqPFNZGP3vias7ePCgRo0apcWLF6tZs2ZGxwGAcmPkmLRr1y4tW7ZM//nPfyRJjz/+uIYPH65WrVpVaA5nY5wHALiK8hiTrmtm/HvvvafFixerS5cuGj16tL29VatW+vnnn50SDFXLnj17lJmZKUlq27atOnToYF+eftu2bdq6datOnz6tPXv2qG3btsaGBVxcRESEOnXqpOTkZGVkZMjf31/h4eHcyAJJF7csKLJp0yY9//zzeumll+zL1yYlJWnq1Kl66aWXjIoIAACcoEaNGtqyZUuxYvyWLVvk7e1tUCoAAFAWd9xxhwIDA3XDDTfo5Zdf1tKlSxUbGyuLxaK4uDi1aNHC6IgAAOAvrqsY/9tvv+nmm28u1l5QUOAwoxkorV27dkmSGjVqpF9//VVbt261nwsMDFSjRo10/Phx7dq1i2I8UApms1lt2rQxOgZc3LPPPqu4uDjdfffd9rZu3bqpZs2aGjVqlH766ScD0wEAgLJ49tlnNWbMGO3atUvt27eXJG3btk1Lly5VVFSUwekAAMC1yMvL07p167R06VJ99dVXateunRYsWKDHHntMp06d0tSpU9W/f3/t37/f6KgAAOAvrqsYf9ttt+m///2vQkNDHdo/+OADij+4LidPnpQkHT9+XHfddZeioqIc9rr+/vvvHfoBAMru8OHD8vPzK9bu6+urX3/9tcLzAAAA53nhhRfUpEkTzZ8/XytXrpQk3XrrrVq2bJn+/ve/G5wOAACU1tNPP63//Oc/Kiws1JNPPqlXX31VLVu2tJ+vVauWXnvtNQUHBxuYEgAAXM51FeOnTZumwYMH67ffflNBQYE++ugjHThwQO+9954+++wzZ2dEFVC/fn1JUu3atRUdHa39+/crKSlJ/v7+io6O1qOPPqozZ87Y+wEAyu7OO+9UZGSkVqxYoYCAAElSenq6/vnPf9pn0AEAgMrr73//+1UL7//5z3/08MMPq1atWhWUCgAAXIv9+/frrbfeUr9+/eTl5VVin3r16umbb76p4GQAAKA0rqsY36dPH61fv14zZsxQrVq1NG3aNN1xxx1av369HnjgAWdnRBXg6+srSTpz5ox69+6t3Nxc+zlPT0/7cVE/AEDZLV26VI888ohCQkLUuHFjSdKxY8fUtGlTffLJJ8aGAwAAFeL//b//pw4dOqhJkyZGRwEAACWIjo7WXXfdpWrVHN/Kz8/P1/fff6+IiAhVq1ZN9957r0EJAQDAlVxXMV6S7rnnHn311VfOzIIqzN/f3/44Pz/f4dylx5f2AwCUzc0336zk5GR99dVX+vnnnyVdXL62a9eu8vDwMDgdAACoCIWFhUZHAAAAV3DfffcpLS1NDRo0cGjPysrSfffdJ5vNZlAyAABQGtddjAec6dIie7Vq1Rxmxl96TDEeAJzLw8NDDz74oB588MHL9rn99tv1+eef22fPAwAAAACAilFYWFjiDfN//PEH28wAAFAJlLoYX7du3VLPksvIyLjuQKjaQkJCdOHCBZ08edLeVrduXXl5eSk1NdXAZABQdf3666/Ky8szOgYAAAAAAFVGv379JF28iX7IkCEO+8XbbDYlJyfrrrvuMioeAAAopVIX4+fNm2d//Mcff2jmzJnq1q2bLBaLJCkpKUlffPGFoqKinB4S7i8zM1PSxb2KO3bsqMcee0xeXl7KycnR9u3btXXrVod+AAAAAAAAAOCufH19JV2cGV+nTh3VqFHDfs7T01MdO3bUyJEjjYoHAABKqdTF+MGDB9sfP/roo5oxY4bGjx9vb3vmmWe0YMECbdq0SRMmTHBuSri9ouXnR4wYofXr1yspKcl+LigoSCNGjNDbb7/NMvUAAAAAAAAA3N6yZcskSTfeeKMmTpzIkvQAAFRSpuv5pC+++ELdu3cv1t69e3dt2rSpzKFQ9YSHhyswMFD79u3TihUr9MYbbygqKkpvvPGG3nvvPe3bt09BQUEKDw83OioAoASJiYnq3bu3goOD5eHhoU8++cTh/JAhQ+Th4eHw8de/JTIyMjRo0CD5+PjIz89Pw4cP15kzZyrwWQAA4B5sNpsSExNLtbJYaGioqlevXv6hAABXlZGRoSFDhqh3794aMmQIW4FCkhQdHU0hHgCASuy6ivE33HCD1q1bV6x93bp1uuGGG8ocClWP2WzW2LFjlZSUpOjoaHl6espiscjT01PR0dFKSkrSmDFjZDabjY4KACjB2bNn1apVKy1cuPCyfbp37660tDT7x3/+8x+H84MGDdK+ffv01Vdf6bPPPlNiYqJGjRpV3tEBAHA7ZrNZDz74oE6fPn3Vvnv37lXjxo0rIBUA4Er69eunfv366ddff9Wff/6pX3/91d6GqueOO+6wj+Nt2rTRHXfccdkPAADg2kq9TP2lYmJiNGLECG3evFkdOnSQJG3btk0bN27U22+/7dSAqDoiIiIUExOj2NhYjRs3zt4eFBSkmJgYRUREGJgOAHAlPXr0UI8ePa7Yx8vLS4GBgSWe++mnn7Rx40b98MMPateunSTprbfeUs+ePfXaa68pODjY6ZkBAHBnLVu21JEjRxQWFmZ0FADAVfTr1++ys+AzMjLUr18/ffTRRxWcCkbq06ePvLy8JEl9+/Y1NgwAACiT6yrGDxkyRLfeeqvefPNN+x+Ct956q7777jt7cR64HhEREerUqZOSk5OVkZEhf39/hYeHMyMeAJwsLy9P3bt3V1xcnJo2bXrFvv/+978VEBBQ5q+5efNmNWjQQHXr1tX999+vmTNn2lfUSUpKkp+fn70QL0ldu3aVyWTStm3b9Mgjj5R4zZycHOXk5NiPs7Ozy5wT5cdmszHGA0AFmTlzpiZOnKgXX3xRbdu2Lba8rY+Pj0HJAACXysjIsBfi27dvr8GDByssLEwpKSl69913tX37dnsff39/g9OiokRHR5f4GAAAVD7XVYyXpA4dOig+Pt6ZWQBJF5dUbNOmjdExAMCtVa9eXcnJyaXq+/jjj5f563Xv3l39+vVTWFiYDh8+rH/961/q0aOHkpKSZDabZbVa1aBBA4fPqVatmvz9/WW1Wi973dmzZysmJqbM+VD+EhMTFRsb6/D/MzAwUGPHjmX1GwAoBz179pQkPfzww/Lw8LC3FxYWysPDQzabzahoAIBLTJgwQZJUu3ZtvfzyyzKZLu4q2qJFC7388st6+OGHdebMGU2YMEHvvvuukVFhkGPHjsnDw0ONGjWSJG3fvl2rVq3SbbfdxtZuAABUAqUuxmdnZ9vvnL/arDPusAcAwPU98cQTeuedd/Tyyy+X+9caOHCg/fHtt9+u8PBw3XTTTdq8ebO6dOly3dedPHmyIiMj7cfZ2dnse+uCEhMTFR0dLYvFoqioKPtMn/j4eEVHR7MdDQCUg2+++cboCACAUjh58qQkadiwYfZCfBGTyaTBgwdr4cKF9n6oeh5//HGNGjVKTz75pKxWq7p27aqWLVsqPj5eVqtV06ZNMzoiAAC4glIX4+vWrau0tDQ1aNBAfn5+DnfWF+EOewAAKo/8/HwtXbpUmzZtKnH52tdff73cvnaTJk1Ur149HTp0SF26dFFgYGCxN5fy8/OVkZFx2X3mpYv70BftowfXZLPZFBsbK4vFopkzZzrM9Jk5c6amTp2qRYsWqVOnTixZDwBOdO+99xodAQBQCrVq1dL58+f15Zdfql+/fsXOf/XVV/Z+qJr27t2r9u3bS5Lef/993X777dqyZYu+/PJLjR49mmI8AAAurtTF+K+//tq+LxF32AMAUPnt3btXd9xxhyTp4MGDDudKuunOmY4fP64//vhDQUFBkiSLxaLMzEzt3LlTbdu2lXTxb4+CggJ16NChXLOgfCUnJ8tqtSoqKqrEmT6DBg3SuHHjlJyczDY1AOBEiYmJVzzPiiQA4BqeeeYZTZs2TT///LPOnDmj2rVr28+dOXPG/lrtmWeeMSoiDJaXl2e/CX3Tpk16+OGHJUnNmzdXWlqakdEAAEAplLoYX3RXfX5+vr799lsNGzbMvk8NAACofJx5c92ZM2d06NAh+3FKSor27Nkjf39/+fv7KyYmRo8++qgCAwN1+PBhTZo0STfffLO6desmSbr11lvVvXt3jRw5UnFxccrLy9P48eM1cOBABQcHOy0nKl5GRoYkKSwsrMTzRe1F/QAAztG5c+dibZfebMeKdgDgGjp16iSTyaSCggL16tVLt956q4YOHaply5bpp59+knTxJtZOnToZnBRGadGiheLi4vTQQw/pq6++0osvvihJOnHihG644QaD0wEAgKsxXb2Lo2rVqmnOnDnKz88vjzyAbDabdu/erYSEBO3evZs3iQCgEtixY4fatGljn9kcGRmpNm3aaNq0aTKbzUpOTtbDDz+sZs2aafjw4Wrbtq3++9//OiwxHx8fr+bNm6tLly7q2bOn7r77bi1evNiopwQnKVpZKSUlpcTzRe1F/QAAznH69GmHj5MnT2rjxo2688479eWXXxodDwDwv8xms6ZPn24//umnnzRp0iR7IV6Spk+fzpZOVdgrr7yif//73+rcubMee+wxtWrVSpL06aef2pevBwAArqvUM+Mvdf/99+vbb7/VjTfe6JQQCxcu1Jw5c2S1WtWqVSu99dZbl/1D4qOPPtJLL72kQ4cOKS8vT02bNtVzzz2nJ5980ilZYKzExETFxsbKarXa2wIDAzV27FiWUQQAJ7vvvvuuuBz9119/Xeprde7cWYWFhZc9/8UXX1z1Gv7+/lq1alWpvyYqh/DwcAUGBio+Pt5hz3hJKigoUHx8vIKCghQeHm5gSgBwP76+vsXaHnjgAXl6eioyMlI7d+40IBUAoCQRERGaMWOGFixYoJMnT9rbAwICNG7cON4Tq+I6d+6s33//XdnZ2apbt669fdSoUapZs6aByQAAQGlcVzG+R48eeuGFF/Tjjz+qbdu2qlWrlsP5on1rSmPNmjWKjIxUXFycOnTooHnz5qlbt246cOCAGjRoUKy/v7+/pkyZoubNm8vT01OfffaZhg4dqgYNGtiXukXllJiYqOjoaFksFkVFRSksLEwpKSmKj49XdHS0YmJiePEBAE7UunVrh+O8vDzt2bNHe/fu1eDBg40JBbdjNps1duxYRUdHa8qUKWrfvr28vLyUk5Oj7du3a+vWrYqJiWGmDwBUkICAAB04cMDoGACAv4iIiFCnTp2UnJysjIwM+fv7Kzw8nL+TIeni66pLC/GSnDZRDgAAlC+PwitNY7uMS2c0Fbugh8c1LSveoUMH3XnnnVqwYIGkizOkGjdurKefflovvPBCqa5xxx136KGHHrLvl3Ml2dnZ8vX1VVZWlnx8fEqdE+XLZrNp0KBBatKkSYmz5qZOnaqUlBStXLmSFyEA3IarjknTp0/XmTNn9Nprrxkd5Zq56r8ppLi4OK1du9bh70Sz2az+/ftr9OjRBiYDgPJh9JiUnJzscFxYWKi0tDS9/PLLys/P13fffVfhmcrC6H9PXN3Bgwc1atQoLV68WM2aNTM6DgCUm4oek9LT0zVx4kQlJCTo5MmTxValc4ctPhnnAQCuojzGpOuaGV9QUOCUL56bm6udO3dq8uTJ9jaTyaSuXbsqKSnpqp9fWFior7/+WgcOHNArr7xSYp+cnBzl5OTYj7Ozs8seHE6XnJwsq9WqqKioYjd7mEwmDRo0SOPGjVNycrJ9P2IAQPl44okn1L59+0pZjIdrSkxM1Jo1a9SxY0e1b99e3t7eunDhgrZv3641a9botttuY/UbAHCy1q1by8PDo9gb9h07dtTSpUsNSgUAAK7VkCFDlJqaqqioKAUFBV1xuzkAAOB6rqsY7yy///67bDabAgICHNoDAgL0888/X/bzsrKy1LBhQ+Xk5MhsNis2NlYPPPBAiX1nz56tmJgYp+aG82VkZEiSwsLCZLPZii3JFRYW5tAPAFB+kpKS5O3tbXQMuAmbzabY2FhZLJZiq9/06dNHU6dO1aJFi9SpUydWvwEAJ0pJSXE4NplMql+/PmM8AACVzHfffaf//ve/xbaaAwAAlcN1F+O//fZbvfbaa/rpp58kSbfddpv++c9/6p577nFauMupU6eO9uzZozNnzighIUGRkZFq0qSJOnfuXKzv5MmTFRkZaT/Ozs5W48aNyz0jro2/v78k6eOPP9b69etltVrt5wIDA9WrVy+HfgCAsuvXr5/DcdHytTt27FBUVJRBqeBuWP0GACqOv7+/Dh48qHr16ikmJkbz589XnTp1jI4FAC7hwoULSk1NNTqG2wkJCeFGr3LWuHHjYivdAACAyuO6ivErV67U0KFD1a9fPz3zzDOSpC1btqhLly5avny5Hn/88VJdp169ejKbzUpPT3doT09PV2Bg4GU/z2Qy6eabb5Z0cem9n376SbNnzy6xGO/l5SUvL69SPjMYJTw8XH5+fnr77bdlsVgUFRWlsLAw+z7xS5YsUd26dRUeHm50VABwG76+vg7HJpNJt9xyi2bMmKEHH3zQoFRwN5euflMSVr8BAOfJzc1Vdna26tWrp3fffVevvPIKxXgA+F+pqakaNWqU0THczuLFi9WsWTOjY7i1efPm6YUXXtC///1v3XjjjUbHAQAA1+i6ivGzZs3Sq6++qgkTJtjbnnnmGb3++ut68cUXS12M9/T0VNu2bZWQkKC+fftKurgffUJCgsaPH1/qPAUFBQ77wsM9cQcoAJTdm2++qVGjRsnb21sxMTFq1KhRsdnKgDMVrWqTkpKiFi1aFDtftIwyq98AQNlZLBb17dtXbdu2VWFhoZ555hnVqFGjxL7sGw+gqgkJCdHixYuNjnFVR48e1axZszRlyhSFhoYaHeeqQkJCjI7g9gYMGKBz587ppptuUs2aNVW9enWH89zYDACAa7uuYvyRI0fUu3fvYu0PP/yw/vWvf13TtSIjIzV48GC1a9dO7du317x583T27FkNHTpUkvTUU0+pYcOGmj17tqSLe8C3a9dON910k3JycvT5559rxYoVWrRo0fU8FbiI5ORkZWZmauTIkVq/fr3GjRtnPxcUFKSRI0fq7bffZglbACijyMhIDRw4UN7e3goLC1NaWpoaNGhgdCy4sfDwcAUGBio+Pr7YnvEFBQWKj49XUFAQq98AgBOsXLlSb7zxhg4fPiwPDw9lZWXpwoULRscCAJfg7e1dqWZwh4aGVqq8KD/z5s0zOgIAACiD6yrGN27cWAkJCfal4ots2rTpmvdjHzBggE6dOqVp06bJarWqdevW2rhxowICAiRdXELq0jdtz549q7Fjx+r48eOqUaOGmjdvrpUrV2rAgAHX81TgIoru4HzkkUc0cOBAJScnKyMjQ/7+/goPD1dOTo7efvtt7vQEgDIKDg7Whx9+qJ49e6qwsFDHjx+/7Jv0zHCAM5jNZo0dO1bR0dGaMmWK2rdvLy8vL+Xk5Gj79u3aunWrYmJiZDabjY4KAJVeQECAXn75ZUkXtwFZsWKFbrjhBoNTAQCAshg8eLDREQAAQBlcVzH+ueee0zPPPKM9e/borrvuknRxz/jly5dr/vz513y98ePHX3ZZ+s2bNzscz5w5UzNnzrzmrwHX9tclbP86+50lbAHAOaZOnaqnn35a48ePl4eHh+68885ifQoLC+Xh4SGbzWZAQrijiIgIDRgwQGvXrlVSUpK93Ww2a8CAAYqIiDAwHQC4p6LXUAAAoPI7fPiwli1bpsOHD2v+/Plq0KCB/r//7/9TSEhIiduBAQAA13FdxfgxY8YoMDBQc+fO1fvvvy9JuvXWW7VmzRr16dPHqQFRNbCELQBUjFGjRumxxx7T0aNHFR4erk2bNjFjDuUuMTFRa9asUceOHYvNjF+zZo1uu+02CvIA4ARvvvlmqfs+88wzpeo3e/ZsffTRR/r5559Vo0YN3XXXXXrllVd0yy232PtcuHBBzz33nFavXq2cnBx169ZNsbGx9hXvpIur3o0ZM0bffPONateurcGDB2v27NmqVu263pYAAKDK+Pbbb9WjRw916tRJiYmJmjVrlho0aKD/+Z//0TvvvKMPPvjA6Ihwc7m5uVq3bp1OnDih4OBg9enTR56enkbHAoBK47pf9T7yyCN65JFHnJkFVdilS9hOnTpVgwYNUlhYmFJSUhQfH6+kpCSWsAUAJ6lTp45atmypZcuWqVOnTvLy8jI6EtyYzWZTbGysLBaLYmJitHfvXmVkZCgoKEi9evVSdHS0Fi1apE6dOjHOA0AZvfHGG6Xq5+HhUepi/Lfffqtx48bpzjvvVH5+vv71r3/pwQcf1P79+1WrVi1J0oQJE7RhwwatXbtWvr6+Gj9+vPr166ctW7ZIujgWPPTQQwoMDNT333+vtLQ0PfXUU6pevbpeeuml63uyAABUES+88IJmzpypyMhI1alTx95+//33a8GCBQYmQ1UQFxentWvXOqyeGBcXp/79+2v06NEGJgOAyoNb0OEyIiIiFBMTo9jYWI0bN87eHhQUpJiYGGbMAYCTse8cKkJycrKsVqt69+6tJ598Ular1X4uMDBQvXv31vfff6/k5ORi29QAAK5NeSxNv3HjRofj5cuXq0GDBtq5c6ciIiKUlZWld955R6tWrdL9998vSVq2bJluvfVWbd26VR07dtSXX36p/fv3a9OmTQoICFDr1q314osv6vnnn9f06dOZWQUAwBX8+OOPWrVqVbH2Bg0a6Pfff7+mayUmJmrOnDnauXOn0tLS9PHHH6tv375X/JzNmzcrMjJS+/btU+PGjTV16lQNGTKkTNdE5RAXF6fVq1erbt26Gj58uCwWi5KSkvTOO+9o9erVkkRBHgBKodTF+Lp168rDw6NUfTMyMq47EKq2iIgIdezYkWVvAKCcMJ6johV9Hy1ZskQWi0VRUVEOq98sWbLEoR8AwLVlZWVJkvz9/SVJO3fuVF5enrp27Wrv07x5c4WEhCgpKUkdO3ZUUlKSbr/9dodl67t166YxY8Zo37593IwFAMAV+Pn5KS0tTWFhYQ7tu3fvVsOGDa/pWmfPnlWrVq00bNgw9evX76r9U1JS9NBDD2n06NGKj49XQkKCRowYoaCgIHXr1u26ronKITc3V2vXrlXdunW1du1a+9ZCvXr1Uvfu3dW/f3+tXbtWw4YN4717ALiKUhfj582bV44xgIsSExMVGxvrMGvuww8/1NixY5kZDwBOwHiOiubn5ydJatmypWbOnCmTySRJatGihWbOnKl//OMf+vHHH+39AADOMWzYsCueX7p06TVfs6CgQM8++6w6deqkli1bSpKsVqs8PT2L/R4PCAiwv66zWq0Ohfii80XnSpKTk6OcnBz7cXZ29jXnBQDAHQwcOFDPP/+81q5dKw8PDxUUFGjLli2aOHGinnrqqWu6Vo8ePdSjR49S94+Li1NYWJjmzp0rSbr11lv13Xff6Y033rAX46/1mqgc1q1bJ5vNpuHDh9sL8UWqVaumYcOGae7cuVq3bp369+9vUEoAqBxKXYxnKVuUt8TEREVHR6t69eoO7RkZGYqOjmapegBwAsZzAACqhtOnTzsc5+Xlae/evcrMzLQvJ3+txo0bp7179+q7775zRsQrmj17tmJiYsr96wAA4OpeeukljRs3To0bN5bNZtNtt92m/Px8DRo0SFOnTi3Xr52UlOSw+o10cXWbZ599tkzX5aY713fixAlJksViKfF8UXtRPwDA5V33nvEFBQU6dOiQTp48qYKCAodzFExxrWw2m15//XUVFhaWeL6wsFBvvPGGOnXqJLPZXMHpAMA9paamXvF8SEhIBSWBO8vMzJR0cZ/DKVOmqH379vLy8lJOTo62b9+uH3/80aEfAMA5Pv7442JtBQUFGjNmjG666aZrvt748eP12WefKTExUY0aNbK3BwYGKjc3V5mZmQ6z49PT0xUYGGjvs337dofrpaen28+VZPLkyYqMjLQfZ2dnq3HjxtecGwCAys7T01Nvv/22pk2bph9//FFnzpxRmzZt1LRp03L/2pdb3SY7O1vnz59XjRo1ruu63HTn+oKDgyVdvCGjV69exc4nJSU59AMAXN51FeO3bt2qxx9/XEePHi1WPPXw8JDNZnNKOFQde/bssb8Jf8cdd6hDhw7y9vbWhQsXtG3bNm3dulWnT5/Wnj171LZtW2PDAoCbuPHGG6+4fzzjOZyhaE/hrl276uuvv7a/YJcks9msLl26KCEhwd4PAFB+TCaTIiMj1blzZ02aNKlUn1NYWKinn35aH3/8sTZv3lxsv9q2bduqevXqSkhI0KOPPipJOnDggFJTU+0zpiwWi2bNmqWTJ0+qQYMGkqSvvvpKPj4+uu2220r8ul5eXvLy8rrepwoAQKV26Q1pJdm6dav98euvv17ecZyOm+5cX58+fRQXF6d33nlH3bt3d1iqPj8/X0uXLpXZbFafPn0MTAkAlcN1FeNHjx6tdu3aacOGDQoKCrriG/lAaezatUuS1KhRI6WkpDj8QRkQEKBGjRrp+PHj2rVrF8V4AHCS3bt3Oxzn5eVp9+7dev311zVr1iyDUsHdhIeHy8/PT5s2bZKnp6dyc3Pt58xmsxISEuTn56fw8HADUwJA1XH48GHl5+eXuv+4ceO0atUqrVu3TnXq1LHv8e7r66saNWrI19dXw4cPV2RkpPz9/eXj46Onn35aFotFHTt2lCQ9+OCDuu222/Tkk0/q1VdfldVq1dSpUzVu3DgK7gAAlOCvr9d37dql/Px83XLLLZKkgwcPymw2l/v7pIGBgfbVbIqkp6fLx8fnumfFS9x0Vxl4enqqf//+Wr16tfr3769hw4bJYrEoKSlJS5cu1enTpzVw4EB5enoaHRUAXN51FeN/+eUXffDBB7r55pudnQdV1MmTJyVJx48f11133aVp06YpLCxMKSkpio+P1/fff+/QDwBQdq1atSrW1q5dOwUHB2vOnDnq16+fAangjvLy8iRJNWvWtBdokpKS9M477yg3N9d+HgDgPH+dUVdYWKi0tDRt2LBBgwcPLvV1Fi1aJEnq3LmzQ/uyZcs0ZMgQSdIbb7whk8mkRx99VDk5OerWrZtiY2Ptfc1msz777DONGTNGFotFtWrV0uDBgzVjxozre3IAALi5b775xv749ddfV506dfTuu++qbt26kqTTp09r6NChuueee8o1h8Vi0eeff+7Q9tVXX112H3G4l9GjR0uS1q5dq7lz59rbzWazBg4caD8PALiy6yrGd+jQQYcOHaIYD6epV6+eJKl27dqaMWOGfdmbFi1aaMaMGerbt6/OnDlj7wcAKD+33HKLfvjhB6NjwE3s2bNHZ8+eVUhIiHJzcx1ewAcFBcnHx0epqalsRQMATvbXGXUmk0n169fX3LlzNWzYsFJf569b05XE29tbCxcu1MKFCy/bJzQ0tNib+QAA4Ormzp2rL7/80l6Il6S6detq5syZevDBB/Xcc8+V+lpnzpzRoUOH7McpKSnas2eP/P39FRISosmTJ+u3337Te++9J+liMXbBggWaNGmShg0bpq+//lrvv/++NmzYUOpronIbPXq0hg0bpnXr1unEiRMKDg5Wnz59mBEPANeg1MX45ORk++Onn35azz33nKxWq26//XZVr17doS/LjOJa+fn5Sbr4x9vUqVPVoUMHeXl5KScnR9u2bdOZM2cc+gEAyi47O9vhuGjG3PTp09W0aVODUsHd7NmzR5L0j3/8Q61bt1ZycrIyMjLk7++v8PBw7dmzR8899xzFeABwsktn1AEAgMorOztbp06dKtZ+6tQp/fnnn9d0rR07dui+++6zHxetpDN48GAtX75caWlpSk1NtZ8PCwvThg0bNGHCBM2fP1+NGjXSkiVL1K1bt1JfE5Vf0ZL1AIDrU+pifOvWreXh4eFwV/yld9MXnfPw8JDNZnNuSrg9f39/++OtW7c67Bl/uX4AgLLx8/OTh4eHQ1thYaEaN26s1atXG5QK7uqv32sAgPJ1/vx5FRYWqmbNmpKko0eP6uOPP9Ztt92mBx980OB0AACgtB555BENHTpUc+fOVfv27SVJ27Zt0z//+c9r3l6uc+fOV1z1pqTieefOnYutuHMt1wQAoKordTE+JSWlPHOgirt0+fm/3vRx6THL1AOA8/x1xlzR8rU333yzfbsQoKxat26tFStWaN68ecrJyVF6err9XEBAgLy8vOz9AADO06dPH/Xr10+jR49WZmam2rdvL09PT/3+++96/fXXNWbMGKMjAgCAUoiLi9PEiRP1+OOPKy8vT5JUrVo1DR8+XHPmzDE4HQAAuJpSv9MeGhpqfzx79mwFBAQU22du6dKlOnXqlJ5//nnnJUSV0KJFC5nNZnl7e6tWrVo6efKk/VyDBg105swZXbhwQS1atDAwJQC4l3vvvdfoCKgCWrdurZo1ayo1NVV169bVc889J4vFoqSkJC1dulTp6emqWbMmxXgAcLJdu3bpjTfekCR98MEHCgwM1O7du/Xhhx9q2rRpFOMBAKgkatasqdjYWM2ZM0eHDx+WJN10002qVauWwckAAEBpmK7nk/7973+refPmxdpbtGihuLi4ModC1bNv3z7ZbDadPXtWmZmZDudOnz6ts2fPymazad++fcYEBAA39O6772rDhg3240mTJsnPz0933XWXjh49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WrVq6ZdfftH8+fP16quvav78+Tp06JBq1aols9msPn36GB0VcGlHjhyRdHHbJpPJ8WWcyWRS/fr1HfoBAAAAAADAeBTj4RKK9oWvWbOm/Y3EIvXr11fNmjUd+gG4MpvNpt27dyshIUG7d+922FcWKDJz5kzFxcXp7bffVvXq1e3tnTp10q5duwxMBnfi6emp/v376+zZs/r9998dzp06dUpnz55V//795enpaVBCoHKwWq2SLhbbp06dqn379uncuXPat2+fpk6dqpSUFId+gCR98MEH+vvf/66OHTvqjjvucPgAAAAAAADlj2Xq4RKKZr+fO3dO+fn5DucyMzOVm5vr0A/A5SUmJio2NtbhzfjAwECNHTtWERERBiaDqzlw4ECJ3xO+vr7KzMy8pmslJiZqzpw52rlzp9LS0vTxxx+rb9++9vOFhYWKjo7W22+/rczMTHXq1EmLFi1S06ZN7X0yMjL09NNPa/369TKZTHr00Uc1f/581a5d+3qfIgC4jeDgYElS7969tX37do0bN85+LigoSL1799ann35q7we8+eabmjJlioYMGaJ169Zp6NChOnz4sH744QeH75+qLj09XVlZWUbHcAtHjx51+C+cw9fXVwEBAUbHAAAAAHCdKMbDJdx666365JNPJMleeC9y6fGtt95akbGASicxMVHR0dGyWCyKiopSWFiYUlJSFB8fr+joaMXExFCQh11gYKAOHTqkG2+80aH9u+++U5MmTa7pWmfPnlWrVq00bNgw9evXr9j5V199VW+++abeffddhYWFKSoqSt26ddP+/fvl7e0tSRo0aJDS0tL01VdfKS8vT0OHDtWoUaO0atWq636OMF5ubq7Wrl2runXrKj4+Xhs2bNCJEycUHByshx56SIMGDdLatWs1bNgwZscDV9CnTx/FxcXpv//9r1avXq39+/crIyND/v7+uu222zRw4EC2fICD2NhYLV68WI899piWL1+uSZMmqUmTJpo2bZoyMjKMjucS0tPT9cSTTykvN8foKG5l1qxZRkdwK9U9vbRyxXsU5AEAAIBKimI8XEK9evWc2g+oimw2m2JjY2WxWDRz5kz7frItWrTQzJkzNXXqVC1atEidOnWS2Ww2OC1cwciRI/WPf/xDS5culYeHh06cOKGkpCRNnDhRUVFR13StHj16qEePHiWeKyws1Lx58zR1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LEpKStI777yj1atXSxIFeQAoBcOL8a+//rpGjhypoUOHSrr4C37Dhg1aunSpXnjhhWL94+PjHY6XLFmiDz/8UAkJCXrqqacqJDOcr7Sz4Zg1B5SO2WxWmzZtjI4BF3fPPffovffe04svvijp4pv2BQUFevXVVx0K66XRuXPnK/6O9vDw0IwZMzRjxozL9vH399eqVauu6evC9RWtbFBQUKCePXuqf//+6tmzpz7//HOtXbtWBQUFDv0AlKxou6YmTZpo5syZMpku7jjWokULzZw5UyNGjNCRI0fY1gnavXu3pIuvnX788Ud5enraz3l6eqpVq1aaOHGiUfEAAABQCVy6TdbatWtVrdrFUlKvXr3UvXt39e/fX2vXrtWwYcMc/t4EUDKbzcbkuSrM0GJ8bm6udu7cqcmTJ9vbTCaTunbtqqSkpFJd49y5c8rLy5O/v395xUQFKBrMndUPAHB1r776qrp06aIdO3YoNzdXkyZN0r59+5SRkaEtW7YYHQ9u4o477rDfTJmfn6///Oc/+s9//lNiPwCX16RJE0nSyZMnVVBQYC/GSxdvdinaG7yoH6qub775RpI0dOhQzZ8/Xz4+PgYnAgAAQGVTtE3W8OHDi70nX61aNQ0bNkxz585lmyygFBITExUbG1tsu7mxY8eyrWwVYbp6l/Lz+++/y2azKSAgwKE9ICDA4ZvySp5//nkFBwera9euJZ7PyclRdna2wwdcT35+vlP7AQCurmXLljp48KDuvvtu9enTR2fPnlW/fv20e/du3XTTTUbHg5to3bq1/Pz8rtinbt26LJkMXEXR65g///xT/fv31/r16/X7779r/fr16t+/v/7880+HfsCyZcvshfjjx4/r+PHjBicCAABAZVG0/ZXFYinxfFE722QBV5aYmKjo6Gg1adJECxcu1Oeff66FCxeqSZMmio6OVmJiotERUQEMLcaX1csvv6zVq1fr448/dthz9lKzZ8+Wr6+v/aNx48YVnBKlcf78eaf2AwBcWV5enrp06aKTJ09qypQpev/99/X5559r5syZCgoKMjoe3IjZbFb37t2v2Kdbt24szQVcRdFKYF27dlV2drbmzp2rv/3tb5o7d66ys7PtNyezYhiKFBQUaMaMGfL19VVoaKhCQ0Pl5+enF1980b5FCAAAAFCSoq3kLreCcVE7W84Bl2ez2RQbGyuL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AAAAAAAAAOBkFOMBOMX06dPVunVr+/GQIUPUt29fw/IAAADnYIwHAMB9Mc4DAOCeGOMB11HN6AAA3NP8+fNVWFhoP+7cubNat26tefPmGRcKAACUGWM8AADui3EeAAD3xBgPGIdiPIBy4evra3QEAABQDhjjAQBwX4zzAAC4J8Z4wDgsUw9UAWfPntVTTz2l2rVrKygoSHPnzlXnzp317LPPSpI8PDz0ySefOHyOn5+fli9fbj9+/vnn1axZM9WsWVNNmjRRVFSU8vLyLvs1L132ZsiQIfr22281f/58eXh4yMPDQykpKbr55pv12muvOXzenj175OHhoUOHDjnjqQMA4NYY4wEAcF+M8wAAuCfGeKBqoRgPVAH//Oc/9e2332rdunX68ssvtXnzZu3ateuarlGnTh0tX75c+/fv1/z58/X222/rjTfeKNXnzp8/XxaLRSNHjlRaWprS0tIUEhKiYcOGadmyZQ59ly1bpoiICN18883XlA8AgKqIMR4AAPfFOA8AgHtijAeqForxgJs7c+aM3nnnHb322mvq0qWLbr/9dr377rvKz8+/putMnTpVd911l2688Ub17t1bEydO1Pvvv1+qz/X19ZWnp6dq1qypwMBABQYGymw2a8iQITpw4IC2b98uScrLy9OqVas0bNiwa36eAABUNYzxAAC4L8Z5AADcE2M8UPWwZzzg5g4fPqzc3Fx16NDB3ubv769bbrnlmq6zZs0avfnmmzp8+LDOnDmj/Px8+fj4lClbcHCwHnroIS1dulTt27fX+vXrlZOTo/79+5fpugAAVAWM8QAAuC/GeQAA3BNjPFD1MDMegDw8PFRYWOjQdun+MklJSRo0aJB69uypzz77TLt379aUKVOUm5tb5q89YsQIrV69WufPn9eyZcs0YMAA1axZs8zXBQAAjPEAALgzxnkAANwTYzzgXpgZD7i5m266SdWrV9e2bdsUEhIiSTp9+rQOHjyoe++9V5JUv359paWl2T/nl19+0blz5+zH33//vUJDQzVlyhR729GjR68ph6enp2w2W7H2nj17qlatWlq0aJE2btyoxMTEa7ouAABVFWM8AADui3EeAAD3xBgPVD0U4wE3V7t2bQ0fPlz//Oc/dcMNN6hBgwaaMmWKTKb/Wxjj/vvv14IFC2SxWGSz2fT888+revXq9vNNmzZVamqqVq9e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a/LkyUpJSdH06dO1e/dunThxQrt379b06dOVkpKixx57TGaz2eioqAcutBxtdna2rTFfpqCgQJ9++mmls+J//fVXjR49Wl27dtV9992n1q1ba9OmTbriiitq9skAAADgoq1Zs0YWi0UTJkxQo0aN7M41atRI48ePl8Vi0Zo1awxKCAC4VLGxsbryyivl6uqqfv36XfD376xmCwBA5RpduKR2WCwWrVy5UkVFRQoODq6wpn///lq+fLm2bNmivn376sCBA1q3bp0efPDBSu9bXFys4uJi23FhYWG1Z8flO3DggCTp5MmT6t27t2bOnCl/f3+lp6dr+fLlSklJsdVdd911RkYFHFpISIiio6O1YMEChYeH28a9vb0VHR2tkJAQA9OhPilbjrYyFS1L6+7urhMnTlR6TUJCQnVEAwAAQC3IysqSpEp/h1M2XlYHAKgbPvroI0VERCg+Pl79+vXTvHnzNGjQIO3du1dt27YtV1+2mu2SJUvUv39//fzzz3rooYdkMpn0xhtvGPAMAABwLIY343fu3Kng4GCdOnVKzZs316pVq3T11VdXWHv//ffryJEjuuGGG1RaWqozZ85o0qRJ512mPiYmRtHR0TUVH9UkOzvb9nFpaal+/vlnZWRkqLi42K7Zc24dgIqFhITo+uuv15o1a5SVlSUfHx+FhobK2dnZ6GgAAAAA6gkfHx9JUkpKioYOHVrufNmb6svqAAB1wxtvvKFHHnlE48aNkyTFx8dr7dq1WrJkiZ577rly9eeuZitJV155pUaPHq3NmzfXam4AAByVocvUS1LXrl2VmpqqzZs367HHHtPYsWP1448/VliblJSkl156SQsWLND27dv12Wefae3atXrxxRcrvX9kZKQKCgpsj0OHDtXUU0E16N69u3744QfNnz9fr776qubPn68ffvhB3bp1MzoaUGckJydrzJgxio2N1apVqxQbG6sxY8YoOTnZ6GgAAAAA6onQ0FCZzWYtXrxYZ86csTt35swZLVmyRGazWaGhoQYlBABcrJKSEm3btk0DBw60jTk5OWngwIG2N1n9Wf/+/bVt2zbbUvZlq9kOGTKk0s9TXFyswsJCuwcAAPWV4TPjnZ2d1alTJ0lSnz59bI3Yd955p1ztjBkz9OCDD+rhhx+WJPXs2VNFRUWaOHGipk2bJien8u8tcHFxkYuLS80+CVy27t27a/Xq1frpp5903XXXqUmTJjp27JhatGihkydP6ocffrDVAahccnKyoqKiFBwcrBkzZti2e1ixYoWioqJYqh4AAABAtXB2dtaIESOUkJCgESNGaPz48QoODlZKSoqWLFmio0ePatSoUazQBQB1yJEjR2SxWOTp6Wk37unpqT179lR4DavZAgBwfoY34//MarXa7fF+rhMnTpRruJvNZkk67761cHxt2rSxfVzWeL9QHQB7FotFCxYsUHBwsGbPnm37fhkQEKDZs2dr+vTpiouL04ABA2zfOwEAAADgUk2aNEnS2f2F586daxt3cnLSqFGjbOcBAPXXuavZ9uvXT/v27dPjjz+uF198UTNmzKjwmsjISEVERNiOCwsL5evrW1uRAQCoVYYuUx8ZGank5GQdPHhQO3fuVGRkpJKSkhQWFiZJGjNmjCIjI231w4YNU1xcnBISEpSenq6NGzdqxowZGjZsGI0lAA1eWlqacnJyFBYWptLSUu3YsUOJiYnasWOHSktLFRYWpuzsbKWlpRkdFQAAAEA98eWXX5abIGG1WvXll18alAgAcKnatGkjs9ms3Nxcu/Hc3Fx5eXlVeM25q9n27NlTd911l1566SXFxMTIarVWeI2Li4vc3NzsHgAA1FeGzow/fPiwxowZo+zsbLm7uyswMFAbNmzQbbfdJknKzMy0mwk/ffp0mUwmTZ8+Xb/99puuuOIKDRs2THPmzDHqKaCaHDlyxPaxs7OzSkpKKjw+tw6Avby8PElSVlaWXnzxReXk5NjOeXl5acKECXZ1AAAAAHA57r77btv/Lzp06KAbbrhB3333nTIyMpSXl6e7775bn332mcEpAQBV5ezsrD59+igxMVHDhw+XdPYNVomJiZoyZUqF17CaLQAA52doM37x4sXnPZ+UlGR33KhRI0VFRSkqKqoGU8EIP/30k+1jk8lkd+7c459++kmDBg2qtVxAXeLh4SFJeumllyrcM/6ll16yqwMAAACAS5WXl2drxLdt21YZGRnKyMiwHR8+fNhWw/9BAKDuiIiI0NixY3Xttdeqb9++mjdvnoqKijRu3DhJZ1ezbdeunWJiYiSdXc32jTfeUFBQkG2ZelazBQDg/zjcnvFomMreJenu7q733ntPr732mrKysuTj46NnnnlGY8eOVUFBAe+mBM4jICBAZrNZbm5umjVrlho1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UhEREbbjwsJCGvIOxmw2a/LkyYqKitLQoUPtVjJwcXFRSUmJoqOjZTabDUwJAKhpZY34jIwMffXVV+edFS+dfY1wcXGppXQAAAAAANQMmvEAADQQTz75pBo3bqzMzEx1797dNj5y5EhFRETUeDP+ww8/1Pjx45WQkKA77rjjgvXHjx/X/v379eCDD1Zawy/q647S0tKLGgcA1Ix//OMfVa79+9//Xi2fs6wR/8svv+jrr79W69atq+W+AAAAAAA4OprxAAA0EF9++aU2bNig9u3b24137txZGRkZF3Wv48eP281YT09PV2pqqjw8POTn56fIyEj99ttvWrZsmaSzS9OPHTtW8+fPV79+/ZSTkyNJatKkidzd3SVJTz/9tIYNG6YOHTooKytLUVFRMpvNGj169OU8bRjMYrFowYIF6t+/v2bOnKkvvvjCtmf8sGHDNGvWLMXFxWnAgAHMjgeAWvDmm29Wqc5kMlW5GX++nwu8vb117733avv27frXv/4li8Vi+znAw8NDzs7OF/8kAAAAAACoI2jGAwDQQBQVFalp06blxvPy8i56dvnWrVt18803247LloofO3asli5dquzsbGVmZtrOL1y4UGfOnFF4eLjCw8Nt42X1kvTrr79q9OjR+uOPP3TFFVfohhtu0KZNm3TFFVdcVDY4lrS0NOXk5GjYsGF66KGHbA0YSfr00081dOhQff/990pLS1NQUJCBSQGgYUhPT6/2e57v54IXXnhBn3/+uSSpd+/edtd9/fXXuummm6o9DwAAAAAAjoJmPAAADcSNN96oZcuW6cUXX5R0dsab1WrVq6++avcL9Kq46aabzru8eFmDvUxSUtIF75mQkHBRGVA35OXlSZIWLVqk/v37a8aMGfL391d6erpWrFihd999164OAGCMstd1k8l00dde6OcCtiQBAAAAADRUTkYHAAAAtePVV1/VwoULNXjwYJWUlGjq1Knq0aOHkpOT9corrxgdD/VUy5YtJUk9e/bU7NmzFRAQoKZNmyogIECzZ89Wz5497eoAALVr2bJl6tmzp5o0aaImTZooMDBQ77//vtGxAAAAAACoF5gZDwBAA9GjRw/9/PPPevvtt9WiRQsdP35cd999t8LDw+Xt7W10PDQAJ0+e1KJFi/Trr7+qffv2euSRR4yOBAAN2htvvKEZM2ZoypQpGjBggCTp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PDc3t9I315d5/fXX9fLLL+s///mPAgMDz1vr4uIiFxeXy84LAEBdQDMeAABclPMtW7dnz54Kr+natauWLFmiwMBAFRQU6PXXX1f//v21e/dutW/f3rbc3cUuhVdcXKzi4mLbcU3uM3fSP0TWJi1r7P7ApXA6mV+nGtz8O4Kjqmv/luqiY8eOacaMGVq1apUOHz6soKAgzZ8/X9ddd53R0QAAwP/n7OysPn36KDExUcOHD5ckWa1WJSYmasqUKZVe9+qrr2rOnDnasGGDrr322lpKCwBA3UAzHgAA1Ljg4GAFBwfbjvv376/u3bvrnXfe0YsvvnjJ942JiVF0dHR1RLwga5OWsjZrUyufC6iv+HcENFwPP/ywdu3apffff18+Pj5avny5Bg4cqB9//FHt2rUzOh4AAPj/IiIiNHbsWF177bXq27ev5s2bp6KiIts2dWPGjFG7du0UExMjSXrllVc0c+ZMffDBB7ryyittb6hv3ry5mjdvbtjzAADAUTgZHQAAANQtl7NsXZnGjRsrKChI+/btkyTbdRd7z8jISBUUFNgehw4dupinAgAAasHJkyf16aef6tVXX1VISIg6deqkF154QZ06dVJcXJzR8QAAwDlGjhyp119/XTNnzlTv3r2Vmpqq9evX21ayy8zMVHZ2tq0+Li5OJSUluvfee+Xt7W17vP7660Y9BQAAHAoz4wEAwEW51GXrzmWxWLRz504NGTJEkuTv7y8vLy8lJiaqd+/eks4uOb9582Y99thjld6HfeYAAHB8Z86ckcVikaurq914kyZN9N133xmUCgAAVGbKlCmV/v8+KSnJ7vjgwYM1HwgAgDqMZjwAALhoF7ts3axZs3T99derU6dOys/P12uvvaaMjAw9/PDDkiSTyaQnnnhCs2fPVufOneXv768ZM2bIx8fH1vAHAAB1U4sWLRQcHKwXX3xR3bt3l6enpz788EOlpKSoU6dOFV5TXFys4uJi23FhYWFtxQUAAAAAoNrQjAcAABdt5MiR+v333zVz5kzl5OSod+/e5Zatc3L6v91wjh49qkceeUQ5OTlq1aqV+vTpo++//15XX321rWbq1KkqKirSxIkTlZ+frxtuuEHr168vN4sOAADUPe+//77Gjx+vdu3ayWw265prrtHo0aO1bdu2CutjYmIUHR1dyykBAAAAAKheNOMBAMAluZhl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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "dims = (3, 4)\n", "\n", @@ -906,7 +436,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": null, "id": "dee4b83a-a069-4ed8-a9c5-935e45539cd3", "metadata": { "tags": [] @@ -921,36 +451,12 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": null, "id": "31857042-ba20-42b5-9739-6a017f6b1951", "metadata": { "tags": [] }, - "outputs": [ - { - "data": { - "text/plain": [ - "fixed_acidity False\n", - "volatile_acidity False\n", - "citric_acid False\n", - "residual_sugar False\n", - "chlorides False\n", - "free_sulfur_dioxide False\n", - "total_sulfur_dioxide False\n", - "density False\n", - "pH False\n", - "sulphates False\n", - "alcohol False\n", - "quality False\n", - "is_red False\n", - "dtype: bool" - ] - }, - "execution_count": 91, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "data.isna().any()" ] @@ -970,7 +476,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": null, "id": "757d77d2-d54e-4a2b-8b8d-1eba01ba61ce", "metadata": { "tags": [] @@ -991,7 +497,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": null, "id": "61d6a7b2-974c-4c6c-a31f-3df48760c805", "metadata": { "tags": [] @@ -1023,7 +529,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "id": "4b53a514-9eab-491d-9237-80448e4cea20", "metadata": {}, "outputs": [], @@ -1033,7 +539,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "id": "6628b383-14a4-493e-9add-e6076adf6ad5", "metadata": {}, "outputs": [], @@ -1048,7 +554,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "id": "4f9e8cf7-0458-49d1-9dfa-a3061bbc00d4", "metadata": {}, "outputs": [], @@ -1072,7 +578,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "id": "9f2832df-baa7-4125-8ef3-681517dbe8b0", "metadata": {}, "outputs": [], @@ -1111,39 +617,20 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "id": "d8957943-d0dc-4803-aab5-6c6ceb8ba34d", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022/10/14 04:29:17 WARNING mlflow.utils.autologging_utils: MLflow autologging encountered a warning: \"/opt/app-root/lib/python3.8/site-packages/mlflow/models/signature.py:129: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\"\n", - "2022/10/14 04:29:24 WARNING mlflow.utils.autologging_utils: MLflow autologging encountered a warning: \"/opt/app-root/lib/python3.8/site-packages/_distutils_hack/__init__.py:33: UserWarning: Setuptools is replacing distutils.\"\n", - "/opt/app-root/lib/python3.8/site-packages/mlflow/models/signature.py:129: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\n", - " inputs = _infer_schema(model_input)\n" - ] - } - ], + "outputs": [], "source": [ "model = train_randomforest(X_train,y_train,X_test,y_test)" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "id": "6c8cdc21-a1df-429b-8be3-3e4d1ea5ff2d", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "AUC: 0.8540300975814177\n" - ] - } - ], + "outputs": [], "source": [ "# Sanity-check: This should match the AUC logged by MLflow\n", "print(f'AUC: {roc_auc_score(y_test, model.predict_proba(X_test)[:,1])}')" @@ -1151,108 +638,10 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "id": "6eba2f19-7755-412e-bc67-2e586817582c", "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", - "
importance
alcohol0.160192
density0.117415
volatile_acidity0.093136
chlorides0.086618
residual_sugar0.082544
free_sulfur_dioxide0.080473
pH0.080212
total_sulfur_dioxide0.077798
sulphates0.075780
citric_acid0.071857
fixed_acidity0.071841
is_red0.002134
\n", - "
" - ], - "text/plain": [ - " importance\n", - "alcohol 0.160192\n", - "density 0.117415\n", - "volatile_acidity 0.093136\n", - "chlorides 0.086618\n", - "residual_sugar 0.082544\n", - "free_sulfur_dioxide 0.080473\n", - "pH 0.080212\n", - "total_sulfur_dioxide 0.077798\n", - "sulphates 0.075780\n", - "citric_acid 0.071857\n", - "fixed_acidity 0.071841\n", - "is_red 0.002134" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Sanity-check: This should match the feature importance logged by MLflow\n", "feature_importances = pd.DataFrame(model.feature_importances_, index=X_train.columns.tolist(), columns=['importance'])\n", @@ -1270,978 +659,13 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "id": "84cf68d6-86a4-4daa-927b-b4dc53f8cc9d", "metadata": { "scrolled": true, "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0]\tvalidation-logloss:0.44333 \n", - "[1]\tvalidation-logloss:0.41397 \n", - "[2]\tvalidation-logloss:0.42087 \n", - "[3]\tvalidation-logloss:0.40797 \n", - "[4]\tvalidation-logloss:0.41671 \n", - "[5]\tvalidation-logloss:0.42035 \n", - "[6]\tvalidation-logloss:0.42613 \n", - "[7]\tvalidation-logloss:0.42852 \n", - "[8]\tvalidation-logloss:0.43271 \n", - "[9]\tvalidation-logloss:0.44060 \n", - "[10]\tvalidation-logloss:0.44639 \n", - "[11]\tvalidation-logloss:0.45534 \n", - "[12]\tvalidation-logloss:0.45760 \n", - "[13]\tvalidation-logloss:0.46125 \n", - "[14]\tvalidation-logloss:0.46433 \n", - "[15]\tvalidation-logloss:0.47167 \n", - "[16]\tvalidation-logloss:0.47850 \n", - "[17]\tvalidation-logloss:0.48394 \n", - "[18]\tvalidation-logloss:0.48653 \n", - "[19]\tvalidation-logloss:0.48643 \n", - "[20]\tvalidation-logloss:0.48780 \n", - "[21]\tvalidation-logloss:0.49005 \n", - "[22]\tvalidation-logloss:0.49160 \n", - "[23]\tvalidation-logloss:0.49308 \n", - "[24]\tvalidation-logloss:0.49859 \n", - "[25]\tvalidation-logloss:0.49639 \n", - "[26]\tvalidation-logloss:0.49793 \n", - "[27]\tvalidation-logloss:0.50148 \n", - "[28]\tvalidation-logloss:0.50193 \n", - "[29]\tvalidation-logloss:0.50504 \n", - "[30]\tvalidation-logloss:0.50576 \n", - "[31]\tvalidation-logloss:0.50856 \n", - "[32]\tvalidation-logloss:0.50839 \n", - "[33]\tvalidation-logloss:0.51065 \n", - "[34]\tvalidation-logloss:0.51173 \n", - "[35]\tvalidation-logloss:0.51465 \n", - "[36]\tvalidation-logloss:0.51601 \n", - "[37]\tvalidation-logloss:0.51602 \n", - "[38]\tvalidation-logloss:0.51612 \n", - "[39]\tvalidation-logloss:0.51567 \n", - "[40]\tvalidation-logloss:0.51560 \n", - "[41]\tvalidation-logloss:0.51591 \n", - "[42]\tvalidation-logloss:0.51794 \n", - "[43]\tvalidation-logloss:0.52040 \n", - "[44]\tvalidation-logloss:0.52113 \n", - "[45]\tvalidation-logloss:0.52005 \n", - "[46]\tvalidation-logloss:0.52180 \n", - "[47]\tvalidation-logloss:0.52510 \n", - "[48]\tvalidation-logloss:0.52464 \n", - "[49]\tvalidation-logloss:0.52464 \n", - "[50]\tvalidation-logloss:0.52719 \n", - "[51]\tvalidation-logloss:0.52812 \n", - "[52]\tvalidation-logloss:0.52910 \n", - "[53]\tvalidation-logloss:0.52952 \n", - " 0%| | 0/10 [00:01`_ for more details.\"\n", - "\n", - "/opt/app-root/lib/python3.8/site-packages/mlflow/models/signature.py:129: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\n", - " inputs = _infer_schema(model_input)\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0]\tvalidation-logloss:0.66207 \n", - "[1]\tvalidation-logloss:0.63397 \n", - "[2]\tvalidation-logloss:0.60908 \n", - "[3]\tvalidation-logloss:0.58602 \n", - "[4]\tvalidation-logloss:0.56529 \n", - "[5]\tvalidation-logloss:0.54639 \n", - "[6]\tvalidation-logloss:0.52885 \n", - "[7]\tvalidation-logloss:0.51333 \n", - "[8]\tvalidation-logloss:0.49891 \n", - "[9]\tvalidation-logloss:0.48621 \n", - "[10]\tvalidation-logloss:0.47480 \n", - "[11]\tvalidation-logloss:0.46292 \n", - "[12]\tvalidation-logloss:0.45166 \n", - "[13]\tvalidation-logloss:0.44162 \n", - "[14]\tvalidation-logloss:0.43190 \n", - "[15]\tvalidation-logloss:0.42311 \n", - "[16]\tvalidation-logloss:0.41422 \n", - "[17]\tvalidation-logloss:0.40691 \n", - "[18]\tvalidation-logloss:0.40052 \n", - "[19]\tvalidation-logloss:0.39411 \n", - "[20]\tvalidation-logloss:0.38866 \n", - "[21]\tvalidation-logloss:0.38339 \n", - "[22]\tvalidation-logloss:0.37805 \n", - "[23]\tvalidation-logloss:0.37279 \n", - "[24]\tvalidation-logloss:0.36834 \n", - "[25]\tvalidation-logloss:0.36418 \n", - "[26]\tvalidation-logloss:0.36038 \n", - "[27]\tvalidation-logloss:0.35615 \n", - "[28]\tvalidation-logloss:0.35357 \n", - "[29]\tvalidation-logloss:0.35025 \n", - "[30]\tvalidation-logloss:0.34754 \n", - "[31]\tvalidation-logloss:0.34511 \n", - "[32]\tvalidation-logloss:0.34243 \n", - "[33]\tvalidation-logloss:0.34034 \n", - "[34]\tvalidation-logloss:0.33777 \n", - "[35]\tvalidation-logloss:0.33605 \n", - "[36]\tvalidation-logloss:0.33432 \n", - "[37]\tvalidation-logloss:0.33272 \n", - "[38]\tvalidation-logloss:0.33087 \n", - "[39]\tvalidation-logloss:0.32931 \n", - "[40]\tvalidation-logloss:0.32804 \n", - "[41]\tvalidation-logloss:0.32656 \n", - "[42]\tvalidation-logloss:0.32520 \n", - "[43]\tvalidation-logloss:0.32441 \n", - "[44]\tvalidation-logloss:0.32317 \n", - "[45]\tvalidation-logloss:0.32262 \n", - "[46]\tvalidation-logloss:0.32225 \n", - "[47]\tvalidation-logloss:0.32154 \n", - "[48]\tvalidation-logloss:0.32064 \n", - "[49]\tvalidation-logloss:0.31889 \n", - "[50]\tvalidation-logloss:0.31792 \n", - "[51]\tvalidation-logloss:0.31717 \n", - "[52]\tvalidation-logloss:0.31751 \n", - "[53]\tvalidation-logloss:0.31688 \n", - "[54]\tvalidation-logloss:0.31658 \n", - "[55]\tvalidation-logloss:0.31562 \n", - "[56]\tvalidation-logloss:0.31531 \n", - "[57]\tvalidation-logloss:0.31475 \n", - "[58]\tvalidation-logloss:0.31417 \n", - "[59]\tvalidation-logloss:0.31378 \n", - "[60]\tvalidation-logloss:0.31314 \n", - "[61]\tvalidation-logloss:0.31257 \n", - "[62]\tvalidation-logloss:0.31203 \n", - "[63]\tvalidation-logloss:0.31142 \n", - "[64]\tvalidation-logloss:0.31103 \n", - "[65]\tvalidation-logloss:0.31064 \n", - "[66]\tvalidation-logloss:0.31028 \n", - "[67]\tvalidation-logloss:0.31011 \n", - "[68]\tvalidation-logloss:0.30948 \n", - "[69]\tvalidation-logloss:0.30930 \n", - "[70]\tvalidation-logloss:0.30910 \n", - "[71]\tvalidation-logloss:0.30885 \n", - "[72]\tvalidation-logloss:0.30935 \n", - "[73]\tvalidation-logloss:0.30907 \n", - "[74]\tvalidation-logloss:0.30869 \n", - "[75]\tvalidation-logloss:0.30880 \n", - "[76]\tvalidation-logloss:0.30869 \n", - "[77]\tvalidation-logloss:0.30907 \n", - "[78]\tvalidation-logloss:0.30869 \n", - "[79]\tvalidation-logloss:0.30863 \n", - "[80]\tvalidation-logloss:0.30873 \n", - "[81]\tvalidation-logloss:0.30889 \n", - "[82]\tvalidation-logloss:0.30847 \n", - "[83]\tvalidation-logloss:0.30833 \n", - "[84]\tvalidation-logloss:0.30839 \n", - "[85]\tvalidation-logloss:0.30865 \n", - "[86]\tvalidation-logloss:0.30851 \n", - "[87]\tvalidation-logloss:0.30872 \n", - "[88]\tvalidation-logloss:0.30883 \n", - "[89]\tvalidation-logloss:0.30864 \n", - "[90]\tvalidation-logloss:0.30878 \n", - "[91]\tvalidation-logloss:0.30871 \n", - "[92]\tvalidation-logloss:0.30883 \n", - "[93]\tvalidation-logloss:0.30873 \n", - "[94]\tvalidation-logloss:0.30853 \n", - "[95]\tvalidation-logloss:0.30827 \n", - "[96]\tvalidation-logloss:0.30851 \n", - "[97]\tvalidation-logloss:0.30842 \n", - "[98]\tvalidation-logloss:0.30886 \n", - "[99]\tvalidation-logloss:0.30880 \n", - " 10%|█ | 1/10 [00:15<01:51, 12.40s/trial, best loss: -0.8633680208124874]" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/app-root/lib/python3.8/site-packages/mlflow/models/signature.py:129: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\n", - " inputs = _infer_schema(model_input)\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0]\tvalidation-logloss:0.64928 \n", - "[1]\tvalidation-logloss:0.61253 \n", - "[2]\tvalidation-logloss:0.57966 \n", - "[3]\tvalidation-logloss:0.55328 \n", - "[4]\tvalidation-logloss:0.52902 \n", - "[5]\tvalidation-logloss:0.50749 \n", - "[6]\tvalidation-logloss:0.48774 \n", - "[7]\tvalidation-logloss:0.47102 \n", - "[8]\tvalidation-logloss:0.45586 \n", - "[9]\tvalidation-logloss:0.44157 \n", - "[10]\tvalidation-logloss:0.42889 \n", - "[11]\tvalidation-logloss:0.41840 \n", - "[12]\tvalidation-logloss:0.40951 \n", - "[13]\tvalidation-logloss:0.40049 \n", - "[14]\tvalidation-logloss:0.39269 \n", - "[15]\tvalidation-logloss:0.38599 \n", - "[16]\tvalidation-logloss:0.37907 \n", - "[17]\tvalidation-logloss:0.37259 \n", - "[18]\tvalidation-logloss:0.36764 \n", - "[19]\tvalidation-logloss:0.36193 \n", - "[20]\tvalidation-logloss:0.35649 \n", - "[21]\tvalidation-logloss:0.35234 \n", - "[22]\tvalidation-logloss:0.34860 \n", - "[23]\tvalidation-logloss:0.34556 \n", - "[24]\tvalidation-logloss:0.34262 \n", - "[25]\tvalidation-logloss:0.34042 \n", - "[26]\tvalidation-logloss:0.33767 \n", - "[27]\tvalidation-logloss:0.33534 \n", - "[28]\tvalidation-logloss:0.33396 \n", - "[29]\tvalidation-logloss:0.33259 \n", - "[30]\tvalidation-logloss:0.33078 \n", - "[31]\tvalidation-logloss:0.32946 \n", - "[32]\tvalidation-logloss:0.32694 \n", - "[33]\tvalidation-logloss:0.32502 \n", - "[34]\tvalidation-logloss:0.32331 \n", - "[35]\tvalidation-logloss:0.32178 \n", - "[36]\tvalidation-logloss:0.32090 \n", - "[37]\tvalidation-logloss:0.31960 \n", - "[38]\tvalidation-logloss:0.31903 \n", - "[39]\tvalidation-logloss:0.31756 \n", - "[40]\tvalidation-logloss:0.31628 \n", - "[41]\tvalidation-logloss:0.31559 \n", - "[42]\tvalidation-logloss:0.31449 \n", - "[43]\tvalidation-logloss:0.31376 \n", - "[44]\tvalidation-logloss:0.31333 \n", - "[45]\tvalidation-logloss:0.31340 \n", - "[46]\tvalidation-logloss:0.31240 \n", - "[47]\tvalidation-logloss:0.31235 \n", - "[48]\tvalidation-logloss:0.31115 \n", - "[49]\tvalidation-logloss:0.31095 \n", - "[50]\tvalidation-logloss:0.31065 \n", - "[51]\tvalidation-logloss:0.31105 \n", - "[52]\tvalidation-logloss:0.31076 \n", - "[53]\tvalidation-logloss:0.31034 \n", - "[54]\tvalidation-logloss:0.31015 \n", - "[55]\tvalidation-logloss:0.30969 \n", - "[56]\tvalidation-logloss:0.30955 \n", - "[57]\tvalidation-logloss:0.30945 \n", - "[58]\tvalidation-logloss:0.30866 \n", - "[59]\tvalidation-logloss:0.30923 \n", - "[60]\tvalidation-logloss:0.30889 \n", - "[61]\tvalidation-logloss:0.30846 \n", - "[62]\tvalidation-logloss:0.30836 \n", - "[63]\tvalidation-logloss:0.30789 \n", - "[64]\tvalidation-logloss:0.30792 \n", - "[65]\tvalidation-logloss:0.30808 \n", - "[66]\tvalidation-logloss:0.30767 \n", - "[67]\tvalidation-logloss:0.30790 \n", - "[68]\tvalidation-logloss:0.30765 \n", - "[69]\tvalidation-logloss:0.30719 \n", - "[70]\tvalidation-logloss:0.30717 \n", - "[71]\tvalidation-logloss:0.30725 \n", - "[72]\tvalidation-logloss:0.30755 \n", - "[73]\tvalidation-logloss:0.30846 \n", - "[74]\tvalidation-logloss:0.30815 \n", - "[75]\tvalidation-logloss:0.30848 \n", - "[76]\tvalidation-logloss:0.30848 \n", - "[77]\tvalidation-logloss:0.30869 \n", - "[78]\tvalidation-logloss:0.30909 \n", - "[79]\tvalidation-logloss:0.30936 \n", - "[80]\tvalidation-logloss:0.31006 \n", - "[81]\tvalidation-logloss:0.30963 \n", - "[82]\tvalidation-logloss:0.30952 \n", - "[83]\tvalidation-logloss:0.30970 \n", - "[84]\tvalidation-logloss:0.30997 \n", - "[85]\tvalidation-logloss:0.31026 \n", - "[86]\tvalidation-logloss:0.30983 \n", - "[87]\tvalidation-logloss:0.31007 \n", - "[88]\tvalidation-logloss:0.31046 \n", - "[89]\tvalidation-logloss:0.31053 \n", - "[90]\tvalidation-logloss:0.31083 \n", - "[91]\tvalidation-logloss:0.31128 \n", - "[92]\tvalidation-logloss:0.31136 \n", - "[93]\tvalidation-logloss:0.31143 \n", - "[94]\tvalidation-logloss:0.31128 \n", - "[95]\tvalidation-logloss:0.31190 \n", - "[96]\tvalidation-logloss:0.31220 \n", - "[97]\tvalidation-logloss:0.31199 \n", - "[98]\tvalidation-logloss:0.31199 \n", - "[99]\tvalidation-logloss:0.31237 \n", - " 20%|██ | 2/10 [00:30<01:49, 13.65s/trial, best loss: -0.8922007050384075]" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/app-root/lib/python3.8/site-packages/mlflow/models/signature.py:129: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\n", - " inputs = _infer_schema(model_input)\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0]\tvalidation-logloss:0.44452 \n", - "[1]\tvalidation-logloss:0.38512 \n", - "[2]\tvalidation-logloss:0.37306 \n", - "[3]\tvalidation-logloss:0.35673 \n", - "[4]\tvalidation-logloss:0.35491 \n", - "[5]\tvalidation-logloss:0.35783 \n", - "[6]\tvalidation-logloss:0.36192 \n", - "[7]\tvalidation-logloss:0.35998 \n", - "[8]\tvalidation-logloss:0.36303 \n", - "[9]\tvalidation-logloss:0.36328 \n", - "[10]\tvalidation-logloss:0.36600 \n", - "[11]\tvalidation-logloss:0.36452 \n", - "[12]\tvalidation-logloss:0.36587 \n", - "[13]\tvalidation-logloss:0.37022 \n", - "[14]\tvalidation-logloss:0.37104 \n", - "[15]\tvalidation-logloss:0.37906 \n", - "[16]\tvalidation-logloss:0.38189 \n", - "[17]\tvalidation-logloss:0.38283 \n", - "[18]\tvalidation-logloss:0.38164 \n", - "[19]\tvalidation-logloss:0.38464 \n", - "[20]\tvalidation-logloss:0.38333 \n", - "[21]\tvalidation-logloss:0.38800 \n", - "[22]\tvalidation-logloss:0.39003 \n", - "[23]\tvalidation-logloss:0.39583 \n", - "[24]\tvalidation-logloss:0.39788 \n", - "[25]\tvalidation-logloss:0.39817 \n", - "[26]\tvalidation-logloss:0.40219 \n", - "[27]\tvalidation-logloss:0.40261 \n", - "[28]\tvalidation-logloss:0.40122 \n", - "[29]\tvalidation-logloss:0.40181 \n", - "[30]\tvalidation-logloss:0.40343 \n", - "[31]\tvalidation-logloss:0.40646 \n", - "[32]\tvalidation-logloss:0.40479 \n", - "[33]\tvalidation-logloss:0.40610 \n", - "[34]\tvalidation-logloss:0.40858 \n", - "[35]\tvalidation-logloss:0.41033 \n", - "[36]\tvalidation-logloss:0.41255 \n", - "[37]\tvalidation-logloss:0.41407 \n", - "[38]\tvalidation-logloss:0.41448 \n", - "[39]\tvalidation-logloss:0.41266 \n", - "[40]\tvalidation-logloss:0.41274 \n", - "[41]\tvalidation-logloss:0.41709 \n", - "[42]\tvalidation-logloss:0.41994 \n", - "[43]\tvalidation-logloss:0.42096 \n", - "[44]\tvalidation-logloss:0.42298 \n", - "[45]\tvalidation-logloss:0.42435 \n", - "[46]\tvalidation-logloss:0.42436 \n", - "[47]\tvalidation-logloss:0.42337 \n", - "[48]\tvalidation-logloss:0.42300 \n", - "[49]\tvalidation-logloss:0.42483 \n", - "[50]\tvalidation-logloss:0.42523 \n", - "[51]\tvalidation-logloss:0.42426 \n", - "[52]\tvalidation-logloss:0.42530 \n", - "[53]\tvalidation-logloss:0.42766 \n", - " 30%|███ | 3/10 [00:42<01:37, 13.93s/trial, best loss: -0.8922007050384075]" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/app-root/lib/python3.8/site-packages/mlflow/models/signature.py:129: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\n", - " inputs = _infer_schema(model_input)\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0]\tvalidation-logloss:0.56695 \n", - "[1]\tvalidation-logloss:0.49378 \n", - "[2]\tvalidation-logloss:0.44155 \n", - "[3]\tvalidation-logloss:0.40086 \n", - "[4]\tvalidation-logloss:0.37521 \n", - "[5]\tvalidation-logloss:0.35622 \n", - "[6]\tvalidation-logloss:0.34453 \n", - "[7]\tvalidation-logloss:0.33476 \n", - "[8]\tvalidation-logloss:0.32688 \n", - "[9]\tvalidation-logloss:0.32048 \n", - "[10]\tvalidation-logloss:0.31849 \n", - "[11]\tvalidation-logloss:0.31509 \n", - "[12]\tvalidation-logloss:0.31343 \n", - "[13]\tvalidation-logloss:0.31198 \n", - "[14]\tvalidation-logloss:0.31275 \n", - "[15]\tvalidation-logloss:0.31377 \n", - "[16]\tvalidation-logloss:0.31565 \n", - "[17]\tvalidation-logloss:0.31619 \n", - "[18]\tvalidation-logloss:0.31828 \n", - "[19]\tvalidation-logloss:0.31830 \n", - "[20]\tvalidation-logloss:0.31754 \n", - "[21]\tvalidation-logloss:0.31889 \n", - "[22]\tvalidation-logloss:0.31802 \n", - "[23]\tvalidation-logloss:0.31898 \n", - "[24]\tvalidation-logloss:0.32136 \n", - "[25]\tvalidation-logloss:0.32137 \n", - "[26]\tvalidation-logloss:0.32283 \n", - "[27]\tvalidation-logloss:0.32306 \n", - "[28]\tvalidation-logloss:0.32445 \n", - "[29]\tvalidation-logloss:0.32455 \n", - "[30]\tvalidation-logloss:0.32481 \n", - "[31]\tvalidation-logloss:0.32602 \n", - "[32]\tvalidation-logloss:0.32544 \n", - "[33]\tvalidation-logloss:0.32587 \n", - "[34]\tvalidation-logloss:0.32652 \n", - "[35]\tvalidation-logloss:0.32734 \n", - "[36]\tvalidation-logloss:0.32829 \n", - "[37]\tvalidation-logloss:0.32764 \n", - "[38]\tvalidation-logloss:0.32824 \n", - "[39]\tvalidation-logloss:0.32808 \n", - "[40]\tvalidation-logloss:0.32791 \n", - "[41]\tvalidation-logloss:0.32828 \n", - "[42]\tvalidation-logloss:0.32913 \n", - "[43]\tvalidation-logloss:0.32989 \n", - "[44]\tvalidation-logloss:0.33035 \n", - "[45]\tvalidation-logloss:0.33047 \n", - "[46]\tvalidation-logloss:0.33107 \n", - "[47]\tvalidation-logloss:0.33194 \n", - "[48]\tvalidation-logloss:0.33252 \n", - "[49]\tvalidation-logloss:0.33290 \n", - "[50]\tvalidation-logloss:0.33255 \n", - "[51]\tvalidation-logloss:0.33298 \n", - "[52]\tvalidation-logloss:0.33288 \n", - "[53]\tvalidation-logloss:0.33393 \n", - "[54]\tvalidation-logloss:0.33407 \n", - "[55]\tvalidation-logloss:0.33420 \n", - "[56]\tvalidation-logloss:0.33412 \n", - "[57]\tvalidation-logloss:0.33457 \n", - "[58]\tvalidation-logloss:0.33480 \n", - "[59]\tvalidation-logloss:0.33463 \n", - "[60]\tvalidation-logloss:0.33562 \n", - "[61]\tvalidation-logloss:0.33614 \n", - "[62]\tvalidation-logloss:0.33670 \n", - " 40%|████ | 4/10 [00:55<01:19, 13.23s/trial, best loss: -0.8922007050384075]" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/app-root/lib/python3.8/site-packages/mlflow/models/signature.py:129: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\n", - " inputs = _infer_schema(model_input)\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0]\tvalidation-logloss:0.65860 \n", - "[1]\tvalidation-logloss:0.62888 \n", - "[2]\tvalidation-logloss:0.60210 \n", - "[3]\tvalidation-logloss:0.57870 \n", - "[4]\tvalidation-logloss:0.55768 \n", - "[5]\tvalidation-logloss:0.53812 \n", - "[6]\tvalidation-logloss:0.52052 \n", - "[7]\tvalidation-logloss:0.50554 \n", - "[8]\tvalidation-logloss:0.49123 \n", - "[9]\tvalidation-logloss:0.47832 \n", - "[10]\tvalidation-logloss:0.46684 \n", - "[11]\tvalidation-logloss:0.45579 \n", - "[12]\tvalidation-logloss:0.44639 \n", - "[13]\tvalidation-logloss:0.43718 \n", - "[14]\tvalidation-logloss:0.42907 \n", - "[15]\tvalidation-logloss:0.42136 \n", - "[16]\tvalidation-logloss:0.41442 \n", - "[17]\tvalidation-logloss:0.40782 \n", - "[18]\tvalidation-logloss:0.40120 \n", - "[19]\tvalidation-logloss:0.39528 \n", - "[20]\tvalidation-logloss:0.39027 \n", - "[21]\tvalidation-logloss:0.38543 \n", - "[22]\tvalidation-logloss:0.38061 \n", - "[23]\tvalidation-logloss:0.37629 \n", - "[24]\tvalidation-logloss:0.37283 \n", - "[25]\tvalidation-logloss:0.36860 \n", - "[26]\tvalidation-logloss:0.36539 \n", - "[27]\tvalidation-logloss:0.36233 \n", - "[28]\tvalidation-logloss:0.35868 \n", - "[29]\tvalidation-logloss:0.35576 \n", - "[30]\tvalidation-logloss:0.35282 \n", - "[31]\tvalidation-logloss:0.35055 \n", - "[32]\tvalidation-logloss:0.34898 \n", - "[33]\tvalidation-logloss:0.34718 \n", - "[34]\tvalidation-logloss:0.34523 \n", - "[35]\tvalidation-logloss:0.34337 \n", - "[36]\tvalidation-logloss:0.34115 \n", - "[37]\tvalidation-logloss:0.33884 \n", - "[38]\tvalidation-logloss:0.33745 \n", - "[39]\tvalidation-logloss:0.33592 \n", - "[40]\tvalidation-logloss:0.33454 \n", - "[41]\tvalidation-logloss:0.33341 \n", - "[42]\tvalidation-logloss:0.33188 \n", - "[43]\tvalidation-logloss:0.33123 \n", - "[44]\tvalidation-logloss:0.33081 \n", - "[45]\tvalidation-logloss:0.33005 \n", - "[46]\tvalidation-logloss:0.32927 \n", - "[47]\tvalidation-logloss:0.32827 \n", - "[48]\tvalidation-logloss:0.32771 \n", - "[49]\tvalidation-logloss:0.32638 \n", - "[50]\tvalidation-logloss:0.32534 \n", - "[51]\tvalidation-logloss:0.32447 \n", - "[52]\tvalidation-logloss:0.32348 \n", - "[53]\tvalidation-logloss:0.32239 \n", - "[54]\tvalidation-logloss:0.32164 \n", - "[55]\tvalidation-logloss:0.32145 \n", - "[56]\tvalidation-logloss:0.32054 \n", - "[57]\tvalidation-logloss:0.32011 \n", - "[58]\tvalidation-logloss:0.31933 \n", - "[59]\tvalidation-logloss:0.31893 \n", - "[60]\tvalidation-logloss:0.31832 \n", - "[61]\tvalidation-logloss:0.31776 \n", - "[62]\tvalidation-logloss:0.31691 \n", - "[63]\tvalidation-logloss:0.31653 \n", - "[64]\tvalidation-logloss:0.31624 \n", - "[65]\tvalidation-logloss:0.31597 \n", - "[66]\tvalidation-logloss:0.31526 \n", - "[67]\tvalidation-logloss:0.31500 \n", - "[68]\tvalidation-logloss:0.31523 \n", - "[69]\tvalidation-logloss:0.31553 \n", - "[70]\tvalidation-logloss:0.31504 \n", - "[71]\tvalidation-logloss:0.31470 \n", - "[72]\tvalidation-logloss:0.31405 \n", - "[73]\tvalidation-logloss:0.31320 \n", - "[74]\tvalidation-logloss:0.31287 \n", - "[75]\tvalidation-logloss:0.31275 \n", - "[76]\tvalidation-logloss:0.31279 \n", - "[77]\tvalidation-logloss:0.31260 \n", - "[78]\tvalidation-logloss:0.31188 \n", - "[79]\tvalidation-logloss:0.31245 \n", - "[80]\tvalidation-logloss:0.31228 \n", - "[81]\tvalidation-logloss:0.31216 \n", - "[82]\tvalidation-logloss:0.31200 \n", - "[83]\tvalidation-logloss:0.31176 \n", - "[84]\tvalidation-logloss:0.31213 \n", - "[85]\tvalidation-logloss:0.31218 \n", - "[86]\tvalidation-logloss:0.31140 \n", - "[87]\tvalidation-logloss:0.31108 \n", - "[88]\tvalidation-logloss:0.31158 \n", - "[89]\tvalidation-logloss:0.31125 \n", - "[90]\tvalidation-logloss:0.31184 \n", - "[91]\tvalidation-logloss:0.31166 \n", - "[92]\tvalidation-logloss:0.31194 \n", - "[93]\tvalidation-logloss:0.31184 \n", - "[94]\tvalidation-logloss:0.31168 \n", - "[95]\tvalidation-logloss:0.31159 \n", - "[96]\tvalidation-logloss:0.31162 \n", - "[97]\tvalidation-logloss:0.31183 \n", - "[98]\tvalidation-logloss:0.31187 \n", - "[99]\tvalidation-logloss:0.31173 \n", - " 50%|█████ | 5/10 [01:09<01:05, 13.16s/trial, best loss: -0.8990124844137253]" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/app-root/lib/python3.8/site-packages/mlflow/models/signature.py:129: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\n", - " inputs = _infer_schema(model_input)\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0]\tvalidation-logloss:0.42932 \n", - "[1]\tvalidation-logloss:0.39324 \n", - "[2]\tvalidation-logloss:0.40056 \n", - "[3]\tvalidation-logloss:0.41010 \n", - "[4]\tvalidation-logloss:0.40816 \n", - "[5]\tvalidation-logloss:0.41112 \n", - "[6]\tvalidation-logloss:0.42020 \n", - "[7]\tvalidation-logloss:0.42298 \n", - "[8]\tvalidation-logloss:0.42552 \n", - "[9]\tvalidation-logloss:0.42105 \n", - "[10]\tvalidation-logloss:0.42624 \n", - "[11]\tvalidation-logloss:0.43340 \n", - "[12]\tvalidation-logloss:0.43680 \n", - "[13]\tvalidation-logloss:0.44089 \n", - "[14]\tvalidation-logloss:0.43846 \n", - "[15]\tvalidation-logloss:0.43967 \n", - "[16]\tvalidation-logloss:0.43642 \n", - "[17]\tvalidation-logloss:0.43892 \n", - "[18]\tvalidation-logloss:0.44035 \n", - "[19]\tvalidation-logloss:0.44177 \n", - "[20]\tvalidation-logloss:0.44254 \n", - "[21]\tvalidation-logloss:0.44911 \n", - "[22]\tvalidation-logloss:0.44750 \n", - "[23]\tvalidation-logloss:0.44964 \n", - "[24]\tvalidation-logloss:0.45131 \n", - "[25]\tvalidation-logloss:0.44954 \n", - "[26]\tvalidation-logloss:0.45093 \n", - "[27]\tvalidation-logloss:0.45663 \n", - "[28]\tvalidation-logloss:0.45510 \n", - "[29]\tvalidation-logloss:0.45451 \n", - "[30]\tvalidation-logloss:0.45456 \n", - "[31]\tvalidation-logloss:0.45562 \n", - "[32]\tvalidation-logloss:0.45818 \n", - "[33]\tvalidation-logloss:0.45927 \n", - "[34]\tvalidation-logloss:0.46194 \n", - "[35]\tvalidation-logloss:0.46172 \n", - "[36]\tvalidation-logloss:0.46339 \n", - "[37]\tvalidation-logloss:0.46478 \n", - "[38]\tvalidation-logloss:0.46743 \n", - "[39]\tvalidation-logloss:0.46883 \n", - "[40]\tvalidation-logloss:0.46953 \n", - "[41]\tvalidation-logloss:0.47075 \n", - "[42]\tvalidation-logloss:0.46811 \n", - "[43]\tvalidation-logloss:0.46913 \n", - "[44]\tvalidation-logloss:0.46751 \n", - "[45]\tvalidation-logloss:0.47039 \n", - "[46]\tvalidation-logloss:0.47111 \n", - "[47]\tvalidation-logloss:0.47470 \n", - "[48]\tvalidation-logloss:0.47745 \n", - "[49]\tvalidation-logloss:0.47837 \n", - "[50]\tvalidation-logloss:0.47768 \n", - " 60%|██████ | 6/10 [01:22<00:54, 13.74s/trial, best loss: -0.8990124844137253]" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/app-root/lib/python3.8/site-packages/mlflow/models/signature.py:129: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\n", - " inputs = _infer_schema(model_input)\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0]\tvalidation-logloss:0.61724 \n", - "[1]\tvalidation-logloss:0.56129 \n", - "[2]\tvalidation-logloss:0.51815 \n", - "[3]\tvalidation-logloss:0.48310 \n", - "[4]\tvalidation-logloss:0.45328 \n", - "[5]\tvalidation-logloss:0.42723 \n", - "[6]\tvalidation-logloss:0.40678 \n", - "[7]\tvalidation-logloss:0.39061 \n", - "[8]\tvalidation-logloss:0.37696 \n", - "[9]\tvalidation-logloss:0.36382 \n", - "[10]\tvalidation-logloss:0.35407 \n", - "[11]\tvalidation-logloss:0.34475 \n", - "[12]\tvalidation-logloss:0.33907 \n", - "[13]\tvalidation-logloss:0.33296 \n", - "[14]\tvalidation-logloss:0.32818 \n", - "[15]\tvalidation-logloss:0.32523 \n", - "[16]\tvalidation-logloss:0.32203 \n", - "[17]\tvalidation-logloss:0.32108 \n", - "[18]\tvalidation-logloss:0.31959 \n", - "[19]\tvalidation-logloss:0.31742 \n", - "[20]\tvalidation-logloss:0.31573 \n", - "[21]\tvalidation-logloss:0.31460 \n", - "[22]\tvalidation-logloss:0.31394 \n", - "[23]\tvalidation-logloss:0.31415 \n", - "[24]\tvalidation-logloss:0.31475 \n", - "[25]\tvalidation-logloss:0.31461 \n", - "[26]\tvalidation-logloss:0.31400 \n", - "[27]\tvalidation-logloss:0.31506 \n", - "[28]\tvalidation-logloss:0.31547 \n", - "[29]\tvalidation-logloss:0.31747 \n", - "[30]\tvalidation-logloss:0.31789 \n", - "[31]\tvalidation-logloss:0.31839 \n", - "[32]\tvalidation-logloss:0.31780 \n", - "[33]\tvalidation-logloss:0.31845 \n", - "[34]\tvalidation-logloss:0.31856 \n", - "[35]\tvalidation-logloss:0.32030 \n", - "[36]\tvalidation-logloss:0.32136 \n", - "[37]\tvalidation-logloss:0.32147 \n", - "[38]\tvalidation-logloss:0.32228 \n", - "[39]\tvalidation-logloss:0.32241 \n", - "[40]\tvalidation-logloss:0.32333 \n", - "[41]\tvalidation-logloss:0.32391 \n", - "[42]\tvalidation-logloss:0.32416 \n", - "[43]\tvalidation-logloss:0.32444 \n", - "[44]\tvalidation-logloss:0.32452 \n", - "[45]\tvalidation-logloss:0.32469 \n", - "[46]\tvalidation-logloss:0.32542 \n", - "[47]\tvalidation-logloss:0.32518 \n", - "[48]\tvalidation-logloss:0.32577 \n", - "[49]\tvalidation-logloss:0.32633 \n", - "[50]\tvalidation-logloss:0.32756 \n", - "[51]\tvalidation-logloss:0.32771 \n", - "[52]\tvalidation-logloss:0.32859 \n", - "[53]\tvalidation-logloss:0.33004 \n", - "[54]\tvalidation-logloss:0.33124 \n", - "[55]\tvalidation-logloss:0.33118 \n", - "[56]\tvalidation-logloss:0.33230 \n", - "[57]\tvalidation-logloss:0.33298 \n", - "[58]\tvalidation-logloss:0.33374 \n", - "[59]\tvalidation-logloss:0.33370 \n", - "[60]\tvalidation-logloss:0.33393 \n", - "[61]\tvalidation-logloss:0.33462 \n", - "[62]\tvalidation-logloss:0.33478 \n", - "[63]\tvalidation-logloss:0.33518 \n", - "[64]\tvalidation-logloss:0.33584 \n", - "[65]\tvalidation-logloss:0.33648 \n", - "[66]\tvalidation-logloss:0.33599 \n", - "[67]\tvalidation-logloss:0.33655 \n", - "[68]\tvalidation-logloss:0.33690 \n", - "[69]\tvalidation-logloss:0.33802 \n", - "[70]\tvalidation-logloss:0.33882 \n", - "[71]\tvalidation-logloss:0.33947 \n", - "[72]\tvalidation-logloss:0.34012 \n", - " 70%|███████ | 7/10 [01:36<00:39, 13.28s/trial, best loss: -0.8990124844137253]" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/app-root/lib/python3.8/site-packages/mlflow/models/signature.py:129: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\n", - " inputs = _infer_schema(model_input)\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0]\tvalidation-logloss:0.65597 \n", - "[1]\tvalidation-logloss:0.62338 \n", - "[2]\tvalidation-logloss:0.59350 \n", - "[3]\tvalidation-logloss:0.56914 \n", - "[4]\tvalidation-logloss:0.54644 \n", - "[5]\tvalidation-logloss:0.52693 \n", - "[6]\tvalidation-logloss:0.50854 \n", - "[7]\tvalidation-logloss:0.49154 \n", - "[8]\tvalidation-logloss:0.47700 \n", - "[9]\tvalidation-logloss:0.46381 \n", - "[10]\tvalidation-logloss:0.45050 \n", - "[11]\tvalidation-logloss:0.43849 \n", - "[12]\tvalidation-logloss:0.42775 \n", - "[13]\tvalidation-logloss:0.41765 \n", - "[14]\tvalidation-logloss:0.40835 \n", - "[15]\tvalidation-logloss:0.40034 \n", - "[16]\tvalidation-logloss:0.39337 \n", - "[17]\tvalidation-logloss:0.38604 \n", - "[18]\tvalidation-logloss:0.38021 \n", - "[19]\tvalidation-logloss:0.37427 \n", - "[20]\tvalidation-logloss:0.36930 \n", - "[21]\tvalidation-logloss:0.36503 \n", - "[22]\tvalidation-logloss:0.36102 \n", - "[23]\tvalidation-logloss:0.35654 \n", - "[24]\tvalidation-logloss:0.35270 \n", - "[25]\tvalidation-logloss:0.34936 \n", - "[26]\tvalidation-logloss:0.34621 \n", - "[27]\tvalidation-logloss:0.34330 \n", - "[28]\tvalidation-logloss:0.33954 \n", - "[29]\tvalidation-logloss:0.33645 \n", - "[30]\tvalidation-logloss:0.33361 \n", - "[31]\tvalidation-logloss:0.33187 \n", - "[32]\tvalidation-logloss:0.33028 \n", - "[33]\tvalidation-logloss:0.32814 \n", - "[34]\tvalidation-logloss:0.32791 \n", - "[35]\tvalidation-logloss:0.32613 \n", - "[36]\tvalidation-logloss:0.32440 \n", - "[37]\tvalidation-logloss:0.32372 \n", - "[38]\tvalidation-logloss:0.32295 \n", - "[39]\tvalidation-logloss:0.32168 \n", - "[40]\tvalidation-logloss:0.32060 \n", - "[41]\tvalidation-logloss:0.31976 \n", - "[42]\tvalidation-logloss:0.31886 \n", - "[43]\tvalidation-logloss:0.31840 \n", - "[44]\tvalidation-logloss:0.31685 \n", - "[45]\tvalidation-logloss:0.31590 \n", - "[46]\tvalidation-logloss:0.31450 \n", - "[47]\tvalidation-logloss:0.31419 \n", - "[48]\tvalidation-logloss:0.31348 \n", - "[49]\tvalidation-logloss:0.31344 \n", - "[50]\tvalidation-logloss:0.31316 \n", - "[51]\tvalidation-logloss:0.31244 \n", - "[52]\tvalidation-logloss:0.31219 \n", - "[53]\tvalidation-logloss:0.31124 \n", - "[54]\tvalidation-logloss:0.31058 \n", - "[55]\tvalidation-logloss:0.31009 \n", - "[56]\tvalidation-logloss:0.30970 \n", - "[57]\tvalidation-logloss:0.30989 \n", - "[58]\tvalidation-logloss:0.30933 \n", - "[59]\tvalidation-logloss:0.30969 \n", - "[60]\tvalidation-logloss:0.30924 \n", - "[61]\tvalidation-logloss:0.30882 \n", - "[62]\tvalidation-logloss:0.30780 \n", - "[63]\tvalidation-logloss:0.30772 \n", - "[64]\tvalidation-logloss:0.30751 \n", - "[65]\tvalidation-logloss:0.30751 \n", - "[66]\tvalidation-logloss:0.30702 \n", - "[67]\tvalidation-logloss:0.30709 \n", - "[68]\tvalidation-logloss:0.30667 \n", - "[69]\tvalidation-logloss:0.30674 \n", - "[70]\tvalidation-logloss:0.30659 \n", - "[71]\tvalidation-logloss:0.30628 \n", - "[72]\tvalidation-logloss:0.30622 \n", - "[73]\tvalidation-logloss:0.30611 \n", - "[74]\tvalidation-logloss:0.30597 \n", - "[75]\tvalidation-logloss:0.30635 \n", - "[76]\tvalidation-logloss:0.30636 \n", - "[77]\tvalidation-logloss:0.30573 \n", - "[78]\tvalidation-logloss:0.30526 \n", - "[79]\tvalidation-logloss:0.30570 \n", - "[80]\tvalidation-logloss:0.30604 \n", - "[81]\tvalidation-logloss:0.30574 \n", - "[82]\tvalidation-logloss:0.30548 \n", - "[83]\tvalidation-logloss:0.30558 \n", - "[84]\tvalidation-logloss:0.30559 \n", - "[85]\tvalidation-logloss:0.30583 \n", - "[86]\tvalidation-logloss:0.30603 \n", - "[87]\tvalidation-logloss:0.30640 \n", - "[88]\tvalidation-logloss:0.30655 \n", - "[89]\tvalidation-logloss:0.30676 \n", - "[90]\tvalidation-logloss:0.30665 \n", - "[91]\tvalidation-logloss:0.30703 \n", - "[92]\tvalidation-logloss:0.30689 \n", - "[93]\tvalidation-logloss:0.30701 \n", - "[94]\tvalidation-logloss:0.30730 \n", - "[95]\tvalidation-logloss:0.30752 \n", - "[96]\tvalidation-logloss:0.30731 \n", - "[97]\tvalidation-logloss:0.30750 \n", - "[98]\tvalidation-logloss:0.30737 \n", - "[99]\tvalidation-logloss:0.30738 \n", - " 80%|████████ | 8/10 [01:51<00:27, 13.65s/trial, best loss: -0.8990124844137253]" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/app-root/lib/python3.8/site-packages/mlflow/models/signature.py:129: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\n", - " inputs = _infer_schema(model_input)\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0]\tvalidation-logloss:0.65702 \n", - "[1]\tvalidation-logloss:0.62577 \n", - "[2]\tvalidation-logloss:0.59710 \n", - "[3]\tvalidation-logloss:0.57311 \n", - "[4]\tvalidation-logloss:0.55046 \n", - "[5]\tvalidation-logloss:0.53164 \n", - "[6]\tvalidation-logloss:0.51396 \n", - "[7]\tvalidation-logloss:0.49871 \n", - "[8]\tvalidation-logloss:0.48454 \n", - "[9]\tvalidation-logloss:0.47101 \n", - "[10]\tvalidation-logloss:0.45840 \n", - "[11]\tvalidation-logloss:0.44730 \n", - "[12]\tvalidation-logloss:0.43741 \n", - "[13]\tvalidation-logloss:0.42839 \n", - "[14]\tvalidation-logloss:0.41996 \n", - "[15]\tvalidation-logloss:0.41202 \n", - "[16]\tvalidation-logloss:0.40536 \n", - "[17]\tvalidation-logloss:0.39882 \n", - "[18]\tvalidation-logloss:0.39293 \n", - "[19]\tvalidation-logloss:0.38739 \n", - "[20]\tvalidation-logloss:0.38258 \n", - "[21]\tvalidation-logloss:0.37814 \n", - "[22]\tvalidation-logloss:0.37355 \n", - "[23]\tvalidation-logloss:0.36959 \n", - "[24]\tvalidation-logloss:0.36643 \n", - "[25]\tvalidation-logloss:0.36290 \n", - "[26]\tvalidation-logloss:0.35995 \n", - "[27]\tvalidation-logloss:0.35751 \n", - "[28]\tvalidation-logloss:0.35510 \n", - "[29]\tvalidation-logloss:0.35303 \n", - "[30]\tvalidation-logloss:0.35114 \n", - "[31]\tvalidation-logloss:0.34883 \n", - "[32]\tvalidation-logloss:0.34649 \n", - "[33]\tvalidation-logloss:0.34441 \n", - "[34]\tvalidation-logloss:0.34323 \n", - "[35]\tvalidation-logloss:0.34123 \n", - "[36]\tvalidation-logloss:0.33954 \n", - "[37]\tvalidation-logloss:0.33859 \n", - "[38]\tvalidation-logloss:0.33794 \n", - "[39]\tvalidation-logloss:0.33690 \n", - "[40]\tvalidation-logloss:0.33546 \n", - "[41]\tvalidation-logloss:0.33384 \n", - "[42]\tvalidation-logloss:0.33290 \n", - "[43]\tvalidation-logloss:0.33248 \n", - "[44]\tvalidation-logloss:0.33231 \n", - "[45]\tvalidation-logloss:0.33139 \n", - "[46]\tvalidation-logloss:0.33070 \n", - "[47]\tvalidation-logloss:0.32985 \n", - "[48]\tvalidation-logloss:0.32950 \n", - "[49]\tvalidation-logloss:0.32878 \n", - "[50]\tvalidation-logloss:0.32798 \n", - "[51]\tvalidation-logloss:0.32706 \n", - "[52]\tvalidation-logloss:0.32602 \n", - "[53]\tvalidation-logloss:0.32508 \n", - "[54]\tvalidation-logloss:0.32440 \n", - "[55]\tvalidation-logloss:0.32343 \n", - "[56]\tvalidation-logloss:0.32260 \n", - "[57]\tvalidation-logloss:0.32177 \n", - "[58]\tvalidation-logloss:0.32132 \n", - "[59]\tvalidation-logloss:0.32068 \n", - "[60]\tvalidation-logloss:0.31944 \n", - "[61]\tvalidation-logloss:0.31925 \n", - "[62]\tvalidation-logloss:0.31873 \n", - "[63]\tvalidation-logloss:0.31814 \n", - "[64]\tvalidation-logloss:0.31807 \n", - "[65]\tvalidation-logloss:0.31760 \n", - "[66]\tvalidation-logloss:0.31730 \n", - "[67]\tvalidation-logloss:0.31684 \n", - "[68]\tvalidation-logloss:0.31663 \n", - "[69]\tvalidation-logloss:0.31657 \n", - "[70]\tvalidation-logloss:0.31650 \n", - "[71]\tvalidation-logloss:0.31569 \n", - "[72]\tvalidation-logloss:0.31466 \n", - "[73]\tvalidation-logloss:0.31462 \n", - "[74]\tvalidation-logloss:0.31426 \n", - "[75]\tvalidation-logloss:0.31395 \n", - "[76]\tvalidation-logloss:0.31369 \n", - "[77]\tvalidation-logloss:0.31315 \n", - "[78]\tvalidation-logloss:0.31290 \n", - "[79]\tvalidation-logloss:0.31303 \n", - "[80]\tvalidation-logloss:0.31275 \n", - "[81]\tvalidation-logloss:0.31255 \n", - "[82]\tvalidation-logloss:0.31278 \n", - "[83]\tvalidation-logloss:0.31270 \n", - "[84]\tvalidation-logloss:0.31266 \n", - "[85]\tvalidation-logloss:0.31258 \n", - "[86]\tvalidation-logloss:0.31252 \n", - "[87]\tvalidation-logloss:0.31239 \n", - "[88]\tvalidation-logloss:0.31204 \n", - "[89]\tvalidation-logloss:0.31141 \n", - "[90]\tvalidation-logloss:0.31104 \n", - "[91]\tvalidation-logloss:0.31091 \n", - "[92]\tvalidation-logloss:0.31090 \n", - "[93]\tvalidation-logloss:0.31114 \n", - "[94]\tvalidation-logloss:0.31106 \n", - "[95]\tvalidation-logloss:0.31056 \n", - "[96]\tvalidation-logloss:0.31044 \n", - "[97]\tvalidation-logloss:0.31022 \n", - "[98]\tvalidation-logloss:0.31044 \n", - "[99]\tvalidation-logloss:0.31037 \n", - " 90%|█████████ | 9/10 [02:05<00:13, 13.90s/trial, best loss: -0.8990124844137253]" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/app-root/lib/python3.8/site-packages/mlflow/models/signature.py:129: UserWarning: Hint: Inferred schema contains integer column(s). Integer columns in Python cannot represent missing values. If your input data contains missing values at inference time, it will be encoded as floats and will cause a schema enforcement error. The best way to avoid this problem is to infer the model schema based on a realistic data sample (training dataset) that includes missing values. Alternatively, you can declare integer columns as doubles (float64) whenever these columns may have missing values. See `Handling Integers With Missing Values `_ for more details.\n", - " inputs = _infer_schema(model_input)\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [02:17<00:00, 13.72s/trial, best loss: -0.8990124844137253]\n" - ] - } - ], + "outputs": [], "source": [ "search_space = {\n", " 'max_depth': scope.int(hp.quniform('max_depth', 50, 100, 10)),\n", @@ -2282,18 +706,10 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "id": "12fb65af-5545-4563-a70a-ad62d11e6615", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "AUC of Best Run: 0.8990124844137253\n" - ] - } - ], + "outputs": [], "source": [ "best_run = mlflow.search_runs(order_by=['metrics.auc DESC']).iloc[0]\n", "best_run_id = best_run[\"run_id\"]\n", @@ -2302,21 +718,10 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "id": "2df971e0-1748-489c-b36d-dd481c211a0d", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'fbd116d8519d4119b32f0d7b7d56c980'" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "best_run_id" ] @@ -2333,18 +738,10 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "id": "db412034-daab-4942-b3ae-0c5410a3e5a5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "AUC: 0.903522359913793\n" - ] - } - ], + "outputs": [], "source": [ "# model = mlflow.pyfunc.load_model(f\"models:/TestModelD/production\")\n", "model = mlflow.pyfunc.load_model(\"runs:/\" + best_run_id + \"/model\")\n", @@ -2355,26 +752,10 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "id": "b5593581-c563-4c1a-aa80-f10d77f53209", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " precision recall f1-score support\n", - "\n", - " white wine 0.90 0.95 0.92 1044\n", - " red wine 0.73 0.57 0.64 256\n", - "\n", - " accuracy 0.87 1300\n", - " macro avg 0.81 0.76 0.78 1300\n", - "weighted avg 0.87 0.87 0.87 1300\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "from sklearn.metrics import classification_report\n", "\n", @@ -2385,23 +766,10 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "id": "b0ebe7ec-a7e2-49bc-88bb-2b5ea79f3807", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "cm = confusion_matrix(y_test, test_predictions)\n", "disp = ConfusionMatrixDisplay(confusion_matrix=cm)\n", @@ -2412,20 +780,10 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "id": "d9f40cc8-9a79-4521-9783-6a3aa0b0127a", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Successfully registered model 'WineQuality'.\n", - "2022/10/14 04:40:04 INFO mlflow.tracking._model_registry.client: Waiting up to 300 seconds for model version to finish creation. Model name: WineQuality, version 1\n", - "Created version '1' of model 'WineQuality'.\n" - ] - } - ], + "outputs": [], "source": [ "# register the best model\n", "new_model_version = mlflow.register_model(f\"runs:/{best_run_id}/model\", \"WineQuality\")"