Skip to content

Instantly share code, notes, and snippets.

@mrocklin
Created February 21, 2017 15:24
Show Gist options
  • Save mrocklin/3696fe2398dc7152c66bf593a674e4d9 to your computer and use it in GitHub Desktop.
Save mrocklin/3696fe2398dc7152c66bf593a674e4d9 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=\"25%\"\n",
" alt=\"Dask logo\">\n",
"\n",
"Dask and XGBoost on a Cluster\n",
"=======================\n",
"\n",
"\n",
"We use Dask and XGBoost together on a cluster to load, clean, train, and predict against biggish data. We perform the following steps:\n",
"\n",
"<img src=\"https://raw.githubusercontent.com/dmlc/dmlc.github.io/master/img/logo-m/xgboost.png\"\n",
" align=\"right\"\n",
" width=\"25%\"\n",
" alt=\"XGBoost logo\">\n",
"\n",
"1. Load, clean, and prepare CSV data with Dask.dataframe\n",
"2. Set up a distributed XGBoost network with Dask to run in the same processes running Dask workers.\n",
"3. Hand data from Dask to XGBoost directly in memory\n",
"4. Use XGBoost to train on data, getting back a normal XGBoost result\n",
"5. Use Dask and XGBoost together to test our model against held out data\n",
"6. Use SKLearn functions to measure the success of the trained model\n",
"\n",
"This notebook relies on around 170 lines of code in [github.com/mrocklin/dask-xgboost](https://github.com/mrocklin/dask-xgboost)\n",
"\n",
" pip install git+https://github.com/mrocklin/dask-xgboost"
]
},
{
"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.restart()"
]
},
{
"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) # XGBoost requires a bit of RAM, we need a larger cluster for this\n",
"\n",
"is_delayed = (df.DepDelay.fillna(16) > 15) # column of labels\n",
"del df['DepDelay'] # Remove delay information from training dataframe\n",
"\n",
"df['CRSDepTime'] = df['CRSDepTime'].clip(upper=2399)\n",
"\n",
"df, is_delayed = persist(df, is_delayed) # Ask Dask to start work on these in the background\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>182193</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>800</td>\n",
" <td>WN</td>\n",
" <td>LAX</td>\n",
" <td>OAK</td>\n",
" <td>337</td>\n",
" </tr>\n",
" <tr>\n",
" <th>83424</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>6</td>\n",
" <td>1650</td>\n",
" <td>DL</td>\n",
" <td>SJC</td>\n",
" <td>SLC</td>\n",
" <td>585</td>\n",
" </tr>\n",
" <tr>\n",
" <th>346781</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>1140</td>\n",
" <td>AA</td>\n",
" <td>ORD</td>\n",
" <td>LAX</td>\n",
" <td>1745</td>\n",
" </tr>\n",
" <tr>\n",
" <th>375935</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1940</td>\n",
" <td>DL</td>\n",
" <td>PHL</td>\n",
" <td>ATL</td>\n",
" <td>665</td>\n",
" </tr>\n",
" <tr>\n",
" <th>309373</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>1028</td>\n",
" <td>CO</td>\n",
" <td>MCI</td>\n",
" <td>IAH</td>\n",
" <td>643</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Year Month DayOfWeek CRSDepTime UniqueCarrier Origin Dest Distance\n",
"182193 2000 1 2 800 WN LAX OAK 337\n",
"83424 2000 1 6 1650 DL SJC SLC 585\n",
"346781 2000 1 5 1140 AA ORD LAX 1745\n",
"375935 2000 1 2 1940 DL PHL ATL 665\n",
"309373 2000 1 4 1028 CO MCI IAH 643"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"182193 False\n",
"83424 False\n",
"346781 False\n",
"375935 False\n",
"309373 False\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\n",
"\n",
"XGBoost doesn't want to work with text data like `destination=\"LAX\"`. Instead we create new indicator columns for each of the known airports and carriers. This expands our data into many boolean columns. Fortunately Dask.dataframe has convenience functions for all of this baked in (thank you Pandas!)"
]
},
{
"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": [
"685"
]
},
"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_DL</th>\n",
" <th>UniqueCarrier_AA</th>\n",
" <th>UniqueCarrier_CO</th>\n",
" <th>UniqueCarrier_UA</th>\n",
" <th>...</th>\n",
" <th>Dest_RHI</th>\n",
" <th>Dest_INL</th>\n",
" <th>Dest_BJI</th>\n",
" <th>Dest_ROW</th>\n",
" <th>Dest_GCC</th>\n",
" <th>Dest_RKS</th>\n",
" <th>Dest_MKG</th>\n",
" <th>Dest_LMT</th>\n",
" <th>Dest_OTH</th>\n",
" <th>Dest_PIR</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>182193</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>800</td>\n",
" <td>337</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>83424</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>6</td>\n",
" <td>1650</td>\n",
" <td>585</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>346781</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>1140</td>\n",
" <td>1745</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",
" <tr>\n",
" <th>375935</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1940</td>\n",
" <td>665</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>309373</th>\n",
" <td>2000</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>1028</td>\n",
" <td>643</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</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 × 685 columns</p>\n",
"</div>"
],
"text/plain": [
" Year Month DayOfWeek CRSDepTime Distance UniqueCarrier_WN \\\n",
"182193 2000 1 2 800 337 1 \n",
"83424 2000 1 6 1650 585 0 \n",
"346781 2000 1 5 1140 1745 0 \n",
"375935 2000 1 2 1940 665 0 \n",
"309373 2000 1 4 1028 643 0 \n",
"\n",
" UniqueCarrier_DL UniqueCarrier_AA UniqueCarrier_CO \\\n",
"182193 0 0 0 \n",
"83424 1 0 0 \n",
"346781 0 1 0 \n",
"375935 1 0 0 \n",
"309373 0 0 1 \n",
"\n",
" UniqueCarrier_UA ... Dest_RHI Dest_INL Dest_BJI Dest_ROW \\\n",
"182193 0 ... 0 0 0 0 \n",
"83424 0 ... 0 0 0 0 \n",
"346781 0 ... 0 0 0 0 \n",
"375935 0 ... 0 0 0 0 \n",
"309373 0 ... 0 0 0 0 \n",
"\n",
" Dest_GCC Dest_RKS Dest_MKG Dest_LMT Dest_OTH Dest_PIR \n",
"182193 0 0 0 0 0 0 \n",
"83424 0 0 0 0 0 0 \n",
"346781 0 0 0 0 0 0 \n",
"375935 0 0 0 0 0 0 \n",
"309373 0 0 0 0 0 0 \n",
"\n",
"[5 rows x 685 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 355 ms, sys: 29.7 ms, total: 385 ms\n",
"Wall time: 54.5 s\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",
" 'tree_method': 'hist', 'grow_policy': 'lossguide' } # these extra paramters recommended by @ogrisel\n",
"\n",
"bst = dxgb.train(client, params, data_train, labels_train)\n",
"bst"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our output is just a normal XGBoost Booster object."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<xgboost.core.Booster at 0x7fa1c18c4c18>"
]
},
"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.464578 , 0.46631625, 0.47434333, 0.47245741, 0.46194169], 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": [
"309373 0.464578\n",
"304274 0.466316\n",
"371593 0.474343\n",
"257351 0.472457\n",
"123003 0.461942\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": "markdown",
"metadata": {},
"source": [
"### Evaluate\n",
"\n",
"We use convenience functions from SKLearn to judge our results."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.654800768411\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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\nRCRMqeRFRETCVL4b8a5MmTKuRo0afscQERHJFYsWLdrhnCt7Oo/NdyVfo0YNFi5c6HcMERGRXGFm\n605+r+PT6noREZEwpZIXEREJUyp5ERGRMKWSFxERCVMqeRERkTClkhcREQlTKnkREZEwpZIXEREJ\nUyp5ERGRMKWSFxERCVMqeRERkTClkhcREQlTKnkREZEwpZIXEREJUyp5ERGRMBWykjezIWa2zcx+\nOsHtZmavmdkqM/vBzBqGKouIiEgkCuWS/IdAuyxubw+cHbjcBLwVwiwiIiIRp0Contg5N8fMamRx\nly7Ax845B3xrZvFmVtE5tzlUmURERPKFjFTYt4GMXb+d0dOErOSzoTKwIWh6Y2CeSl5ERCLDgS2w\nbQns+gV2/gK7V0DyGti/CXAMHN7tjJ7ez5K348xzx72j2U14q/SpVq1aKDOJiIiEhnOwdx1snONd\nNs2B3b8e/74WBUWr8tTA/QxbfPov6WfJbwSqBk1XAX4/3h2dc+8A7wAkJCQc9w8BERGRPMU52LUC\nNs4OlPpc2Lfhj/eJKQLlE6B0XSh1HpQ6l193luXtT7bw3AttqR5lcOfxlomzx8+STwJuN7ORwMXA\nHm2PFxGRfO3wHlg/A36bAmun/LnUY0tB5WZQpRlUuQLKNYCoo1W8ZMkW2iYOY9u2A1SqUoK77770\njOKErOTNbATQAihjZhuBfwIxAM65/wCTgERgFXAQuD5UWURERELiyNL6mgneZdM8cBlHby9cDqq2\n9Aq9yhXeErsd/8C2uXPX0bHjCPbuPUzr1mdx002NzjheKPeu732S2x1wW6heX0REJCTSDnqr4NdO\n9Yo9efXR26IKQOUroEY771Ku/glLPdikSb/So8coUlLS6dHjPD75pDuFCp15Rfu5ul5ERCR/OLTT\nK/RV47xyTz909LbY0nBWIpzVEWq0hUIlTvnpMzMdaWkZDB7cgLff7kh0dM4MY6OSFxEROZ6967xS\nXzUONs7942r48glQow3UTISKl0BU9Gm9xPLlOzj33DJ07FiH+fNvpEGDCpid/o52x1LJi4iIgLd9\nfcePR4t92/dHb4sqANVaQ+1uUKszFKt8hi/lePrpufzzn7P47LOedO9+Hg0bVjzDN/BnKnkREYlc\nznmD0fzyCaz6HPasOXpbTBFvSb12V+/f2PgcecnMTMc990zllVe+wwx27Tp08gedJpW8iIhEnoPb\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fa1e2111898>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"distributed.client - WARNING - Client report stream closed to scheduler\n"
]
}
],
"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"
]
}
],
"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": {
"c184c3a7177748d5b3eb4a579751c698": {
"views": [
{
"cell_index": 3
}
]
}
},
"version": "1.2.0"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
@mrocklin
Copy link
Author

@swordspoet
Copy link

swordspoet commented Jul 4, 2018

Traceback (most recent call last):
  File "dask_xgb.py", line 79, in <module>
    train_model(data_train, labels_train)
  File "dask_xgb.py", line 67, in train_model
    bst = dxgb.train(client, params, data_train, labels_train)
  File "/usr/lib/python2.7/site-packages/dask_xgboost/core.py", line 169, in train
    labels, dmatrix_kwargs, **kwargs)
  File "/usr/lib/python2.7/site-packages/distributed/utils.py", line 253, in sync
    six.reraise(*error[0])
  File "/usr/lib/python2.7/site-packages/distributed/utils.py", line 238, in f
    result[0] = yield make_coro()
  File "/usr/lib/python2.7/site-packages/tornado/gen.py", line 1099, in run
    value = future.result()
  File "/usr/lib/python2.7/site-packages/tornado/concurrent.py", line 260, in result
    raise_exc_info(self._exc_info)
  File "/usr/lib/python2.7/site-packages/tornado/gen.py", line 1107, in run
    yielded = self.gen.throw(*exc_info)
  File "/usr/lib/python2.7/site-packages/dask_xgboost/core.py", line 134, in _train
    results = yield client._gather(futures)
  File "/usr/lib/python2.7/site-packages/tornado/gen.py", line 1099, in run
    value = future.result()
  File "/usr/lib/python2.7/site-packages/tornado/concurrent.py", line 260, in result
    raise_exc_info(self._exc_info)
  File "/usr/lib/python2.7/site-packages/tornado/gen.py", line 1107, in run
    yielded = self.gen.throw(*exc_info)
  File "/usr/lib/python2.7/site-packages/distributed/client.py", line 1385, in _gather
    traceback)
  File "/usr/lib/python2.7/site-packages/distributed/protocol/pickle.py", line 59, in loads
    return pickle.loads(x)
ImportError: No module named dask_xgboost.core

Is there any module named dask_xgboost.core? I have not find it.

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