{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Automate Machine Learning with TPOT\n", "===================================\n", "\n", "This example shows how [TPOT](https://epistasislab.github.io/tpot/) can be used with Dask.\n", "\n", "TPOT is an [automated machine learning](https://en.wikipedia.org/wiki/Automated_machine_learning) library.\n", "It evaluates many scikit-learn pipelines and hyperparameter combinations to find a model that works well for your data. Evaluating all these computations is computationally expensive, but ammenable to parallelism. TPOT can use Dask to distribute these computations on a cluster of machines.\n", "\n", "This notebook can be run interactively on the [dask examples binder](https://github.com/dask/dask-examples).\n", "The following video shows a larger version of this notebook on a cluster." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2022-07-27T19:23:36.076555Z", "iopub.status.busy": "2022-07-27T19:23:36.076087Z", "iopub.status.idle": "2022-07-27T19:23:36.139259Z", "shell.execute_reply": "2022-07-27T19:23:36.138318Z" } }, "outputs": [ { "data": { "image/jpeg": "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78Lou7yWU+o3Xfw9E9qXXa28x7V8u8oFu/C6Lu8nlAt34XRd3ksp9Ruu/h6J7Uuu1t5j2r5d5QLd+F0Xd5PKBbvwui7vJZT6jddrbzHtS67+HontXy7ygW78Lou7yeUC3fhdF3eSyn1G47+HontS67+HontXy7ygW78Lou7yeUC3fhdF3eSyn1IB2tvMe1IfrbzHtXy3ygW78Lou7yeUC3fhdF3eSyn1KH628x7Uh+tvMe1fLfKBbvwui7vJ5QLd+F0Xd5LKfUofrbzHtSH628x7V8t8oFu/C6Lu8nlAt34XRd3ksp9Sh+tvMe1IfrbzHtXy3ygW78Lou7yeUC3fhdF3eSyn1B5eATLcBqPatbZ6J/slfMD4f246KXRd3lh/h7bXAgilBw813eUHl0REUREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREH//2Q==\n", "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "\n", "YouTubeVideo(\"uyx9nBuOYQQ\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2022-07-27T19:23:36.142851Z", "iopub.status.busy": "2022-07-27T19:23:36.142514Z", "iopub.status.idle": "2022-07-27T19:23:37.140189Z", "shell.execute_reply": "2022-07-27T19:23:37.138294Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/share/miniconda3/envs/dask-examples/lib/python3.9/site-packages/tpot/builtins/__init__.py:36: UserWarning: Warning: optional dependency `torch` is not available. - skipping import of NN models.\n", " warnings.warn(\"Warning: optional dependency `torch` is not available. - skipping import of NN models.\")\n" ] } ], "source": [ "import tpot\n", "from tpot import TPOTClassifier\n", "from sklearn.datasets import load_digits\n", "from sklearn.model_selection import train_test_split" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup Dask\n", "\n", "We first start a Dask client in order to get access to the Dask dashboard, which will provide progress and performance metrics. \n", "\n", "You can view the dashboard by clicking on the dashboard link after you run the cell." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2022-07-27T19:23:37.144585Z", "iopub.status.busy": "2022-07-27T19:23:37.143842Z", "iopub.status.idle": "2022-07-27T19:23:40.054987Z", "shell.execute_reply": "2022-07-27T19:23:40.054281Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "
\n", "
\n", "

Client

\n", "

Client-9d3a3f10-0de1-11ed-a59a-000d3a8f7959

\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "
Connection method: Cluster objectCluster type: distributed.LocalCluster
\n", " Dashboard: http://127.0.0.1:8787/status\n", "
\n", "\n", " \n", "
\n", "

Cluster Info

\n", "
\n", "
\n", "
\n", "
\n", "

LocalCluster

\n", "

554e7aff

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", " \n", "
\n", " Dashboard: http://127.0.0.1:8787/status\n", " \n", " Workers: 4\n", "
\n", " Total threads: 4\n", " \n", " Total memory: 6.78 GiB\n", "
Status: runningUsing processes: True
\n", "\n", "
\n", " \n", "

Scheduler Info

\n", "
\n", "\n", "
\n", "
\n", "
\n", "
\n", "

Scheduler

\n", "

Scheduler-21db5fb4-9a69-4b11-a57a-880ad23c4052

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " Comm: tcp://127.0.0.1:40911\n", " \n", " Workers: 4\n", "
\n", " Dashboard: http://127.0.0.1:8787/status\n", " \n", " Total threads: 4\n", "
\n", " Started: Just now\n", " \n", " Total memory: 6.78 GiB\n", "
\n", "
\n", "
\n", "\n", "
\n", " \n", "

Workers

\n", "
\n", "\n", " \n", "
\n", "
\n", "
\n", "
\n", " \n", "

Worker: 0

\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", "\n", " \n", "\n", "
\n", " Comm: tcp://127.0.0.1:34711\n", " \n", " Total threads: 1\n", "
\n", " Dashboard: http://127.0.0.1:42307/status\n", " \n", " Memory: 1.70 GiB\n", "
\n", " Nanny: tcp://127.0.0.1:43647\n", "
\n", " Local directory: /home/runner/work/dask-examples/dask-examples/machine-learning/dask-worker-space/worker-m8hopet5\n", "
\n", "
\n", "
\n", "
\n", " \n", "
\n", "
\n", "
\n", "
\n", " \n", "

Worker: 1

\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", "\n", " \n", "\n", "
\n", " Comm: tcp://127.0.0.1:46865\n", " \n", " Total threads: 1\n", "
\n", " Dashboard: http://127.0.0.1:38167/status\n", " \n", " Memory: 1.70 GiB\n", "
\n", " Nanny: tcp://127.0.0.1:42469\n", "
\n", " Local directory: /home/runner/work/dask-examples/dask-examples/machine-learning/dask-worker-space/worker-1d4jm_9g\n", "
\n", "
\n", "
\n", "
\n", " \n", "
\n", "
\n", "
\n", "
\n", " \n", "

Worker: 2

\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", "\n", " \n", "\n", "
\n", " Comm: tcp://127.0.0.1:39607\n", " \n", " Total threads: 1\n", "
\n", " Dashboard: http://127.0.0.1:46559/status\n", " \n", " Memory: 1.70 GiB\n", "
\n", " Nanny: tcp://127.0.0.1:34247\n", "
\n", " Local directory: /home/runner/work/dask-examples/dask-examples/machine-learning/dask-worker-space/worker-_ojdgmeq\n", "
\n", "
\n", "
\n", "
\n", " \n", "
\n", "
\n", "
\n", "
\n", " \n", "

Worker: 3

\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", " \n", "\n", " \n", "\n", "
\n", " Comm: tcp://127.0.0.1:37721\n", " \n", " Total threads: 1\n", "
\n", " Dashboard: http://127.0.0.1:37659/status\n", " \n", " Memory: 1.70 GiB\n", "
\n", " Nanny: tcp://127.0.0.1:44933\n", "
\n", " Local directory: /home/runner/work/dask-examples/dask-examples/machine-learning/dask-worker-space/worker-nlky1gwa\n", "
\n", "
\n", "
\n", "
\n", " \n", "\n", "
\n", "
\n", "\n", "
\n", "
\n", "
\n", "
\n", " \n", "\n", "
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from dask.distributed import Client\n", "client = Client(n_workers=4, threads_per_worker=1)\n", "client" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create Data\n", "\n", "We'll use the digits dataset.\n", "To ensure the example runs quickly, we'll make the training dataset relatively small." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2022-07-27T19:23:40.058341Z", "iopub.status.busy": "2022-07-27T19:23:40.057898Z", "iopub.status.idle": "2022-07-27T19:23:40.110810Z", "shell.execute_reply": "2022-07-27T19:23:40.110180Z" } }, "outputs": [], "source": [ "digits = load_digits()\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(\n", " digits.data,\n", " digits.target,\n", " train_size=0.05,\n", " test_size=0.95,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These are just small, in-memory NumPy arrays. This example is not applicable to larger-than-memory Dask arrays." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using Dask\n", "\n", "TPOT follows the scikit-learn API; we specify a `TPOTClassifier` with a few hyperparameters, and then fit it on some data.\n", "By default, TPOT trains on your single machine.\n", "To ensure your cluster is used, specify the `use_dask` keyword." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2022-07-27T19:23:40.114474Z", "iopub.status.busy": "2022-07-27T19:23:40.114266Z", "iopub.status.idle": "2022-07-27T19:23:40.118281Z", "shell.execute_reply": "2022-07-27T19:23:40.117512Z" } }, "outputs": [], "source": [ "# scale up: Increase the TPOT parameters like population_size, generations\n", "tp = TPOTClassifier(\n", " generations=2,\n", " population_size=10,\n", " cv=2,\n", " n_jobs=-1,\n", " random_state=0,\n", " verbosity=0,\n", " config_dict=tpot.config.classifier_config_dict_light,\n", " use_dask=True,\n", ")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2022-07-27T19:23:40.121272Z", "iopub.status.busy": "2022-07-27T19:23:40.121061Z", "iopub.status.idle": "2022-07-27T19:23:44.357316Z", "shell.execute_reply": "2022-07-27T19:23:44.356815Z" } }, "outputs": [ { "data": { "text/plain": [ "TPOTClassifier(config_dict={'sklearn.cluster.FeatureAgglomeration': {'affinity': ['euclidean',\n", " 'l1',\n", " 'l2',\n", " 'manhattan',\n", " 'cosine'],\n", " 'linkage': ['ward',\n", " 'complete',\n", " 'average']},\n", " 'sklearn.decomposition.PCA': {'iterated_power': range(1, 11),\n", " 'svd_solver': ['randomized']},\n", " 'sklearn.feature_selection.SelectFwe': {'alpha': array([0. , 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007...\n", " 'max']},\n", " 'sklearn.preprocessing.RobustScaler': {},\n", " 'sklearn.preprocessing.StandardScaler': {},\n", " 'sklearn.tree.DecisionTreeClassifier': {'criterion': ['gini',\n", " 'entropy'],\n", " 'max_depth': range(1, 11),\n", " 'min_samples_leaf': range(1, 21),\n", " 'min_samples_split': range(2, 21)},\n", " 'tpot.builtins.ZeroCount': {}},\n", " cv=2, generations=2, n_jobs=-1, population_size=10,\n", " random_state=0, use_dask=True)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tp.fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Learn More\n", "\n", "See the [Dask-ML](http://ml.dask.org/) and [TPOT](https://epistasislab.github.io/tpot/) documenation for more information on using Dask and TPOT." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12" } }, "nbformat": 4, "nbformat_minor": 4 }