Skip to content

Instantly share code, notes, and snippets.

@mrocklin
Created February 21, 2017 00:34
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save mrocklin/19c89d78e34437e061876a9872f4d2df to your computer and use it in GitHub Desktop.
Save mrocklin/19c89d78e34437e061876a9872f4d2df to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"<img src=\"http://dask.readthedocs.io/en/latest/_images/dask_horizontal.svg\"\n",
" align=\"right\"\n",
" width=\"30%\"\n",
" alt=\"Dask logo\">\n",
"\n",
"Dask and XGBoost\n",
"=======================\n",
"\n",
"<img src=\"https://raw.githubusercontent.com/dmlc/dmlc.github.io/master/img/logo-m/xgboost.png\"\n",
" align=\"left\"\n",
" width=\"15%\"\n",
" alt=\"XGBoost logo\">\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/plain": [
"<Client: scheduler='tcp://172.31.33.0:8786' processes=10 cores=80>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from dask import compute, persist\n",
"from dask.distributed import Client, progress\n",
"\n",
"client = Client('172.31.33.0:8786')\n",
"client"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"## Load the Data"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true,
"scrolled": false
},
"outputs": [],
"source": [
"import dask.dataframe as dd\n",
"\n",
"# Subset of the columns to use\n",
"cols = ['Year', 'Month', 'DayOfWeek', 'Distance',\n",
" 'DepDelay', 'CRSDepTime', 'UniqueCarrier', 'Origin', 'Dest']\n",
"\n",
"# Create the dataframe\n",
"df = dd.read_csv('s3://dask-data/airline-data/20*.csv', usecols=cols,\n",
" storage_options={'anon': True})\n",
"\n",
"df = df.sample(frac=0.2) # we blow out ram otherwise\n",
"\n",
"is_delayed = (df.DepDelay.fillna(16) > 15)\n",
"\n",
"df['CRSDepTime'] = df['CRSDepTime'].clip(upper=2399)\n",
"del df['DepDelay']\n",
"\n",
"df, is_delayed = persist(df, is_delayed)\n",
"progress(df, is_delayed)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Year</th>\n",
" <th>Month</th>\n",
" <th>DayOfWeek</th>\n",
" <th>CRSDepTime</th>\n",
" <th>UniqueCarrier</th>\n",
" <th>Origin</th>\n",
" <th>Dest</th>\n",
" <th>Distance</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>136958</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1930</td>\n",
" <td>WN</td>\n",
" <td>AUS</td>\n",
" <td>MCO</td>\n",
" <td>993</td>\n",
" </tr>\n",
" <tr>\n",
" <th>453570</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1630</td>\n",
" <td>CO</td>\n",
" <td>EWR</td>\n",
" <td>DCA</td>\n",
" <td>199</td>\n",
" </tr>\n",
" <tr>\n",
" <th>509727</th>\n",
" <td>2000</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1605</td>\n",
" <td>WN</td>\n",
" <td>PHX</td>\n",
" <td>SAN</td>\n",
" <td>304</td>\n",
" </tr>\n",
" <tr>\n",
" <th>200370</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1800</td>\n",
" <td>CO</td>\n",
" <td>EWR</td>\n",
" <td>ORD</td>\n",
" <td>719</td>\n",
" </tr>\n",
" <tr>\n",
" <th>132313</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1543</td>\n",
" <td>AA</td>\n",
" <td>DFW</td>\n",
" <td>MCI</td>\n",
" <td>460</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Year Month DayOfWeek CRSDepTime UniqueCarrier Origin Dest Distance\n",
"136958 2000 1 3 1930 WN AUS MCO 993\n",
"453570 2000 1 3 1630 CO EWR DCA 199\n",
"509727 2000 2 1 1605 WN PHX SAN 304\n",
"200370 2000 1 3 1800 CO EWR ORD 719\n",
"132313 2000 1 1 1543 AA DFW MCI 460"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"136958 False\n",
"453570 False\n",
"509727 False\n",
"200370 True\n",
"132313 True\n",
"Name: DepDelay, dtype: bool"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"is_delayed.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"## One hot encode"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true,
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"df2 = dd.get_dummies(df.categorize()).persist()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/plain": [
"683"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(df2.columns)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Year</th>\n",
" <th>Month</th>\n",
" <th>DayOfWeek</th>\n",
" <th>CRSDepTime</th>\n",
" <th>Distance</th>\n",
" <th>UniqueCarrier_WN</th>\n",
" <th>UniqueCarrier_CO</th>\n",
" <th>UniqueCarrier_AA</th>\n",
" <th>UniqueCarrier_US</th>\n",
" <th>UniqueCarrier_NW</th>\n",
" <th>...</th>\n",
" <th>Dest_BJI</th>\n",
" <th>Dest_INL</th>\n",
" <th>Dest_ROW</th>\n",
" <th>Dest_PIR</th>\n",
" <th>Dest_RKS</th>\n",
" <th>Dest_GCC</th>\n",
" <th>Dest_CYS</th>\n",
" <th>Dest_MKG</th>\n",
" <th>Dest_LMT</th>\n",
" <th>Dest_OTH</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>136958</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1930</td>\n",
" <td>993</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>453570</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1630</td>\n",
" <td>199</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>509727</th>\n",
" <td>2000</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1605</td>\n",
" <td>304</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>200370</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>1800</td>\n",
" <td>719</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>132313</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1543</td>\n",
" <td>460</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 683 columns</p>\n",
"</div>"
],
"text/plain": [
" Year Month DayOfWeek CRSDepTime Distance UniqueCarrier_WN \\\n",
"136958 2000 1 3 1930 993 1 \n",
"453570 2000 1 3 1630 199 0 \n",
"509727 2000 2 1 1605 304 1 \n",
"200370 2000 1 3 1800 719 0 \n",
"132313 2000 1 1 1543 460 0 \n",
"\n",
" UniqueCarrier_CO UniqueCarrier_AA UniqueCarrier_US \\\n",
"136958 0 0 0 \n",
"453570 1 0 0 \n",
"509727 0 0 0 \n",
"200370 1 0 0 \n",
"132313 0 1 0 \n",
"\n",
" UniqueCarrier_NW ... Dest_BJI Dest_INL Dest_ROW Dest_PIR \\\n",
"136958 0 ... 0 0 0 0 \n",
"453570 0 ... 0 0 0 0 \n",
"509727 0 ... 0 0 0 0 \n",
"200370 0 ... 0 0 0 0 \n",
"132313 0 ... 0 0 0 0 \n",
"\n",
" Dest_RKS Dest_GCC Dest_CYS Dest_MKG Dest_LMT Dest_OTH \n",
"136958 0 0 0 0 0 0 \n",
"453570 0 0 0 0 0 0 \n",
"509727 0 0 0 0 0 0 \n",
"200370 0 0 0 0 0 0 \n",
"132313 0 0 0 0 0 0 \n",
"\n",
"[5 rows x 683 columns]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df2.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"## Split and Train\n",
"\n",
"We split our data randomly in a 90%/10% split for training and testing.\n",
"\n",
"We pull parameters from [this similar experiment](https://github.com/szilard/benchm-ml/blob/master/3-boosting/6-xgboost.R#L28-L32).\n",
"\n",
"We then set up XGBoost and hand data off for training"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"data_train, data_test = df2.random_split([0.9, 0.1], \n",
" random_state=1234)\n",
"labels_train, labels_test = is_delayed.random_split([0.9, 0.1], \n",
" random_state=1234)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 456 ms, sys: 25 ms, total: 481 ms\n",
"Wall time: 6min 6s\n"
]
}
],
"source": [
"%%time\n",
"import dask_xgboost as dxgb\n",
"\n",
"params = {'objective': 'binary:logistic', 'nround': 1000, \n",
" 'max_depth': 16, 'eta': 0.01, 'subsample': 0.5, \n",
" 'min_child_weight': 1}\n",
"\n",
"bst = dxgb.train(client, params, data_train, labels_train)\n",
"bst"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<xgboost.core.Booster at 0x7f760dad1748>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bst"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"## Predict and Evaluate\n",
"\n",
"We get back a normal XGBoost model. We can hand it normal Pandas data or use dask-xgboost again to predict against our hold-out testing data.\n",
"\n",
"We numerically evaluate the result using ROC utilities from Scikit-learn"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0.46952611, 0.47763255, 0.46820614, 0.46959108, 0.47091401], dtype=float32)"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Use normal XGBoost model with normal Pandas\n",
"import xgboost as xgb\n",
"dtest = xgb.DMatrix(data_test.head())\n",
"bst.predict(dtest)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/plain": [
"132313 0.469526\n",
"288044 0.477633\n",
"103834 0.468206\n",
"134648 0.469591\n",
"237994 0.470914\n",
"Name: predictions, dtype: float32"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Or use dask-xgboost to predict in parallel across the cluster\n",
"predictions = dxgb.predict(client, bst, data_test).persist()\n",
"predictions.head()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Dask Series Structure:\n",
"npartitions=93\n",
"None float32\n",
"None ...\n",
" ... \n",
"None ...\n",
"None ...\n",
"Name: predictions, dtype: float32\n",
"Dask Name: _predict_part, 93 tasks"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"predictions"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.695651118777\n"
]
}
],
"source": [
"from sklearn.metrics import roc_auc_score, roc_curve\n",
"print(roc_auc_score(labels_test.compute(), \n",
" predictions.compute()))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": true,
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"fpr, tpr, _ = roc_curve(labels_test.compute(), predictions.compute())"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"image/png": "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\nIS8iIhKi8tyId2XKlHHVq1f3uwwREZEcsXjx4n3OubJZeWyeC/nq1auzaNEiv8sQERHJEWa25cz3\nOjXtrhcREQlRCnkREZEQpZAXEREJUQp5ERGREKWQFxERCVEKeRERkRClkBcREQlRCnkREZEQpZAX\nEREJUQp5ERGREKWQFxERCVEKeRERkRClkBcREQlRCnkREZEQpZAXEREJUUELeTMbamZ7zGzlaW43\nM3vLzNab2XIzaxKsWkRERPKjYLbkPwE6ZHD7tcD5gcvtwLtBrEVERCTfKRCsJ3bOfWdm1TO4Szfg\nU+ecA34ys2gzq+ic2xmsmkRERPKEpGNweBMph7ef09MELeQzoTKwLc3y9sA6hbyIiIS+1BQ4uhUO\nroUDa7zLwcC/sV64Dxx53Tltws+Qt1Osc6e8o9nteLv0qVatWjBrEhERyV7OweGNsHsx7F0OB1Z7\nYX5wHaQcP/VjwgpCiZo8P/g4I5ZkfdN+hvx2oGqa5SrA76e6o3PufeB9gJiYmFP+ISAiIpIrJByC\n33/wLrsWwO5FkHDw1PctUhFK1YWSdaBkXShVl3UHKvLe53t4+W/tOS/M4K5TtYkzx8+QnwDcbWZf\nAJcCh3U8XkRE8hTn4MgW+H0+7JjnXfb9yp92TBcuB+VjoNzFULq+F+gl60BE8T/c7ZdfdtG+0wj2\n7DlGpcoluP/+5udUXtBC3sw+B1oDZcxsO/AUUBDAOfc/YArQEVgPxAG3BKsWERGRbJGa4u1y3zHv\nZLDH7vjjfcILQflLoPLlUPEyL9yLVQHLuEX+/fdb6Nz5c44cOU7btjW5/fam51xuMHvX9z3D7Q64\nK1jbFxEROWfOecfQN02FLTO8XfCJR/94n8hSUOlyqNzSC/byTaFA5FltZsqUdfTsOYqEhGR69ryA\nzz7rQUTEuUe0n7vrRUREcp/Eo7BlFmye5l2ObPnj7dG10oR6S++Yup3bsDOpqY6kpBQGD27Me+91\nJjw8e4axUciLiIgcWAsbJ3mXHd9DavLJ26LKQvX2UKMDVG0DRStm22ZXr95HvXpl6Ny5DgsW3Ebj\nxhWwM+zWPxsKeRERyX9Skrzj6RsnwcaJ3ulsJ1gYVGoB1TtAjWuhfJNzbqmn55zjhRe+56mn5jB6\ndC969LiAJk2y74+HExTyIiKSP8Tv946tb5zk7YY/fvjkbZEloUZHqNkZzmsHUaWCVkZqquOBB6bz\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f75fdfe6cf8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Taken from http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html#sphx-glr-auto-examples-model-selection-plot-roc-py\n",
"plt.figure(figsize=(8, 8))\n",
"lw = 2\n",
"plt.plot(fpr, tpr, color='darkorange', lw=lw, label='ROC curve')\n",
"plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')\n",
"plt.xlim([0.0, 1.0])\n",
"plt.ylim([0.0, 1.05])\n",
"plt.xlabel('False Positive Rate')\n",
"plt.ylabel('True Positive Rate')\n",
"plt.title('Receiver operating characteristic example')\n",
"plt.legend(loc=\"lower right\")\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.0"
},
"widgets": {
"state": {
"23567dc38fc941b994a114aebfc6c32b": {
"views": [
{
"cell_index": 3
}
]
}
},
"version": "1.2.0"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
@mrocklin
Copy link
Author

@chirag4798
Copy link

Is there a similar example for hyperparameter tuning for dask-Xgboost models?

@avriiil
Copy link

avriiil commented May 17, 2021

Is there a similar example for hyperparameter tuning for dask-Xgboost models?

Yes, I'd love to see that, too. Struggling to figure out how to do a GridSearch CV on a dask-XGBoost, either on the Dask-ML or the original XGBoost implementation.

@mrocklin
Copy link
Author

mrocklin commented May 17, 2021 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment