2021-02-05 21:41:14 -08:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Copyright (c) 2020-2021 Microsoft Corporation. All rights reserved. \n",
"\n",
"Licensed under the MIT License.\n",
"\n",
"# Run FLAML in AzureML\n",
"\n",
"\n",
"## 1. Introduction\n",
"\n",
"FLAML is a Python library (https://github.com/microsoft/FLAML) designed to automatically produce accurate machine learning models \n",
"with low computational cost. It is fast and cheap. The simple and lightweight design makes it easy \n",
"to use and extend, such as adding new learners. FLAML can \n",
"- serve as an economical AutoML engine,\n",
"- be used as a fast hyperparameter tuning tool, or \n",
"- be embedded in self-tuning software that requires low latency & resource in repetitive\n",
" tuning tasks.\n",
"\n",
2021-02-22 22:10:41 -08:00
"In this notebook, we use one real data example (binary classification) to showcase how to use FLAML library together with AzureML.\n",
2021-02-05 21:41:14 -08:00
"\n",
"FLAML requires `Python>=3.6`. To run this notebook example, please install flaml with the `notebook` and `azureml` option:\n",
"```bash\n",
"pip install flaml[notebook,azureml]\n",
"```"
]
},
{
"cell_type": "code",
2021-02-17 14:03:19 -08:00
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"!pip install flaml[notebook,azureml]"
]
},
2021-02-22 22:10:41 -08:00
{
"source": [
"### Enable mlflow in AzureML workspace"
],
"cell_type": "markdown",
"metadata": {}
},
2021-02-17 14:03:19 -08:00
{
"cell_type": "code",
2021-02-22 22:10:41 -08:00
"execution_count": 1,
2021-02-05 21:41:14 -08:00
"metadata": {},
"outputs": [],
"source": [
"import mlflow\n",
"from azureml.core import Workspace\n",
"\n",
"ws = Workspace.from_config()\n",
"mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri())"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
2021-02-22 22:10:41 -08:00
"## 2. Classification Example\n",
2021-02-05 21:41:14 -08:00
"### Load data and preprocess\n",
"\n",
"Download [Airlines dataset](https://www.openml.org/d/1169) from OpenML. The task is to predict whether a given flight will be delayed, given the information of the scheduled departure."
]
},
{
"cell_type": "code",
2021-02-22 22:10:41 -08:00
"execution_count": 2,
2021-02-05 21:41:14 -08:00
"metadata": {
"slideshow": {
"slide_type": "subslide"
},
"tags": []
},
"outputs": [
{
"output_type": "stream",
2021-02-22 22:10:41 -08:00
"name": "stdout",
2021-02-05 21:41:14 -08:00
"text": [
2021-02-22 22:10:41 -08:00
"load dataset from ./openml_ds1169.pkl\n",
2021-02-05 21:41:14 -08:00
"Dataset name: airlines\n",
"X_train.shape: (404537, 7), y_train.shape: (404537,);\n",
"X_test.shape: (134846, 7), y_test.shape: (134846,)\n"
]
}
],
"source": [
"from flaml.data import load_openml_dataset\n",
2021-04-08 09:29:55 -07:00
"X_train, X_test, y_train, y_test = load_openml_dataset(dataset_id=1169, data_dir='./')"
2021-02-05 21:41:14 -08:00
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Run FLAML\n",
"In the FLAML automl run configuration, users can specify the task type, time budget, error metric, learner list, whether to subsample, resampling strategy type, and so on. All these arguments have default values which will be used if users do not provide them. For example, the default ML learners of FLAML are `['lgbm', 'xgboost', 'catboost', 'rf', 'extra_tree', 'lrl1']`. "
]
},
{
"cell_type": "code",
2021-02-22 22:10:41 -08:00
"execution_count": 3,
2021-02-05 21:41:14 -08:00
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [],
"source": [
"''' import AutoML class from flaml package '''\n",
"from flaml import AutoML\n",
"automl = AutoML()"
]
},
{
"cell_type": "code",
2021-02-22 22:10:41 -08:00
"execution_count": 4,
2021-02-05 21:41:14 -08:00
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [],
"source": [
"settings = {\n",
2021-04-08 09:29:55 -07:00
" \"time_budget\": 60, # total running time in seconds\n",
" \"metric\": 'accuracy', # primary metrics can be chosen from: ['accuracy','roc_auc','f1','log_loss','mae','mse','r2']\n",
" \"estimator_list\": ['lgbm', 'rf', 'xgboost'], # list of ML learners\n",
" \"task\": 'classification', # task type \n",
" \"sample\": False, # whether to subsample training data\n",
" \"log_file_name\": 'airlines_experiment.log', # flaml log file\n",
2021-02-05 21:41:14 -08:00
"}"
]
},
{
"cell_type": "code",
2021-02-22 22:10:41 -08:00
"execution_count": 5,
2021-02-05 21:41:14 -08:00
"metadata": {
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
2021-04-08 09:29:55 -07:00
"outputs": [],
2021-02-05 21:41:14 -08:00
"source": [
"mlflow.set_experiment(\"flaml\")\n",
"with mlflow.start_run() as run:\n",
2021-02-22 22:10:41 -08:00
" '''The main flaml automl API'''\n",
2021-04-08 09:29:55 -07:00
" automl.fit(X_train=X_train, y_train=y_train, **settings)"
2021-02-05 21:41:14 -08:00
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Best model and metric"
]
},
{
"cell_type": "code",
2021-02-22 22:10:41 -08:00
"execution_count": 6,
2021-02-05 21:41:14 -08:00
"metadata": {
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
2021-04-08 09:29:55 -07:00
"Best ML leaner: lgbm\nBest hyperparmeter config: {'n_estimators': 4, 'num_leaves': 4, 'min_child_samples': 20, 'learning_rate': 0.1, 'subsample': 1.0, 'log_max_bin': 8, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0}\nBest accuracy on validation data: 0.6229\nTraining duration of best run: 0.9182 s\n"
2021-02-05 21:41:14 -08:00
]
}
],
"source": [
"''' retrieve best config and best learner'''\n",
"print('Best ML leaner:', automl.best_estimator)\n",
"print('Best hyperparmeter config:', automl.best_config)\n",
2021-04-08 09:29:55 -07:00
"print('Best accuracy on validation data: {0:.4g}'.format(1 - automl.best_loss))\n",
2021-02-05 21:41:14 -08:00
"print('Training duration of best run: {0:.4g} s'.format(automl.best_config_train_time))"
]
},
{
"cell_type": "code",
2021-02-22 22:10:41 -08:00
"execution_count": 7,
2021-02-05 21:41:14 -08:00
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
2021-04-08 09:29:55 -07:00
"LGBMClassifier(max_bin=255, n_estimators=4, num_leaves=4, objective='binary',\n",
" reg_alpha=0.0009765625, reg_lambda=1.0)"
2021-02-05 21:41:14 -08:00
]
},
"metadata": {},
2021-02-22 22:10:41 -08:00
"execution_count": 7
2021-02-05 21:41:14 -08:00
}
],
"source": [
"automl.model"
]
},
{
"cell_type": "code",
2021-02-22 22:10:41 -08:00
"execution_count": 8,
2021-02-05 21:41:14 -08:00
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [],
"source": [
2021-03-16 22:13:35 -07:00
"''' pickle and save the automl object '''\n",
2021-02-05 21:41:14 -08:00
"import pickle\n",
2021-03-16 22:13:35 -07:00
"with open('automl.pkl', 'wb') as f:\n",
" pickle.dump(automl, f, pickle.HIGHEST_PROTOCOL)"
2021-02-05 21:41:14 -08:00
]
},
{
"cell_type": "code",
2021-02-22 22:10:41 -08:00
"execution_count": 9,
2021-02-05 21:41:14 -08:00
"metadata": {
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
2021-04-08 09:29:55 -07:00
"Predicted labels [1 0 1 ... 0 0 0]\nTrue labels [0 0 0 ... 0 1 0]\n"
2021-02-05 21:41:14 -08:00
]
}
],
"source": [
"''' compute predictions of testing dataset ''' \n",
"y_pred = automl.predict(X_test)\n",
"print('Predicted labels', y_pred)\n",
"print('True labels', y_test)\n",
"y_pred_proba = automl.predict_proba(X_test)[:,1]"
]
},
{
"cell_type": "code",
2021-02-22 22:10:41 -08:00
"execution_count": 10,
2021-02-05 21:41:14 -08:00
"metadata": {
"slideshow": {
"slide_type": "slide"
},
"tags": []
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
2021-04-08 09:29:55 -07:00
"accuracy = 0.6262773830888569\nroc_auc = 0.6402112531029138\nlog_loss = 0.6637970847245668\nf1 = 0.35105656927257045\n"
2021-02-05 21:41:14 -08:00
]
}
],
"source": [
"''' compute different metric values on testing dataset'''\n",
"from flaml.ml import sklearn_metric_loss_score\n",
"print('accuracy', '=', 1 - sklearn_metric_loss_score('accuracy', y_pred, y_test))\n",
"print('roc_auc', '=', 1 - sklearn_metric_loss_score('roc_auc', y_pred_proba, y_test))\n",
"print('log_loss', '=', sklearn_metric_loss_score('log_loss', y_pred_proba, y_test))\n",
"print('f1', '=', 1 - sklearn_metric_loss_score('f1', y_pred, y_test))"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### Log history"
]
},
{
"cell_type": "code",
2021-02-22 22:10:41 -08:00
"execution_count": 11,
2021-02-05 21:41:14 -08:00
"metadata": {
"slideshow": {
"slide_type": "subslide"
},
"tags": []
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
2021-04-08 09:29:55 -07:00
"{'Current Learner': 'lgbm', 'Current Sample': 364083, 'Current Hyper-parameters': {'n_estimators': 4, 'num_leaves': 4, 'min_child_samples': 20, 'learning_rate': 0.1, 'subsample': 1.0, 'log_max_bin': 8, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 4, 'num_leaves': 4, 'min_child_samples': 20, 'learning_rate': 0.1, 'subsample': 1.0, 'log_max_bin': 8, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0}}\n"
2021-02-05 21:41:14 -08:00
]
}
],
"source": [
"from flaml.data import get_output_from_log\n",
"time_history, best_valid_loss_history, valid_loss_history, config_history, train_loss_history = \\\n",
" get_output_from_log(filename = settings['log_file_name'], time_budget = 60)\n",
"\n",
"for config in config_history:\n",
" print(config)"
]
},
{
"cell_type": "code",
2021-02-22 22:10:41 -08:00
"execution_count": 12,
2021-02-05 21:41:14 -08:00
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
2021-04-08 09:29:55 -07:00
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Created with matplotlib (https://matplotlib.org/) -->\n<svg height=\"277.314375pt\" version=\"1.1\" viewBox=\"0 0 392.14375 277.314375\" width=\"392.14375pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <defs>\n <style type=\"text/css\">\n*{stroke-linecap:butt;stroke-linejoin:round;}\n </style>\n </defs>\n <g id=\"figure_1\">\n <g id=\"patch_1\">\n <path d=\"M 0 277.314375 \nL 392.14375 277.314375 \nL 392.14375 0 \nL 0 0 \nz\n\" style=\"fill:none;\"/>\n </g>\n <g id=\"axes_1\">\n <g id=\"patch_2\">\n <path d=\"M 50.14375 239.758125 \nL 384.94375 239.758125 \nL 384.94375 22.318125 \nL 50.14375 22.318125 \nz\n\" style=\"fill:#ffffff;\"/>\n </g>\n <g id=\"PathCollection_1\">\n <defs>\n <path d=\"M 0 3 \nC 0.795609 3 1.55874 2.683901 2.12132 2.12132 \nC 2.683901 1.55874 3 0.795609 3 0 \nC 3 -0.795609 2.683901 -1.55874 2.12132 -2.12132 \nC 1.55874 -2.683901 0.795609 -3 0 -3 \nC -0.795609 -3 -1.55874 -2.683901 -2.12132 -2.12132 \nC -2.683901 -1.55874 -3 -0.795609 -3 0 \nC -3 0.795609 -2.683901 1.55874 -2.12132 2.12132 \nC -1.55874 2.683901 -0.795609 3 0 3 \nz\n\" id=\"mdbf510a908\" style=\"stroke:#1f77b4;\"/>\n </defs>\n <g clip-path=\"url(#p19a7fa11b4)\">\n <use style=\"fill:#1f77b4;stroke:#1f77b4;\" x=\"217.54375\" xlink:href=\"#mdbf510a908\" y=\"131.038125\"/>\n </g>\n </g>\n <g id=\"matplotlib.axis_1\">\n <g id=\"xtick_1\">\n <g id=\"line2d_1\">\n <defs>\n <path d=\"M 0 0 \nL 0 3.5 \n\" id=\"m2c2f88afa5\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n </defs>\n <g>\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"97.213963\" xlink:href=\"#m2c2f88afa5\" y=\"239.758125\"/>\n </g>\n </g>\n <g id=\"text_1\">\n <!-- 1.16 -->\n <defs>\n <path d=\"M 12.40625 8.296875 \nL 28.515625 8.296875 \nL 28.515625 63.921875 \nL 10.984375 60.40625 \nL 10.984375 69.390625 \nL 28.421875 72.90625 \nL 38.28125 72.90625 \nL 38.28125 8.296875 \nL 54.390625 8.296875 \nL 54.390625 0 \nL 12.40625 0 \nz\n\" id=\"DejaVuSans-49\"/>\n <path d=\"M 10.6875 12.40625 \nL 21 12.40625 \nL 21 0 \nL 10.6875 0 \nz\n\" id=\"DejaVuSans-46\"/>\n <path d=\"M 33.015625 40.375 \nQ 26.375 40.375 22.484375 35.828125 \nQ 18.609375 31.296875 18.609375 23.390625 \nQ 18.609375 15.53125 22.484375 10.953125 \nQ 26.375 6.390625 33.015625 6.390625 \nQ 39.65625 6.390625 43.53125 10.953125 \nQ 47.40625 15.53125 47.40625 23.390625 \nQ 47.40625 31.296875 43.53125 35.828125 \nQ 39.65625 40.375 33.015625 40.375 \nz\nM 52.59375 71.296875 \nL 52.59375 62.3125 \nQ 48.875 64.0625 45.09375 64.984375 \nQ 41.3125 65.921875 37.59375 65.921875 \nQ 27.828125 65.921875 22.671875 59.328125 \nQ 17.53125 52.734375 16.796875 39.40625 \nQ 19.671875 43.65625 24.015625 45.921875 \nQ 28.375 48.1875 33.59375 48.1875 \nQ 44.578125 48.1875 50.953125 41.515625 \nQ 57.328125 34.859375 57.328125 23.390625 \nQ 57.328125 12.15625 50.6875 5.359375 \nQ 44.046875 -1.421875 33.015625 -1.421875 \nQ 20.359375 -1.421875 13.671875 8.265625 \nQ 6.984375 17.96875 6.984375 36.375 \nQ 6.984375 53.65625 15.1875 63.9375 \nQ 23.390625 74.21875 37.203125 74.21875 \nQ 40.921875 74.21875 44.703125 73.484375 \nQ 48.484375 72.75 52.59375 71.296875 \nz\n\" id=\"DejaVuSans-54\"/>\n </defs>\n <g transform=\"translate(86.08115 254.356562)scale(0.1 -0.1)\">\n <use xlink:href=\"#DejaVuSans-49\"/>\n <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n <use x=\"95.410156\" xlink:href=\"#DejaVuSans-49\"/>\n <use x=\"159.033203\" xlink:href=\"#DejaVuSans-54\"/>\n </g>\n </g>\n </g>\n <g id=\"xtick_2\">\n <g id=\"line2d_2\">\n <g>\n <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"147.6158\" xlink:href=\"#m2c2f88afa5\" y=\"239.758125\"/>\n </g>\n </g>\n <g id=\"text_2\">\n <!-- 1.18 -->\n <defs>\n
"image/png": "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
2021-02-05 21:41:14 -08:00
},
"metadata": {
"needs_background": "light"
}
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"plt.title('Learning Curve')\n",
"plt.xlabel('Wall Clock Time (s)')\n",
"plt.ylabel('Validation Accuracy')\n",
2021-04-08 09:29:55 -07:00
"plt.scatter(time_history, 1 - np.array(valid_loss_history))\n",
"plt.step(time_history, 1 - np.array(best_valid_loss_history), where='post')\n",
2021-02-05 21:41:14 -08:00
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"name": "python3",
2021-04-08 09:29:55 -07:00
"display_name": "Python 3.8.0 64-bit ('blend': conda)",
2021-02-05 21:41:14 -08:00
"metadata": {
"interpreter": {
2021-04-08 09:29:55 -07:00
"hash": "0cfea3304185a9579d09e0953576b57c8581e46e6ebc6dfeb681bc5a511f7544"
2021-02-05 21:41:14 -08:00
}
}
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
2021-04-08 09:29:55 -07:00
"version": "3.8.0"
2021-02-05 21:41:14 -08:00
}
},
"nbformat": 4,
"nbformat_minor": 2
}