Files
lab/5/data science/3/2_02_accelerated_model_development.ipynb
2026-02-17 23:13:20 +03:00

2384 lines
387 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"id": "0bf7f930-76a1-4c16-84e4-cf1e73b54c55",
"metadata": {},
"source": [
"<a href=\"https://www.nvidia.com/dli\"> <img src=\"images/DLI_Header.png\" alt=\"Header\" style=\"width: 400px;\"/> </a>"
]
},
{
"cell_type": "markdown",
"id": "400a41da-bc38-4e9a-9ece-d2744ffb16b0",
"metadata": {
"tags": []
},
"source": [
"# Enhancing Data Science Outcomes With Efficient Workflow #"
]
},
{
"cell_type": "markdown",
"id": "8897c66c-4f9d-48b4-a60b-ddae16f2f61b",
"metadata": {},
"source": [
"## 02 - Accelerated Model Development ##\n",
"This lab covers the machine learning model development step of the data science workflow. Model development involves model building, evaluation, fine-tuning, model selection, and model persistence. \n",
"\n",
"<p><img src='images/pipeline_overview_2.png' width=1080></p>\n",
"\n",
"**Table of Contents**\n",
"<br>\n",
"In this notebook, we will train machine learning models using the Random Forest and XGBoost algorithms. This notebook covers the below sections: \n",
"1. [cuML and Dask-cuML for Accelerated Machine Learning Algorithms](#s2-1)\n",
"2. [cuML Random Forest on a Single GPU](#s2-2)\n",
" * [Exercise #1 - Model Performance](#s2-e1)\n",
" * [Data Size vs. Model Performance](#s2-2.1)\n",
" * [Dask-cuML Random Forest on Multi-GPU](#s2-2.2)\n",
"3. [XGBoost](#s2-3)\n",
" * [XGBoost on a Single GPU](#s2-3.1)\n",
" * [XGBoost on GPU Cluster with Dask](#s2-3.2)\n",
" * [Exercise #2 - Experimentation](#s2-e2)\n",
" * [Save Model](#s2-3.3)\n",
"4. [Feature Importances](#s2-4)"
]
},
{
"cell_type": "markdown",
"id": "9e6f44ca-b82b-444e-aebf-eb2c77e90b93",
"metadata": {
"tags": []
},
"source": [
"<a name='s2-1'></a>\n",
"## cuML and Dask for GPU-Accelerated Machine Learning Algorithms ##\n",
"Machine learning requires processing large amounts of data to extra patterns. In fact, machine learning generally works better with more data. Beyond data manipulation, RAPIDS provides a streamlined approach to solve data science problems end to end. It parallelizes compute to multiple cores in the GPU to achieve improved performance over traditional data processing tools. Once data has been loaded on the GPU, we can use cuML to train machine learning models using a `fit`-`transform`-`predict`-style API and Dask-cuML to distribute our computation across a GPU cluster. \n",
"\n",
"**cuML** [[doc]](https://docs.rapids.ai/api/cuml/stable/]) is a suite of fast, GPU-accelerated machine learning algorithms designed for data science and analytical tasks. cuML provides a scikit-learn-like API that is familiar to data scientists and machine learning engineers. This enables them to accelerate model development without going into the details of CUDA programming. With cuML, we can train machine learning models more efficiently, therefore allowing for more exploration and experimentation to improve model performance. \n",
"\n",
"As we previously mentioned, [Dask](https://www.dask.org/) is a parallel computing library built on Python. It allows easy management of distributed workers and excels at handling large, distributed data science workflows. Increasingly, machine learning tasks must process massive amounts of data and require the processing to be distributed across multiple GPUs. Dask-cuML enables scalable distributed training on a GPU cluster. \n",
"\n",
"Using Dask with GPU-based machine learning can help us scale in several dimensions: \n",
"1. When the challenge is computing bound, GPU-accelerated machine learning algorithms can speed up computationally intensive workflows\n",
"2. When the challenge is memory bound, Dask offers the ability to work with larger datasets and thereby improving the performance and resilience of models\n",
"\n",
"<p><img src='images/tip.png' width=720></p>\n",
"\n",
"When the dataset is small, we don't expect to observe cuML performance to be faster than scikit-learn. In many cases, performance advantages appear as the dataset grows. A modern GPU can have thousands of cores. To realize the benefits of acceleration, we can maximize performance by providing enough data to keep the hardware busy. "
]
},
{
"cell_type": "markdown",
"id": "9e0f56f4-c6e5-4cc7-80a8-8d3e2ca90671",
"metadata": {},
"source": [
"<a name='s2-2'></a>\n",
"## cuML Random Forest on a Single GPU ##\n",
"cuML has a GPU-accelerated `cuml.ensemble.RandomForestClassifier()`[[doc]](https://docs.rapids.ai/api/cuml/stable/api.html#random-forest) algorithm. The cuML Random Forest model uses a high-performance **quantiles** split algorithm when building the trees. The quantiles split algorithm precomputes the potential split values for each feature one time per tree at the root node. Each feature column is sorted in ascending order and split into bins such that each bin contains an equal portion of the root nodes dataset. The end range of each bin is considered as a potential split value. \n",
"\n",
"There are a number of [parameters](https://docs.rapids.ai/api/cuml/stable/api.html#cuml.ensemble.RandomForestClassifier) that can be tuned related to `split_criterion`, `samples`, `depth`, `features`, and `n_bins`. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "caf069b1-9852-4d8a-b8e4-96a0349b0816",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# import dependencies\n",
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"from cuml.model_selection import train_test_split\n",
"from cuml.ensemble import RandomForestClassifier as cumlRF\n",
"from cuml.metrics import precision_recall_curve, roc_auc_score, confusion_matrix, accuracy_score\n",
"from sklearn.metrics import roc_curve, classification_report, f1_score\n",
"\n",
"import dask_cudf\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import time"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "96610e96-4757-4e3f-81f6-823c566466f6",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# initialize features list\n",
"features_list=['brand', 'cat_0', 'cat_1', 'cat_2', 'cat_3', \n",
" 'price', 'ts_hour', 'ts_minute', 'ts_weekday', \n",
" 'brand_target_sum', 'brand_count', 'cat_0_target_sum', \n",
" 'cat_0_count', 'cat_1_target_sum', 'cat_1_count', \n",
" 'cat_2_target_sum', 'cat_2_count', 'cat_3_target_sum', \n",
" 'cat_3_count', 'TE_brand_target', 'TE_cat_0_target', \n",
" 'TE_cat_1_target', 'TE_cat_2_target', 'TE_cat_3_target', \n",
" 'relative_price_product', 'relative_price_category']\n",
"\n",
"include=features_list+['target']"
]
},
{
"cell_type": "markdown",
"id": "1a4e0ac3-7cdd-4682-9f2c-94ac2ebbdf2a",
"metadata": {},
"source": [
"We start by importing data. Since we are training with a single GPU, we will load the data input the memory with `.compute()`. Data needs to be split into a train and test set, which can be accomplished with `cuml.model_selection.train_test_split()`[[doc]](https://docs.rapids.ai/api/cuml/stable/api.html#model-selection-and-data-splitting). "
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "f7fe023a-5ae2-4b9c-880e-c61acb4e3e7d",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total of 2461697 records. \n"
]
}
],
"source": [
"# load data\n",
"parquet_dir='processed_parquet'\n",
"\n",
"ddf=dask_cudf.read_parquet(parquet_dir, columns=include)\n",
"gdf=ddf.compute()\n",
"\n",
"print(f'Total of {len(gdf)} records. ')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "f77f311a-f6fd-4053-93a5-9c1e40c461e4",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# define features and target\n",
"y=gdf['target']\n",
"X=gdf[features_list]\n",
"\n",
"# split data into train and test sett\n",
"X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=42)"
]
},
{
"cell_type": "markdown",
"id": "9d55062f-0f69-4862-89d2-2fec66b69a18",
"metadata": {},
"source": [
"<p><img src='images/tip.png' width=720></p>\n",
"\n",
"\n",
"Recall that Dask-cuDF is the recommended way of loading large datasets. "
]
},
{
"cell_type": "markdown",
"id": "3bdf2b66-637d-4d04-a9d2-abad55c58ba2",
"metadata": {},
"source": [
"Next, we will train the model. We are using the default model parameters and 100 for `n_estimators` to compare the training times between cuML and scikit-learn. "
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "aefaa272-534a-4a9c-90a4-1574e4089a1e",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# set estimator parameters\n",
"rf_params={\n",
" 'n_estimators': 100, \n",
"}\n",
"\n",
"# initialize estimator with key parameters\n",
"rf=cumlRF(**rf_params)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "9a621bc2-9dd2-4f93-a460-9fe5e5ce5875",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training 1846272 samples took 0.29 minutes. \n"
]
}
],
"source": [
"# fit estimator\n",
"start=time.time()\n",
"rf.fit(X_train, y_train)\n",
"elapsed_time=time.time()-start\n",
"\n",
"print(f'Training {len(X_train)} samples took {round(elapsed_time/60, 2)} minutes. ')"
]
},
{
"cell_type": "markdown",
"id": "876235f5-4433-4655-9838-f0258ccef8b1",
"metadata": {},
"source": [
"<a name='s2-e1'></a>\n",
"### Exercise #1 - Performance Model Evaluation ###\n",
"\n",
"We can use the `cuml.metrics.precision_recall_curve()`[[doc]](https://docs.rapids.ai/api/cuml/stable/api/#cuml.metrics.precision_recall_curve) and `cuml.metrics.roc_auc_score()`[[doc]](https://docs.rapids.ai/api/cuml/stable/api/#cuml.metrics.roc_auc_score) functions to calculate the model performance. Alternatively, we can check the overall performance of the model with `cuml.metrics.accuracy.accuracy_score()`[[doc]](https://docs.rapids.ai/api/cuml/stable/api.html#metrics-regression-classification-and-distance). \n",
"\n",
"**Instructions**: <br>\n",
"* Modify the `<FIXME>`s only and execute the below cell to calculate the precision, recall, and AUC ROC scores. "
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "e2b39645-00f0-49f3-be21-ab7937e641c7",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Area Under the Receiver Operating Characteristic Curve is 0.63. \n"
]
}
],
"source": [
"# perform model evaluation\n",
"prediction_test=rf.predict_proba(X_test)[1]\n",
"\n",
"precision, recall, thresholds=precision_recall_curve(y_test, prediction_test)\n",
"auc_roc=roc_auc_score(y_test, prediction_test)\n",
"\n",
"print(f'Area Under the Receiver Operating Characteristic Curve is {round(auc_roc, 2)}. ')"
]
},
{
"cell_type": "markdown",
"id": "eab53b3c-5339-4b96-a293-7f9209dcfdba",
"metadata": {},
"source": [
"<p><img src='images/tip.png' width=720></p>\n",
"\n",
"Using `metrics` from cuML requires CuPy arrays. The scikit-learn equivalent can be used when the outputs are moved to the host. "
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "ccde364f-a8c7-4557-9ea7-5281fe8f5882",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# calculate fpr and tpr using sklearn\n",
"prediction_test_numpy=prediction_test.to_numpy()\n",
"y_test_numpy=y_test.to_numpy()\n",
"fpr, tpr, _=roc_curve(y_test_numpy, prediction_test_numpy)\n",
"\n",
"# plot ROC\n",
"plt.plot(fpr, tpr, label=f'ROC Curve (Area = {round(auc_roc, 2)})')\n",
"plt.plot([0, 1], [0, 1], linestyle='--', label='ROC Random')\n",
"plt.xlabel('False Positive Rate')\n",
"plt.ylabel('True Positive Rate')\n",
"plt.title('Receiver Operating Characteristic')\n",
"plt.legend(loc='lower right')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "e1f05e93-2236-40ee-806f-9e7a292fa3f9",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"F1 Score is 0.37. \n",
"Classification Report: \n",
" precision recall f1-score support\n",
"\n",
" 0 0.63 0.85 0.72 362341\n",
" 1 0.56 0.28 0.37 253084\n",
"\n",
" accuracy 0.61 615425\n",
" macro avg 0.60 0.56 0.55 615425\n",
"weighted avg 0.60 0.61 0.58 615425\n",
"\n",
"Confusion Matrix: \n",
" [[307197 55144]\n",
" [182061 71023]]\n"
]
}
],
"source": [
"# calculate classification report using sklearn\n",
"best_threshold=.5\n",
"\n",
"# get prediction label if using best threshold\n",
"prediction_label_numpy=(prediction_test >= best_threshold).astype('int64').to_numpy()\n",
"\n",
"# calculate F1 score\n",
"f1=f1_score(y_test_numpy, prediction_label_numpy)\n",
"print(f'F1 Score is {round(f1, 2)}. ')\n",
"\n",
"# generate classification report and confusion matrix\n",
"print(\"Classification Report: \\n\", classification_report(y_test_numpy, prediction_label_numpy))\n",
"print(\"Confusion Matrix: \\n\", confusion_matrix(y_test_numpy, prediction_label_numpy))"
]
},
{
"cell_type": "markdown",
"id": "f308add8-3ff3-458b-be86-5e4d336754ca",
"metadata": {},
"source": [
"<a name='s2-2.1'></a>\n",
"### Mode Size vs. Model Performance ###\n",
"Model performance generally improves as the size of the training dataset grows. Increasing the number of trees can also improve model performance. cuML speeds up machine learning training and enables more experimentation. We will train several models to see the effects of data size and `n_estimators`. "
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "b4649271-63b5-438b-bd54-0273ab0f732b",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# define model to train random forest classifier\n",
"def train(frac, n_estimators): \n",
" \n",
" gdf_sample=gdf.sample(frac=frac)\n",
" X=gdf_sample[features_list]\n",
" y=gdf_sample['target']\n",
" X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=42)\n",
" \n",
" rf=cumlRF(n_estimators=n_estimators)\n",
" \n",
" # time training\n",
" start=time.time()\n",
" rf.fit(X_train, y_train)\n",
" elapsed_time=time.time()-start\n",
" \n",
" # calculate auc roc\n",
" prediction_test=rf.predict_proba(X_test)[1]\n",
" auc_roc=roc_auc_score(y_test, prediction_test)\n",
" \n",
" return elapsed_time, auc_roc, len(X_train)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "c0a79da0-6f59-415f-b18c-21ee141ff818",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training 50 trees yielded 63.15% AUC and took 0.12 minutes. \n",
"Training 150 trees yielded 63.36% AUC and took 0.35 minutes. \n",
"Training 250 trees yielded 63.42% AUC and took 0.58 minutes. \n",
"Training 350 trees yielded 63.3% AUC and took 0.82 minutes. \n",
"Training 450 trees yielded 63.37% AUC and took 1.05 minutes. \n"
]
}
],
"source": [
"# create lists to contain experiment statistics\n",
"auc_roc_scores=[]\n",
"model_sizes=[]\n",
"times=[]\n",
"\n",
"for n_estimators in range(50, 451, 100): \n",
" elapsed_time, auc_roc, sample_size=train(1, n_estimators)\n",
" \n",
" times.append(elapsed_time)\n",
" auc_roc_scores.append(auc_roc)\n",
" model_sizes.append(n_estimators)\n",
" \n",
" print(f'Training {n_estimators} trees yielded {round(auc_roc*100, 2)}% AUC and took {round(elapsed_time/60, 2)} minutes. ')"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "b037b824-bec7-4fb4-9cfa-d1206475b274",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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s2Yxbtw4OnbsSNWqVVm2bBn37t1j9erVusWtaxK4bt06RowYwbhx4zh69Cgvvvgibdq04eLFi098TefOnQkMDGTRokWEhoayZs0aKlasaHq+SJEijBs3jv3793P8+HH69OlDnz59+OOPPx67VlBQEPPnz6d69eqPPZcbM3YhRNqMRpg9G2rUgH371GzfxYvht9+gRAm9o1OmT1eTU27dkvGBls5gMDz10bt370xdd/369UyePDnd55cqVYqIiAiqVq2aqfs9UfwN2PkaHHkfjPdZHwRFelzE4NIwzfd74cIFIiIiaNOmTdbGkQWio6O5e/eu6ZGQkJDmeRs3bsTPz48333wTFxcXatasyYIFC0zPh4WFcfXqVVq2fNgFbmtrS5MmTdi3b1+2v48n0rNmXZ06dbQBAwakOlaxYkXt448/TvP8LVu2aM7OztrNmzczdJ+aNWtqn3zySapj0dHRmre3txYQEKA1adJEGz58uOk5o9Goubm5aV988YXpWHx8vObs7Kx999136b6vpdQeFEJPFy5oWrNmqmYvaNpLL6ljudG5c5pWsKCK86OP9I4m78urtYMjIiJMj1mzZmkFCxZMdezOnTupzk9MTNQp0ky4tlPT1nuour9rbLW44zO1iCtXTO+tZMmS2qRJk1K936SkJF1CTU/t4Ecfn332WZrXsrW11WxtbbUxY8ZoR44c0b777jvNzs5OW7ZsmaZpmrZ3714N0C5fvpzqdf369dNatmyZ5e8tvXRrCUxMTOTw4cOpsmKAli1bPjErTsm0p0+fjoeHB+XLl2fUqFHExcWleb6maQQGBhIaGkrjxo1TPTd48GDatm1L8+bNH3tdZjP2hISEVH8xSKuhENlH02DRIqhWTVX7cHBQrYEBAeDpqXd0aStbVrVQglquZssWfeMR+nBzczM9nJ2dMRgMpv34+HgKFSrEDz/8QNOmTbGzs2PlypXcvHmTbt26UbJkSRwcHKhWrRpr1qxJdd1Hu4PLlCnD1KlT6du3L05OTpQuXZr58+ebnn+0O3jHjh0YDAYCAwPx8/PDwcGBBg0aEBoamuo+U6ZMwcXFBScnJ959910+/vhjatWsAScmQWAziLsMBStAqwPYVXsfN3d30/uztrbGyckp1ffA2to6VXdwSlw//PADL774Ivb29tSuXZszZ84QFBSEn58fjo6OtG7dmuvX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\n",
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot auc roc vs. model size\n",
"fig, axes=plt.subplots()\n",
"\n",
"ln_1=axes.plot(model_sizes, auc_roc_scores, label='AUC score', color='blue')\n",
"axes.set_ylabel('AUC Score')\n",
"\n",
"axes_right=axes.twinx()\n",
"ln_2=axes_right.plot(model_sizes, times, label='Training Time', color='orange')\n",
"axes_right.set_ylabel('Training Time (s)')\n",
"\n",
"axes.legend(ln_1+ln_2, [ln.get_label() for ln in ln_1+ln_2])\n",
"\n",
"plt.xlabel('Training Size')\n",
"plt.ticklabel_format(style='plain')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "a1545bef-ca47-490e-8b03-c04714f8146e",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training 369254 samples with 350 trees yielded 62.29% AUC and took 0.11 minutes. \n",
"Training 738509 samples with 350 trees yielded 62.9% AUC and took 0.27 minutes. \n",
"Training 1107763 samples with 350 trees yielded 63.09% AUC and took 0.45 minutes. \n",
"Training 1477018 samples with 350 trees yielded 63.31% AUC and took 0.63 minutes. \n",
"Training 1846272 samples with 350 trees yielded 63.41% AUC and took 0.82 minutes. \n"
]
}
],
"source": [
"# create lists to contain experiment statistics\n",
"auc_roc_scores=[]\n",
"sample_sizes=[]\n",
"times=[]\n",
"\n",
"for frac in np.arange(0.2, 1.1, 0.2): \n",
" n_estimators=350\n",
" elapsed_time, auc_roc, sample_size=train(frac, n_estimators=n_estimators)\n",
" \n",
" times.append(elapsed_time)\n",
" auc_roc_scores.append(auc_roc)\n",
" sample_sizes.append(sample_size)\n",
" \n",
" print(f'Training {sample_size} samples with {n_estimators} trees yielded {round(auc_roc*100, 2)}% AUC and took {round(elapsed_time/60, 2)} minutes. ')"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "6d300544-cc9f-4d72-b93f-b6af81290751",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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vXv3qoiICLVp0yZ15swZs73uKVOmqBIlSqh169apiIgItXr1alWkSBE1a9Yss7nm9evXq7Fjx6qffvpJAWrt2rXp9he06wsPD1cODg5qyJAhKiwsTC1YsEBZW1urH3/8MVPXfPPmTdWyZUu1atUq9c8//6jdu3erBg0aKH9//3R/LuZ0zQ9au3atql27tipdurT6/PPPzfqaz5w5o4oXL65GjBihDh06pM6ePavWrVunLl++bLbX/Pbbb6uKFSuqP//8U0VERKivv/5aWVpaqp9//rnAXnNhJQEvF8XHxysfHx8VGhqqmjVrZgp4RqNRubu7q08++cR0bFJSknJ2dlbz5s1TSmlfItbW1mrlypWmYy5evKgsLCzUhg0blFJKhYWFKUDt2bPHdMzu3bsVoP755x+llPYfs4WFhbp48aLpmO+//17Z2tqquLg4pZRSISEhytnZWSUlJZmOCQ4OVqVLl1ZGozHT1ztq1CjVpEmTx+43x+t+/vnnVZ8+fdJte+WVV9Trr79ultf88BdCQby+kSNHqqpVq6a7rvfee081bNgwU9eckX379ilAnT9/3qyvOSoqSnl6eqq///5beXl5pQt45njNXbp0Mf23nBFzvOYaNWqoSZMmpdtWt25d9dFHH5nFNRcmcos2Fw0YMIDnn3+eli1bptseERFBTEwMrVu3Nm2ztbWlWbNm7Nq1C4CDBw9y9+7ddMeULl0aX19f0zG7d+/G2dmZBg0amI5p2LAhzs7O6Y7x9fWldOnSpmPatGlDcnKy6dbp7t27adasWbqJKNu0acOlS5c4d+5cpq/3119/JSAggNdeew1XV1f8/PxYsGCBWV93kyZN2Lx5M6dOnQLgr7/+YseOHbRv395sr/lBBfH6du/ena6We8ccOHCAu3fvZvnPACAuLg6DwUCxYsXM9pqNRiM9e/ZkxIgR1KhR45H95nbNRqOR//u//6Ny5cq0adMGV1dXGjRokO6WprldM2h/p/36669cvHgRpRR//vknp06dok2bNmZ7zeZKAl4uWblyJYcOHSI4OPiRfTExMQC4ubml2+7m5mbaFxMTg42NDS4uLk88xtXV9ZHzu7q6pjvm4c9xcXHBxsbmicfca987JjPCw8OZO3cuPj4+/P777/Tt25fBgwezdOlSs73uUaNG0a1bN6pWrYq1tTV+fn4MHTqUbt26me01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\n",
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot auc roc vs. sample size\n",
"fig, axes=plt.subplots()\n",
"\n",
"ln_1=axes.plot(sample_sizes, auc_roc_scores, label='AUC score', color='blue')\n",
"axes.set_ylabel('AUC Score')\n",
"\n",
"axes_right=axes.twinx()\n",
"ln_2=axes_right.plot(sample_sizes, times, label='Training Time', color='orange')\n",
"axes_right.set_ylabel('Training Time (s)')\n",
"\n",
"axes.legend(ln_1+ln_2, [ln.get_label() for ln in ln_1+ln_2])\n",
"\n",
"plt.xlabel('Training Size')\n",
"plt.ticklabel_format(style='plain')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "544fa226-5454-4236-a944-8d2692890bb9",
"metadata": {},
"source": [
"As the size of data and model increase, the model performance tends to better. Importantly, the amount of time it takes for cuML to train the model is approximately linear. "
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "dc88c111-0762-496f-b22d-6e40ceb997d8",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"{'status': 'ok', 'restart': False}"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# clean GPU memory\n",
"import IPython\n",
"app = IPython.Application.instance()\n",
"app.kernel.do_shutdown(restart=False)"
]
},
{
"cell_type": "markdown",
"id": "8b96a8c2-e1e0-4990-88b9-1df4c1d24017",
"metadata": {
"tags": []
},
"source": [
"<a name='s2-2.2'></a>\n",
"### Dask-cuML Random Forest on Multi-GPU ###\n",
"To accelerate this process, cuML can construct trees in parallel across multiple GPUs across a cluster using [Dask](https://www.dask.org/). \n",
"\n",
"Dask can be used to scale cuML's Random Forest classifier in two ways: \n",
"1. Data can be randomly split and shared equally across all workers, in which case each worker builds trees on a subset of the full data. In other words, For a forest with `N` trees being built on `w` workers, each worker simply builds `N/w` trees on a subset of the total dataset it has available locally. This requires partitioning the data in a well-shuffled, balanced way in advance. This random sharing approach effectively expands the amount of available memory and typically works well. With this approach, both the dataset and trees are distributed across multiple GPUs, leading to better than linear speedup scaling across multiple devices. There could be some small differences in terms of accuracy between single-GPU and multi-GPU runs, which is to be expected given the different data distributions. \n",
"2. Training data can be replicated so that each worker receives `w` partitions when `.fit()` is called. This will give all workers a complete view of the dataset. This would produce results approximately identical to single-GPU fitting.\n",
"\n",
"The random sharing approach effectively expands the amount of available memory and typically works well but requires careful data splitting and model tuning to achieve good results. We will distribute and split data into each GPU worker and train several trees in parallel. "
]
},
{
"cell_type": "markdown",
"id": "3ef1f29c-11ad-4f05-bb94-3c113ecbb4a6",
"metadata": {},
"source": [
"By default, Dask will only use a single GPU. To use multiple GPUs, users will want to either use the `dask_cuda.LocalCUDACluster()`[[doc]](https://docs.rapids.ai/api/dask-cuda/stable/api.html) API or launch Dask workers from the command line (one per GPU). We will also initialize a `dask.distributed.Client` and point it to the cluster. The Dask client connects to and submits computations to a Dask cluster. "
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "c09ac827-15e2-4f66-8fcd-b1797fb70412",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2026-02-11 18:26:32,347 - distributed.preloading - INFO - Creating preload: dask_cuda.initialize\n",
"2026-02-11 18:26:32,347 - distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n",
"2026-02-11 18:26:32,348 - distributed.preloading - INFO - Creating preload: dask_cuda.initialize\n",
"2026-02-11 18:26:32,349 - distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n",
"2026-02-11 18:26:32,385 - distributed.preloading - INFO - Creating preload: dask_cuda.initialize\n",
"2026-02-11 18:26:32,385 - distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n",
"2026-02-11 18:26:32,402 - distributed.preloading - INFO - Creating preload: dask_cuda.initialize\n",
"2026-02-11 18:26:32,402 - distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n"
]
}
],
"source": [
"# import dependencies\n",
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"from dask.distributed import Client, wait\n",
"from dask_cuda import LocalCUDACluster\n",
"\n",
"# instantiate a Client\n",
"cluster=LocalCUDACluster()\n",
"client=Client(cluster)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ea561eac-a731-4445-b70b-99c00317ad6a",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [],
"source": [
"# get the machine's external IP address\n",
"from requests import get\n",
"\n",
"ip=get('https://api.ipify.org').content.decode('utf8')\n",
"\n",
"print(f'Dask dashboard (status) is accessible on http://{ip}:8787/status')\n",
"print(f'Dask dashboard (gpu) is accessible on http://{ip}:8787/gpu')"
]
},
{
"cell_type": "markdown",
"id": "0b24d8ed-d4bd-4e64-98df-30fdc3511541",
"metadata": {},
"source": [
"cuML nicely integrates with Dask to make training a models easy across multiple GPUs. cuML has a `cuml.dask.ensemble.RandomForestClassifier`[[doc]](https://docs.rapids.ai/api/cuml/stable/api.html#id47) algorithm. We build a classification model to predict the binary outcome. Other multi-node, multi-GPU algorithms can be found in the [documentation](https://docs.rapids.ai/api/cuml/stable/api.html#multi-node-multi-gpu-algorithms). "
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "575eaf49-9c55-4161-b00c-46f5d145f727",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# import dependencies\n",
"from cuml.dask.ensemble import RandomForestClassifier as cumlDaskRF\n",
"\n",
"from dask_ml.model_selection import train_test_split\n",
"from dask_ml.metrics import accuracy_score\n",
"\n",
"import dask_cudf\n",
"import time\n",
"import gc"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "a7f7a187-d998-4ee1-bd7d-5ce8c11d2ea0",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# initialize features list\n",
"features_list=['brand', 'cat_0', 'cat_1', 'cat_2', 'cat_3', \n",
" 'price', 'ts_hour', 'ts_minute', 'ts_weekday', \n",
" 'brand_target_sum', 'brand_count', 'cat_0_target_sum', \n",
" 'cat_0_count', 'cat_1_target_sum', 'cat_1_count', \n",
" 'cat_2_target_sum', 'cat_2_count', 'cat_3_target_sum', \n",
" 'cat_3_count', 'TE_brand_target', 'TE_cat_0_target', \n",
" 'TE_cat_1_target', 'TE_cat_2_target', 'TE_cat_3_target', \n",
" 'relative_price_product', 'relative_price_category']\n",
"\n",
"include=features_list+['target']"
]
},
{
"cell_type": "markdown",
"id": "ab5d0100-00e5-4da9-82df-b89ea8f9bbd9",
"metadata": {},
"source": [
"We start by importing data. Except for creating the cluster with multiple-GPUs, the code for importing data will be similar. Data needs to be split into a train and validation set, which can be accomplished with `dask_ml.model_selection.train_test_split()`[[doc]](https://ml.dask.org/modules/generated/dask_ml.model_selection.train_test_split.html). When fitting the model, data is expected to be partitioned with at least one partition on each Dask worker being used. If a worker has multiple data partitions, they will be concatenated before fitting, which will lead to additional memory usage. To minimize memory consumption, ensure that each worker has exactly one partition. When persisting data, we can use `cuml.dask.common.utils.persist_across_workers()` or `.persist()` with the data and workers. When using the latter approach, both `X` and `y` should be persisted across workers. "
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "a603d150-a65e-44a1-b563-e83a91f882d8",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total of 2461697 records split across 4 partitions. \n"
]
}
],
"source": [
"# load data\n",
"parquet_dir='processed_parquet'\n",
"ddf=dask_cudf.read_parquet(parquet_dir, columns=include)\n",
"\n",
"print(f'Total of {len(ddf)} records split across {ddf.npartitions} partitions. ')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "ca190f9e-f633-4d2a-8f66-0694050baf70",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"DoneAndNotDoneFutures(done={<Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-1-c6f73092b714f5ee15e5609fd692d1ff', 2)>, <Future: finished, type: cudf.core.series.Series, key: ('split-1-588a2c09ae58ba022bf43bcb4cbc62df', 2)>, <Future: finished, type: cudf.core.series.Series, key: ('split-1-588a2c09ae58ba022bf43bcb4cbc62df', 3)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-0-c6f73092b714f5ee15e5609fd692d1ff', 3)>, <Future: finished, type: cudf.core.series.Series, key: ('split-0-588a2c09ae58ba022bf43bcb4cbc62df', 2)>, <Future: finished, type: cudf.core.series.Series, key: ('split-1-588a2c09ae58ba022bf43bcb4cbc62df', 0)>, <Future: finished, type: cudf.core.series.Series, key: ('split-1-588a2c09ae58ba022bf43bcb4cbc62df', 1)>, <Future: finished, type: cudf.core.series.Series, key: ('split-0-588a2c09ae58ba022bf43bcb4cbc62df', 0)>, <Future: finished, type: cudf.core.series.Series, key: ('split-0-588a2c09ae58ba022bf43bcb4cbc62df', 3)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-0-c6f73092b714f5ee15e5609fd692d1ff', 0)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-0-c6f73092b714f5ee15e5609fd692d1ff', 1)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-1-c6f73092b714f5ee15e5609fd692d1ff', 0)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-1-c6f73092b714f5ee15e5609fd692d1ff', 3)>, <Future: finished, type: cudf.core.series.Series, key: ('split-0-588a2c09ae58ba022bf43bcb4cbc62df', 1)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-0-c6f73092b714f5ee15e5609fd692d1ff', 2)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-1-c6f73092b714f5ee15e5609fd692d1ff', 1)>}, not_done=set())"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y=ddf['target'].astype('int32') # Dask RF requires data to be int32\n",
"X=ddf[features_list].astype('float32') # Dask RF requires data to be float32\n",
"\n",
"# split data into train and validation\n",
"X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=42)\n",
"\n",
"# distributing the data evenly across all the workers\n",
"X_train, X_test, y_train, y_test=client.persist([X_train, X_test, y_train, y_test])\n",
"wait([X_train, X_test, y_train, y_test])"
]
},
{
"cell_type": "markdown",
"id": "5e674b80-1a3e-46ff-94fa-66ab4d7365bc",
"metadata": {},
"source": [
"Next, we train the model. "
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "1d817e1b-f89b-4cd8-b740-21674d845786",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training 2216183 samples took 0.03 minutes. \n"
]
}
],
"source": [
"# cuML Random Forest params\n",
"dask_rf_params={\n",
" 'n_estimators': 150,\n",
" 'n_streams': 1, \n",
" 'ignore_empty_partitions': True, \n",
"}\n",
"\n",
"dask_rf=cumlDaskRF(**dask_rf_params)\n",
"\n",
"start=time.time()\n",
"dask_rf.fit(X_train, y_train)\n",
"wait(dask_rf.rfs) # allow asynchronous training tasks to finish\n",
"elapsed_time=time.time()-start\n",
"\n",
"print(f'Training {len(X_train)} samples took {round(elapsed_time/60, 2)} minutes. ')"
]
},
{
"cell_type": "markdown",
"id": "549dfbcf-dec9-4ce7-8a68-3e774e1561ed",
"metadata": {},
"source": [
"<p><img src='images/tip.png' width=720></p>\n",
"\n",
"<p><img src='images/rf_train.png' width=720></p>\n",
"\n",
"When we examine the Dask Diagnostics Dashboard, we see that the `.fit()` executed quickly (left). Had we broadcast all data to all workers, we would have seen Task Streams that include transfers (right). This could be computationally intensive and take longer to train, depending on the size of the dataset. "
]
},
{
"cell_type": "markdown",
"id": "5c2263bf-c5f0-4d23-b6fe-a839de2f914e",
"metadata": {},
"source": [
"Lastly, we evaluate the model performance. At inference time, predictions from trees on all of the workers are combined, just as if the trees had all been trained on a single GPU. We can check the performance of the estimator with `dask_ml.metrics.accuracy_score()`[[doc]](https://ml.dask.org/modules/generated/dask_ml.metrics.accuracy_score.html). "
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "69ced8d1-c340-4e57-b1be-4914635082c8",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy score for test set: 61.38%\n",
"Throughput is: 68854.42 per seconds. \n"
]
}
],
"source": [
"# due to randomness in the algorithm, we may see slight variation in accuracies\n",
"start=time.time()\n",
"prediction_test=dask_rf.predict(X_test)\n",
"elapsed_time=time.time()-start\n",
"\n",
"print(f'Accuracy score for test set: {round(float(accuracy_score(y_test, prediction_test>0.5))*100, 2)}%')\n",
"\n",
"throughput=round(len(X_test)/elapsed_time, 2)\n",
"print(f'Throughput is: {throughput} per seconds. ')"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "1c8b722d-5080-481c-8e19-554a40bf3cc7",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"{'status': 'ok', 'restart': False}"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# clean GPU memory\n",
"import IPython\n",
"app = IPython.Application.instance()\n",
"app.kernel.do_shutdown(restart=False)"
]
},
{
"cell_type": "markdown",
"id": "c769ebd6-bbe7-4e6e-a8ef-e0bfdbd7b586",
"metadata": {},
"source": [
"<a name='s2-3'></a>\n",
"## XGBoost ##\n",
"Random Forest uses a bagging technique to train independent trees for the ensemble model. Another popular decision tree ensemble uses the gradient boosting algorithm, which trains decision tree models sequentially that address weaknesses from previous trees. The idea of boosting means the algorithm combines weak learners into a stronger one in an iterative fashion. It has gained popularity because it produces high accuracy while being fast on large datasets. \n",
"\n",
"<p><img src='images/XGBoost.png' width=720></p>\n",
"\n",
"The popular **XGBoost** [[doc]](https://xgboost.readthedocs.io/en/stable/) is an optimized distributed gradient boosting library. \n",
"More information about XGBoost can be found in [this article](https://www.nvidia.com/en-us/glossary/data-science/xgboost/). Accelerating and scaling XGBoost GPU training is easy with the native support of Dask. With both libraries having integration with cuDF, we can even scale up the whole data processing pipeline. "
]
},
{
"cell_type": "markdown",
"id": "49b6725c-759b-4957-8c37-95e6711f96f5",
"metadata": {},
"source": [
"<a name='s2-3.1'></a>\n",
"### XGBoost on a Single GPU ###\n",
"XGBoost can be used to train models for regression or classification. We use the loss function and `objective` parameter to define the task. The loss function can be configured to include [regularization](https://en.wikipedia.org/wiki/Regularization_(mathematics)). The regularization term controls the complexity of the model, which can help us avoid overfitting. As with other machine learning models, tuning an XGBoost model often involves balancing the bias-variance tradeoff in machine learning. \n",
"\n",
"XGBoost refers to the model as a [Booster](https://xgboost.readthedocs.io/en/stable/tutorials/model.html#introduction-to-boosted-trees). \n",
"XGBoost can be accelerated with CUDA-capable GPUs by specifying the `tree_method` parameter as `gpu_hist`. Detail about GPU support for XGBoost can be found [here](https://xgboost.readthedocs.io/en/stable/gpu/index.html). \n",
"\n",
"XGBoost provides two sets of APIs. One is functional and the other is modeled after the scikit-learn interface. We will demonstrate both: \n",
"* The functional API one uses `xgboost.train()` and `DMatrix` \n",
"* Another set of API uses an `XGBClassifier`\n",
"\n",
"XGBoost has several model parameters: \n",
"* General - the type of booster, which could be `tree model` or `linear model`. We will use the `tree model`\n",
"* Booster - parameters related to the chosen booster. We will use some booster parameters related to Tree Boosters to overcome overfitting\n",
" * The following parameters adjust model complexity: \n",
" * `max_depth` (default=6) - maximum depth of a tree. Increasing this value will make the model more complex and more likely to overfit \n",
" * `min_child_weight` (default=1) - minimum sum of instance weight needed in a child. If the tree partition step results in a leaf node with the sum of instance weight less than `min_child_weight`, then the building process will give up further partitioning. The larger `min_child_weight` is, the more conservative the model will be\n",
" * `min_split_loss` or `gamma` (default=0) - the minimum loss reduction required to make a further partition on a leaf node of the tree. The larger `gamma` or `min_split_loss` is, the more conservative the model will be\n",
" * The following parameters increase the randomness of the model so it can generalize better: \n",
" * `subsample` (default=1) - subsample ratio of the training instances. Setting `subsample` to 0.5 means that XGBoost would randomly sample half of the training data prior to growing trees\n",
" * `colsample_bytree` (default=1) - subsample ratio of columns when constructing each tree\n",
" * `eta` or `learning_rate` (default=0.3) - step-size shrinkage used in update to prevent overfitting. `eta` shrinks the feature weights to make the boosting process more conservative\n",
"* Learning Task - parameters related to the learning scenario\n",
" * `objective` (default=reg:squarederror) - various learning objectives. We use `binary:logisitc` for a binary classification task to output probabilities. The full list of `objective` options can be found [here](https://xgboost.readthedocs.io/en/stable/parameter.html#xgboost-parameters)\n",
"\n",
"More details about the parameters of XGBoost can be found [here](https://xgboost.readthedocs.io/en/stable/parameter.html#xgboost-parameters). \n",
"\n",
"<p><img src='images/tip.png' width=720></p>\n",
"\n",
"Parameters such as `max_depth` can cause XGBoost to consume more memory when training. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "bfb2882c-8b9c-42ea-a73c-58d37ff3f569",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# import dependencies\n",
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"import xgboost\n",
"from cuml.model_selection import train_test_split\n",
"\n",
"import dask_cudf\n",
"import matplotlib.pyplot as plt\n",
"import time"
]
},
{
"cell_type": "markdown",
"id": "7ab1de78-2abf-4973-a538-c0176d2185b9",
"metadata": {},
"source": [
"We start by importing data. Since we are training with a single GPU, we will load the data input the memory with `.compute()`. Data needs to be split into a train and test set, which can be accomplished with `cuml.model_selection.train_test_split()`[[doc]](https://docs.rapids.ai/api/cuml/stable/api.html#model-selection-and-data-splitting). "
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "0ae15b27-bb1e-4408-9a48-5aa2c7c2cc7d",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# initializing list\n",
"features_list=['brand', 'cat_0', 'cat_1', 'cat_2', 'cat_3', \n",
" 'price', 'ts_hour', 'ts_minute', 'ts_weekday', \n",
" 'brand_target_sum', 'brand_count', 'cat_0_target_sum', \n",
" 'cat_0_count', 'cat_1_target_sum', 'cat_1_count', \n",
" 'cat_2_target_sum', 'cat_2_count', 'cat_3_target_sum', \n",
" 'cat_3_count', 'TE_brand_target', 'TE_cat_0_target', \n",
" 'TE_cat_1_target', 'TE_cat_2_target', 'TE_cat_3_target', \n",
" 'relative_price_product', 'relative_price_category']\n",
" \n",
"include=features_list+['target']"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "e93bf219-eb9f-4e49-8209-3f4b214055f5",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total of 2461697 records. \n"
]
}
],
"source": [
"# load data with dask_cudf\n",
"parquet_dir='processed_parquet'\n",
"ddf=dask_cudf.read_parquet(parquet_dir, columns=include)\n",
"\n",
"# load data into single GPU memory\n",
"gdf=ddf.compute()\n",
"\n",
"print(f'Total of {len(gdf)} records. ')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "83575ac8-2484-4658-b06a-76c7895fa667",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# XGBoost treats all data as 32-bit float internally or we can explicitly convert\n",
"y=gdf['target'].astype('float32')\n",
"X=gdf[features_list].astype('float32')\n",
"\n",
"# split data into train and test sets\n",
"X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=42)"
]
},
{
"cell_type": "markdown",
"id": "231bb4a3-43d4-430c-912f-a018c5e04de8",
"metadata": {},
"source": [
"<mark>[DMatrix](https://xgboost.readthedocs.io/en/latest/python/python_api.html#xgboost.DMatrix) is an internal data structure</mark> that is used by XGBoost, which is optimized for both memory efficiency and training speed. XGBoost supports building a DMatrix from a cuDF DataFrame that's already on the GPU without the need to first copy data to CPU memory. This significantly reduces overhead for the overall development workflow. "
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "b70ff109-dc4c-4985-bb94-9cdba13d2bde",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [],
"source": [
"# create DMatrix\n",
"dtrain=xgboost.DMatrix(X_train, y_train) \n",
"dtest=xgboost.DMatrix(X_test, y_test)"
]
},
{
"cell_type": "markdown",
"id": "74e90115-3d8d-476b-811b-94dd1d7d4eab",
"metadata": {},
"source": [
"Next, we will fit the model. XGBoost enables early stopping through the `early_stopping_rounds` parameter and custom objective as well as evaluation metrics. Early stopping will force XGBoost to stop the training process once the validation metric fails to improve after a specific number of consecutive rounds. XGBoost provides two sets of APIs: \n",
"1. Uses `xgboost.train()`\n",
"2. Uses `XGBClassifier`\n",
"\n",
"When training with `xgboost.train()`, we need to create an empty dictionary and pass it to the `evals_result` parameter if we want to save the training history. "
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "d36216ae-db6f-400c-a0d9-66907fb40bfb",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0]\ttrain-auc:0.60701\tvalid-auc:0.60556\n",
"[1]\ttrain-auc:0.60901\tvalid-auc:0.60759\n",
"[2]\ttrain-auc:0.61019\tvalid-auc:0.60897\n",
"[3]\ttrain-auc:0.61117\tvalid-auc:0.60972\n",
"[4]\ttrain-auc:0.61185\tvalid-auc:0.61031\n",
"[5]\ttrain-auc:0.61249\tvalid-auc:0.61095\n",
"[6]\ttrain-auc:0.61309\tvalid-auc:0.61148\n",
"[7]\ttrain-auc:0.61374\tvalid-auc:0.61205\n",
"[8]\ttrain-auc:0.61446\tvalid-auc:0.61264\n",
"[9]\ttrain-auc:0.61537\tvalid-auc:0.61345\n",
"[10]\ttrain-auc:0.61571\tvalid-auc:0.61367\n",
"[11]\ttrain-auc:0.61627\tvalid-auc:0.61419\n",
"[12]\ttrain-auc:0.61659\tvalid-auc:0.61443\n",
"[13]\ttrain-auc:0.61700\tvalid-auc:0.61475\n",
"[14]\ttrain-auc:0.61725\tvalid-auc:0.61489\n",
"[15]\ttrain-auc:0.61793\tvalid-auc:0.61543\n",
"[16]\ttrain-auc:0.61815\tvalid-auc:0.61551\n",
"[17]\ttrain-auc:0.61860\tvalid-auc:0.61588\n",
"[18]\ttrain-auc:0.61888\tvalid-auc:0.61605\n",
"[19]\ttrain-auc:0.61911\tvalid-auc:0.61611\n",
"[20]\ttrain-auc:0.61933\tvalid-auc:0.61623\n",
"[21]\ttrain-auc:0.61952\tvalid-auc:0.61634\n",
"[22]\ttrain-auc:0.61978\tvalid-auc:0.61647\n",
"[23]\ttrain-auc:0.62005\tvalid-auc:0.61656\n",
"[24]\ttrain-auc:0.62017\tvalid-auc:0.61660\n",
"[25]\ttrain-auc:0.62034\tvalid-auc:0.61669\n",
"[26]\ttrain-auc:0.62082\tvalid-auc:0.61707\n",
"[27]\ttrain-auc:0.62109\tvalid-auc:0.61725\n",
"[28]\ttrain-auc:0.62145\tvalid-auc:0.61753\n",
"[29]\ttrain-auc:0.62161\tvalid-auc:0.61759\n",
"[30]\ttrain-auc:0.62204\tvalid-auc:0.61790\n",
"[31]\ttrain-auc:0.62231\tvalid-auc:0.61808\n",
"[32]\ttrain-auc:0.62246\tvalid-auc:0.61816\n",
"[33]\ttrain-auc:0.62266\tvalid-auc:0.61824\n",
"[34]\ttrain-auc:0.62312\tvalid-auc:0.61854\n",
"[35]\ttrain-auc:0.62351\tvalid-auc:0.61876\n",
"[36]\ttrain-auc:0.62366\tvalid-auc:0.61882\n",
"[37]\ttrain-auc:0.62375\tvalid-auc:0.61887\n",
"[38]\ttrain-auc:0.62422\tvalid-auc:0.61920\n",
"[39]\ttrain-auc:0.62437\tvalid-auc:0.61924\n",
"[40]\ttrain-auc:0.62456\tvalid-auc:0.61933\n",
"[41]\ttrain-auc:0.62470\tvalid-auc:0.61939\n",
"[42]\ttrain-auc:0.62476\tvalid-auc:0.61941\n",
"[43]\ttrain-auc:0.62488\tvalid-auc:0.61945\n",
"[44]\ttrain-auc:0.62493\tvalid-auc:0.61945\n",
"[45]\ttrain-auc:0.62523\tvalid-auc:0.61956\n",
"[46]\ttrain-auc:0.62548\tvalid-auc:0.61965\n",
"[47]\ttrain-auc:0.62560\tvalid-auc:0.61969\n",
"[48]\ttrain-auc:0.62592\tvalid-auc:0.61985\n",
"[49]\ttrain-auc:0.62600\tvalid-auc:0.61985\n",
"[50]\ttrain-auc:0.62624\tvalid-auc:0.61993\n",
"[51]\ttrain-auc:0.62650\tvalid-auc:0.62008\n",
"[52]\ttrain-auc:0.62675\tvalid-auc:0.62024\n",
"[53]\ttrain-auc:0.62707\tvalid-auc:0.62044\n",
"[54]\ttrain-auc:0.62720\tvalid-auc:0.62049\n",
"[55]\ttrain-auc:0.62738\tvalid-auc:0.62055\n",
"[56]\ttrain-auc:0.62748\tvalid-auc:0.62059\n",
"[57]\ttrain-auc:0.62765\tvalid-auc:0.62063\n",
"[58]\ttrain-auc:0.62787\tvalid-auc:0.62074\n",
"[59]\ttrain-auc:0.62814\tvalid-auc:0.62090\n",
"[60]\ttrain-auc:0.62823\tvalid-auc:0.62098\n",
"[61]\ttrain-auc:0.62828\tvalid-auc:0.62100\n",
"[62]\ttrain-auc:0.62858\tvalid-auc:0.62118\n",
"[63]\ttrain-auc:0.62871\tvalid-auc:0.62120\n",
"[64]\ttrain-auc:0.62899\tvalid-auc:0.62142\n",
"[65]\ttrain-auc:0.62924\tvalid-auc:0.62154\n",
"[66]\ttrain-auc:0.62938\tvalid-auc:0.62159\n",
"[67]\ttrain-auc:0.62949\tvalid-auc:0.62160\n",
"[68]\ttrain-auc:0.62954\tvalid-auc:0.62162\n",
"[69]\ttrain-auc:0.62960\tvalid-auc:0.62164\n",
"[70]\ttrain-auc:0.62965\tvalid-auc:0.62164\n",
"[71]\ttrain-auc:0.62988\tvalid-auc:0.62172\n",
"[72]\ttrain-auc:0.62992\tvalid-auc:0.62173\n",
"[73]\ttrain-auc:0.63026\tvalid-auc:0.62193\n",
"[74]\ttrain-auc:0.63036\tvalid-auc:0.62197\n",
"[75]\ttrain-auc:0.63059\tvalid-auc:0.62208\n",
"[76]\ttrain-auc:0.63074\tvalid-auc:0.62214\n",
"[77]\ttrain-auc:0.63091\tvalid-auc:0.62218\n",
"[78]\ttrain-auc:0.63107\tvalid-auc:0.62226\n",
"[79]\ttrain-auc:0.63132\tvalid-auc:0.62243\n",
"[80]\ttrain-auc:0.63150\tvalid-auc:0.62248\n",
"[81]\ttrain-auc:0.63166\tvalid-auc:0.62253\n",
"[82]\ttrain-auc:0.63189\tvalid-auc:0.62262\n",
"[83]\ttrain-auc:0.63201\tvalid-auc:0.62264\n",
"[84]\ttrain-auc:0.63212\tvalid-auc:0.62269\n",
"[85]\ttrain-auc:0.63222\tvalid-auc:0.62271\n",
"[86]\ttrain-auc:0.63223\tvalid-auc:0.62271\n",
"[87]\ttrain-auc:0.63234\tvalid-auc:0.62271\n",
"[88]\ttrain-auc:0.63246\tvalid-auc:0.62277\n",
"[89]\ttrain-auc:0.63269\tvalid-auc:0.62290\n",
"[90]\ttrain-auc:0.63277\tvalid-auc:0.62291\n",
"[91]\ttrain-auc:0.63289\tvalid-auc:0.62299\n",
"[92]\ttrain-auc:0.63311\tvalid-auc:0.62306\n",
"[93]\ttrain-auc:0.63328\tvalid-auc:0.62316\n",
"[94]\ttrain-auc:0.63340\tvalid-auc:0.62320\n",
"[95]\ttrain-auc:0.63361\tvalid-auc:0.62325\n",
"[96]\ttrain-auc:0.63370\tvalid-auc:0.62327\n",
"[97]\ttrain-auc:0.63392\tvalid-auc:0.62336\n",
"[98]\ttrain-auc:0.63415\tvalid-auc:0.62345\n",
"[99]\ttrain-auc:0.63420\tvalid-auc:0.62346\n",
"[100]\ttrain-auc:0.63435\tvalid-auc:0.62352\n",
"[101]\ttrain-auc:0.63443\tvalid-auc:0.62352\n",
"[102]\ttrain-auc:0.63448\tvalid-auc:0.62352\n",
"[103]\ttrain-auc:0.63470\tvalid-auc:0.62364\n",
"[104]\ttrain-auc:0.63476\tvalid-auc:0.62366\n",
"[105]\ttrain-auc:0.63487\tvalid-auc:0.62367\n",
"[106]\ttrain-auc:0.63506\tvalid-auc:0.62371\n",
"[107]\ttrain-auc:0.63526\tvalid-auc:0.62383\n",
"[108]\ttrain-auc:0.63549\tvalid-auc:0.62393\n",
"[109]\ttrain-auc:0.63565\tvalid-auc:0.62400\n",
"[110]\ttrain-auc:0.63573\tvalid-auc:0.62401\n",
"[111]\ttrain-auc:0.63577\tvalid-auc:0.62402\n",
"[112]\ttrain-auc:0.63581\tvalid-auc:0.62403\n",
"[113]\ttrain-auc:0.63589\tvalid-auc:0.62407\n",
"[114]\ttrain-auc:0.63598\tvalid-auc:0.62409\n",
"[115]\ttrain-auc:0.63614\tvalid-auc:0.62419\n",
"[116]\ttrain-auc:0.63616\tvalid-auc:0.62419\n",
"[117]\ttrain-auc:0.63638\tvalid-auc:0.62427\n",
"[118]\ttrain-auc:0.63648\tvalid-auc:0.62430\n",
"[119]\ttrain-auc:0.63667\tvalid-auc:0.62439\n",
"[120]\ttrain-auc:0.63688\tvalid-auc:0.62449\n",
"[121]\ttrain-auc:0.63693\tvalid-auc:0.62448\n",
"[122]\ttrain-auc:0.63695\tvalid-auc:0.62449\n",
"[123]\ttrain-auc:0.63710\tvalid-auc:0.62451\n",
"[124]\ttrain-auc:0.63725\tvalid-auc:0.62457\n",
"[125]\ttrain-auc:0.63732\tvalid-auc:0.62459\n",
"[126]\ttrain-auc:0.63750\tvalid-auc:0.62463\n",
"[127]\ttrain-auc:0.63759\tvalid-auc:0.62465\n",
"[128]\ttrain-auc:0.63773\tvalid-auc:0.62470\n",
"[129]\ttrain-auc:0.63785\tvalid-auc:0.62472\n",
"[130]\ttrain-auc:0.63801\tvalid-auc:0.62480\n",
"[131]\ttrain-auc:0.63805\tvalid-auc:0.62482\n",
"[132]\ttrain-auc:0.63810\tvalid-auc:0.62483\n",
"[133]\ttrain-auc:0.63823\tvalid-auc:0.62487\n",
"[134]\ttrain-auc:0.63834\tvalid-auc:0.62491\n",
"[135]\ttrain-auc:0.63847\tvalid-auc:0.62493\n",
"[136]\ttrain-auc:0.63850\tvalid-auc:0.62493\n",
"[137]\ttrain-auc:0.63862\tvalid-auc:0.62492\n",
"[138]\ttrain-auc:0.63866\tvalid-auc:0.62493\n",
"[139]\ttrain-auc:0.63874\tvalid-auc:0.62496\n",
"[140]\ttrain-auc:0.63875\tvalid-auc:0.62496\n",
"[141]\ttrain-auc:0.63892\tvalid-auc:0.62501\n",
"[142]\ttrain-auc:0.63903\tvalid-auc:0.62505\n",
"[143]\ttrain-auc:0.63930\tvalid-auc:0.62524\n",
"[144]\ttrain-auc:0.63944\tvalid-auc:0.62534\n",
"[145]\ttrain-auc:0.63959\tvalid-auc:0.62541\n",
"[146]\ttrain-auc:0.63976\tvalid-auc:0.62549\n",
"[147]\ttrain-auc:0.63989\tvalid-auc:0.62555\n",
"[148]\ttrain-auc:0.63993\tvalid-auc:0.62555\n",
"[149]\ttrain-auc:0.64001\tvalid-auc:0.62557\n",
"[150]\ttrain-auc:0.64012\tvalid-auc:0.62558\n",
"[151]\ttrain-auc:0.64027\tvalid-auc:0.62563\n",
"[152]\ttrain-auc:0.64044\tvalid-auc:0.62568\n",
"[153]\ttrain-auc:0.64052\tvalid-auc:0.62573\n",
"[154]\ttrain-auc:0.64060\tvalid-auc:0.62575\n",
"[155]\ttrain-auc:0.64074\tvalid-auc:0.62583\n",
"[156]\ttrain-auc:0.64093\tvalid-auc:0.62588\n",
"[157]\ttrain-auc:0.64102\tvalid-auc:0.62593\n",
"[158]\ttrain-auc:0.64117\tvalid-auc:0.62598\n",
"[159]\ttrain-auc:0.64126\tvalid-auc:0.62599\n",
"[160]\ttrain-auc:0.64131\tvalid-auc:0.62598\n",
"[161]\ttrain-auc:0.64149\tvalid-auc:0.62604\n",
"[162]\ttrain-auc:0.64165\tvalid-auc:0.62606\n",
"[163]\ttrain-auc:0.64185\tvalid-auc:0.62610\n",
"[164]\ttrain-auc:0.64193\tvalid-auc:0.62608\n",
"[165]\ttrain-auc:0.64208\tvalid-auc:0.62610\n",
"[166]\ttrain-auc:0.64218\tvalid-auc:0.62610\n",
"[167]\ttrain-auc:0.64229\tvalid-auc:0.62614\n",
"[168]\ttrain-auc:0.64233\tvalid-auc:0.62615\n",
"[169]\ttrain-auc:0.64238\tvalid-auc:0.62614\n",
"[170]\ttrain-auc:0.64253\tvalid-auc:0.62620\n",
"[171]\ttrain-auc:0.64261\tvalid-auc:0.62619\n",
"[172]\ttrain-auc:0.64271\tvalid-auc:0.62620\n",
"[173]\ttrain-auc:0.64287\tvalid-auc:0.62627\n",
"[174]\ttrain-auc:0.64303\tvalid-auc:0.62633\n",
"[175]\ttrain-auc:0.64312\tvalid-auc:0.62633\n",
"[176]\ttrain-auc:0.64325\tvalid-auc:0.62636\n",
"[177]\ttrain-auc:0.64334\tvalid-auc:0.62641\n",
"[178]\ttrain-auc:0.64338\tvalid-auc:0.62641\n",
"[179]\ttrain-auc:0.64350\tvalid-auc:0.62647\n",
"[180]\ttrain-auc:0.64363\tvalid-auc:0.62649\n",
"[181]\ttrain-auc:0.64373\tvalid-auc:0.62649\n",
"[182]\ttrain-auc:0.64381\tvalid-auc:0.62651\n",
"[183]\ttrain-auc:0.64384\tvalid-auc:0.62650\n",
"[184]\ttrain-auc:0.64396\tvalid-auc:0.62653\n",
"[185]\ttrain-auc:0.64408\tvalid-auc:0.62658\n",
"[186]\ttrain-auc:0.64421\tvalid-auc:0.62661\n",
"[187]\ttrain-auc:0.64430\tvalid-auc:0.62666\n",
"[188]\ttrain-auc:0.64438\tvalid-auc:0.62669\n",
"[189]\ttrain-auc:0.64449\tvalid-auc:0.62669\n",
"[190]\ttrain-auc:0.64451\tvalid-auc:0.62670\n",
"[191]\ttrain-auc:0.64463\tvalid-auc:0.62672\n",
"[192]\ttrain-auc:0.64468\tvalid-auc:0.62675\n",
"[193]\ttrain-auc:0.64483\tvalid-auc:0.62677\n",
"[194]\ttrain-auc:0.64488\tvalid-auc:0.62678\n",
"[195]\ttrain-auc:0.64496\tvalid-auc:0.62678\n",
"[196]\ttrain-auc:0.64502\tvalid-auc:0.62678\n",
"[197]\ttrain-auc:0.64518\tvalid-auc:0.62681\n",
"[198]\ttrain-auc:0.64525\tvalid-auc:0.62683\n",
"[199]\ttrain-auc:0.64531\tvalid-auc:0.62684\n",
"[200]\ttrain-auc:0.64535\tvalid-auc:0.62684\n",
"[201]\ttrain-auc:0.64538\tvalid-auc:0.62684\n",
"[202]\ttrain-auc:0.64546\tvalid-auc:0.62685\n",
"[203]\ttrain-auc:0.64550\tvalid-auc:0.62685\n",
"[204]\ttrain-auc:0.64553\tvalid-auc:0.62684\n",
"[205]\ttrain-auc:0.64566\tvalid-auc:0.62689\n",
"[206]\ttrain-auc:0.64578\tvalid-auc:0.62691\n",
"[207]\ttrain-auc:0.64591\tvalid-auc:0.62694\n",
"[208]\ttrain-auc:0.64604\tvalid-auc:0.62697\n",
"[209]\ttrain-auc:0.64614\tvalid-auc:0.62700\n",
"[210]\ttrain-auc:0.64627\tvalid-auc:0.62701\n",
"[211]\ttrain-auc:0.64638\tvalid-auc:0.62703\n",
"[212]\ttrain-auc:0.64653\tvalid-auc:0.62707\n",
"[213]\ttrain-auc:0.64655\tvalid-auc:0.62706\n",
"[214]\ttrain-auc:0.64662\tvalid-auc:0.62708\n",
"[215]\ttrain-auc:0.64672\tvalid-auc:0.62708\n",
"[216]\ttrain-auc:0.64685\tvalid-auc:0.62711\n",
"[217]\ttrain-auc:0.64688\tvalid-auc:0.62711\n",
"[218]\ttrain-auc:0.64699\tvalid-auc:0.62710\n",
"[219]\ttrain-auc:0.64715\tvalid-auc:0.62712\n",
"[220]\ttrain-auc:0.64726\tvalid-auc:0.62713\n",
"[221]\ttrain-auc:0.64745\tvalid-auc:0.62722\n",
"[222]\ttrain-auc:0.64758\tvalid-auc:0.62726\n",
"[223]\ttrain-auc:0.64770\tvalid-auc:0.62726\n",
"[224]\ttrain-auc:0.64781\tvalid-auc:0.62731\n",
"[225]\ttrain-auc:0.64785\tvalid-auc:0.62731\n",
"[226]\ttrain-auc:0.64799\tvalid-auc:0.62737\n",
"[227]\ttrain-auc:0.64808\tvalid-auc:0.62739\n",
"[228]\ttrain-auc:0.64819\tvalid-auc:0.62741\n",
"[229]\ttrain-auc:0.64823\tvalid-auc:0.62743\n",
"[230]\ttrain-auc:0.64835\tvalid-auc:0.62750\n",
"[231]\ttrain-auc:0.64838\tvalid-auc:0.62751\n",
"[232]\ttrain-auc:0.64851\tvalid-auc:0.62753\n",
"[233]\ttrain-auc:0.64862\tvalid-auc:0.62756\n",
"[234]\ttrain-auc:0.64874\tvalid-auc:0.62763\n",
"[235]\ttrain-auc:0.64884\tvalid-auc:0.62764\n",
"[236]\ttrain-auc:0.64894\tvalid-auc:0.62765\n",
"[237]\ttrain-auc:0.64911\tvalid-auc:0.62770\n",
"[238]\ttrain-auc:0.64921\tvalid-auc:0.62774\n",
"[239]\ttrain-auc:0.64932\tvalid-auc:0.62780\n",
"[240]\ttrain-auc:0.64939\tvalid-auc:0.62782\n",
"[241]\ttrain-auc:0.64954\tvalid-auc:0.62788\n",
"[242]\ttrain-auc:0.64970\tvalid-auc:0.62794\n",
"[243]\ttrain-auc:0.64979\tvalid-auc:0.62795\n",
"[244]\ttrain-auc:0.64988\tvalid-auc:0.62797\n",
"[245]\ttrain-auc:0.64993\tvalid-auc:0.62799\n",
"[246]\ttrain-auc:0.65002\tvalid-auc:0.62801\n",
"[247]\ttrain-auc:0.65013\tvalid-auc:0.62801\n",
"[248]\ttrain-auc:0.65030\tvalid-auc:0.62804\n",
"[249]\ttrain-auc:0.65042\tvalid-auc:0.62805\n",
"[250]\ttrain-auc:0.65051\tvalid-auc:0.62808\n",
"[251]\ttrain-auc:0.65066\tvalid-auc:0.62813\n",
"[252]\ttrain-auc:0.65078\tvalid-auc:0.62818\n",
"[253]\ttrain-auc:0.65091\tvalid-auc:0.62820\n",
"[254]\ttrain-auc:0.65098\tvalid-auc:0.62821\n",
"[255]\ttrain-auc:0.65110\tvalid-auc:0.62822\n",
"[256]\ttrain-auc:0.65120\tvalid-auc:0.62825\n",
"[257]\ttrain-auc:0.65127\tvalid-auc:0.62826\n",
"[258]\ttrain-auc:0.65130\tvalid-auc:0.62826\n",
"[259]\ttrain-auc:0.65139\tvalid-auc:0.62830\n",
"[260]\ttrain-auc:0.65151\tvalid-auc:0.62836\n",
"[261]\ttrain-auc:0.65161\tvalid-auc:0.62838\n",
"[262]\ttrain-auc:0.65166\tvalid-auc:0.62839\n",
"[263]\ttrain-auc:0.65179\tvalid-auc:0.62842\n",
"[264]\ttrain-auc:0.65183\tvalid-auc:0.62843\n",
"[265]\ttrain-auc:0.65187\tvalid-auc:0.62843\n",
"[266]\ttrain-auc:0.65192\tvalid-auc:0.62842\n",
"[267]\ttrain-auc:0.65199\tvalid-auc:0.62842\n",
"[268]\ttrain-auc:0.65207\tvalid-auc:0.62845\n",
"[269]\ttrain-auc:0.65218\tvalid-auc:0.62848\n",
"[270]\ttrain-auc:0.65226\tvalid-auc:0.62850\n",
"[271]\ttrain-auc:0.65233\tvalid-auc:0.62852\n",
"[272]\ttrain-auc:0.65236\tvalid-auc:0.62851\n",
"[273]\ttrain-auc:0.65245\tvalid-auc:0.62855\n",
"[274]\ttrain-auc:0.65250\tvalid-auc:0.62854\n",
"[275]\ttrain-auc:0.65253\tvalid-auc:0.62855\n",
"[276]\ttrain-auc:0.65259\tvalid-auc:0.62856\n",
"[277]\ttrain-auc:0.65259\tvalid-auc:0.62856\n",
"[278]\ttrain-auc:0.65264\tvalid-auc:0.62857\n",
"[279]\ttrain-auc:0.65275\tvalid-auc:0.62862\n",
"[280]\ttrain-auc:0.65289\tvalid-auc:0.62864\n",
"[281]\ttrain-auc:0.65298\tvalid-auc:0.62869\n",
"[282]\ttrain-auc:0.65306\tvalid-auc:0.62870\n",
"[283]\ttrain-auc:0.65313\tvalid-auc:0.62870\n",
"[284]\ttrain-auc:0.65321\tvalid-auc:0.62871\n",
"[285]\ttrain-auc:0.65323\tvalid-auc:0.62871\n",
"[286]\ttrain-auc:0.65335\tvalid-auc:0.62875\n",
"[287]\ttrain-auc:0.65344\tvalid-auc:0.62877\n",
"[288]\ttrain-auc:0.65353\tvalid-auc:0.62879\n",
"[289]\ttrain-auc:0.65358\tvalid-auc:0.62879\n",
"[290]\ttrain-auc:0.65366\tvalid-auc:0.62882\n",
"[291]\ttrain-auc:0.65376\tvalid-auc:0.62885\n",
"[292]\ttrain-auc:0.65387\tvalid-auc:0.62885\n",
"[293]\ttrain-auc:0.65396\tvalid-auc:0.62886\n",
"[294]\ttrain-auc:0.65404\tvalid-auc:0.62886\n",
"[295]\ttrain-auc:0.65409\tvalid-auc:0.62887\n",
"[296]\ttrain-auc:0.65418\tvalid-auc:0.62887\n",
"[297]\ttrain-auc:0.65424\tvalid-auc:0.62888\n",
"[298]\ttrain-auc:0.65429\tvalid-auc:0.62889\n",
"[299]\ttrain-auc:0.65442\tvalid-auc:0.62892\n",
"[300]\ttrain-auc:0.65450\tvalid-auc:0.62892\n",
"[301]\ttrain-auc:0.65458\tvalid-auc:0.62892\n",
"[302]\ttrain-auc:0.65470\tvalid-auc:0.62894\n",
"[303]\ttrain-auc:0.65475\tvalid-auc:0.62894\n",
"[304]\ttrain-auc:0.65477\tvalid-auc:0.62893\n",
"[305]\ttrain-auc:0.65485\tvalid-auc:0.62892\n",
"[306]\ttrain-auc:0.65488\tvalid-auc:0.62893\n",
"[307]\ttrain-auc:0.65490\tvalid-auc:0.62893\n",
"[308]\ttrain-auc:0.65496\tvalid-auc:0.62895\n",
"[309]\ttrain-auc:0.65506\tvalid-auc:0.62897\n",
"[310]\ttrain-auc:0.65517\tvalid-auc:0.62900\n",
"[311]\ttrain-auc:0.65526\tvalid-auc:0.62901\n",
"[312]\ttrain-auc:0.65535\tvalid-auc:0.62900\n",
"[313]\ttrain-auc:0.65551\tvalid-auc:0.62907\n",
"[314]\ttrain-auc:0.65567\tvalid-auc:0.62916\n",
"[315]\ttrain-auc:0.65575\tvalid-auc:0.62915\n",
"[316]\ttrain-auc:0.65583\tvalid-auc:0.62919\n",
"[317]\ttrain-auc:0.65595\tvalid-auc:0.62923\n",
"[318]\ttrain-auc:0.65607\tvalid-auc:0.62924\n",
"[319]\ttrain-auc:0.65617\tvalid-auc:0.62926\n",
"[320]\ttrain-auc:0.65625\tvalid-auc:0.62927\n",
"[321]\ttrain-auc:0.65639\tvalid-auc:0.62933\n",
"[322]\ttrain-auc:0.65649\tvalid-auc:0.62936\n",
"[323]\ttrain-auc:0.65656\tvalid-auc:0.62936\n",
"[324]\ttrain-auc:0.65669\tvalid-auc:0.62938\n",
"[325]\ttrain-auc:0.65680\tvalid-auc:0.62941\n",
"[326]\ttrain-auc:0.65687\tvalid-auc:0.62942\n",
"[327]\ttrain-auc:0.65692\tvalid-auc:0.62943\n",
"[328]\ttrain-auc:0.65698\tvalid-auc:0.62945\n",
"[329]\ttrain-auc:0.65702\tvalid-auc:0.62945\n",
"[330]\ttrain-auc:0.65711\tvalid-auc:0.62943\n",
"[331]\ttrain-auc:0.65722\tvalid-auc:0.62946\n",
"[332]\ttrain-auc:0.65727\tvalid-auc:0.62947\n",
"[333]\ttrain-auc:0.65730\tvalid-auc:0.62947\n",
"[334]\ttrain-auc:0.65732\tvalid-auc:0.62948\n",
"[335]\ttrain-auc:0.65744\tvalid-auc:0.62948\n",
"[336]\ttrain-auc:0.65752\tvalid-auc:0.62949\n",
"[337]\ttrain-auc:0.65769\tvalid-auc:0.62955\n",
"[338]\ttrain-auc:0.65775\tvalid-auc:0.62957\n",
"[339]\ttrain-auc:0.65789\tvalid-auc:0.62961\n",
"[340]\ttrain-auc:0.65797\tvalid-auc:0.62965\n",
"[341]\ttrain-auc:0.65807\tvalid-auc:0.62966\n",
"[342]\ttrain-auc:0.65811\tvalid-auc:0.62966\n",
"[343]\ttrain-auc:0.65817\tvalid-auc:0.62967\n",
"[344]\ttrain-auc:0.65830\tvalid-auc:0.62969\n",
"[345]\ttrain-auc:0.65837\tvalid-auc:0.62970\n",
"[346]\ttrain-auc:0.65848\tvalid-auc:0.62973\n",
"[347]\ttrain-auc:0.65857\tvalid-auc:0.62975\n",
"[348]\ttrain-auc:0.65864\tvalid-auc:0.62976\n",
"[349]\ttrain-auc:0.65870\tvalid-auc:0.62976\n",
"Training 1846272 samples took 0.11 minutes. \n"
]
}
],
"source": [
"# train XGBoost classification model on single GPU\n",
"# define model parameter\n",
"xgb_params={ \n",
" 'eval_metric': ['auc'], \n",
" 'objective': 'binary:logistic',\n",
" 'tree_method': 'gpu_hist'\n",
"}\n",
"\n",
"evaluation_result={}\n",
"\n",
"# train the model\n",
"start=time.time()\n",
"xgb_clf=xgboost.train(xgb_params, \n",
" dtrain=dtrain,\n",
" evals=[(dtrain, 'train'), (dtest, 'valid')],\n",
" num_boost_round=350,\n",
" early_stopping_rounds=5, \n",
" evals_result=evaluation_result\n",
")\n",
"elapsed_time=time.time()-start\n",
"\n",
"print(f'Training {len(X_train)} samples took {round(elapsed_time/60, 2)} minutes. ')"
]
},
{
"cell_type": "markdown",
"id": "98acf768-7831-4a40-bd9a-82cded017807",
"metadata": {},
"source": [
"There is another interface that mimics scikit-learn estimators with higher level of abstraction. It might be easier to use compared to the functional interface but also has more constraints. "
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "8d052a00-1d92-4a14-a421-3a3bcc6ac799",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training 1846272 samples took 0.09 minutes. \n"
]
}
],
"source": [
"# use XGBClassifier\n",
"# define model parameter\n",
"xgb_params={\n",
" 'n_estimators': 350, \n",
" 'tree_method': 'gpu_hist', \n",
" 'early_stopping_rounds': 10, \n",
" 'eval_metric': ['auc'], \n",
" 'objective': 'binary:logistic'\n",
"}\n",
"\n",
"xgb_clf=xgboost.XGBClassifier(**xgb_params)\n",
"\n",
"# train the model\n",
"start=time.time()\n",
"xgb_clf.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)\n",
"elapsed_time=time.time()-start\n",
"\n",
"print(f'Training {len(X_train)} samples took {round(elapsed_time/60, 2)} minutes. ')"
]
},
{
"cell_type": "markdown",
"id": "1b7ddeb9-f1b1-45b7-954f-6c88609cfca5",
"metadata": {},
"source": [
"Finally, we evaluate the model performance. "
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "1dda6c10-b636-496b-9603-45ec2864200a",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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7kph6c5j9m09LqnDA5c1oH1E0et4OoISoFLg6epM/Iu9HfbapSUmJqbAc6vVyquvvsqcOXM4fPiwfc00b2/v857nTOIC5kR8wcHB9jWpinLzzTdz9dVXs2zZMlatWsWCBQsYP348H3/8MXfffTcbNmygXr169uTn37Zt28b1119foCw2NpaJEyditVrtNUX/vr5169axe/duZs2aZS8zDAObzca+ffuKrOXJysoqMjH6/PPPiYqKolWrVgC0bt2aqKgoZs+ezX333XfOay+KcZ7Z0Ivi6elJZmZmiV5DRKS05ORbiYs/yqRFe9iWeHYtTScLDOocweDYCMJrn/97wxGUAJUCi8VSas1QjvTvxObNN9/krbfeYuLEibRo0QJvb29GjBjxnx2I/11zYbFYCkxMWRQPDw+uvPJKrrzySp5//nnuvfdeRo8ezd13322f4+lcikoYDMMotN+/r89ms/F///d/PPzww4X2rV+/fpGvFRAQwMmTJwuVT5s2ja1bt+LicvZzYLPZmDp1qj0B8vPzIy0trdCxqampAPYZzhs1asTy5cvJy8srVi3QiRMnqFOnzn/uJyJS2uLij/Ls3M0cO2UuKO7l5kznqNp0iKzF5U0CaRB4cYNkylLl/9aWMrNs2TKuv/567rjjDsD8Qt+1a1eRNSOlrWnTpsybNw8wa5QOHTrEzp07i6wFatq0KcuXLy9QtnLlSho1anTeBUDbtm3L1q1badCgQbHjatOmDUlJSZw8eZKaNWsCZl+itWvXsnjxYmrVOlu9m5qaSrdu3diyZQvNmzencePGHDp0iKSkJIKDg+37rVmzBicnJ3scAwcO5J133mHy5Mk88sgjhWJITU219wPas2cP2dnZtGnTptjXICJyseasSeCjZfvYnWyuzBDk507/mDCGXBpJDa/KseqCEiA5pwYNGtj7tdSsWZMJEyaQlJRUqgnQ8ePHufXWWxkyZAgtW7bE19eXtWvXMn78eHuzVvfu3enWrRs333wzEyZMoEGDBmzfvh2LxcJVV13FY489Rvv27Rk7diz9+/dn1apVvPfee0yePPm8r/3UU0/RqVMnHnjgAYYOHYq3tzfbtm0jLi7unEPL27RpQ506dVixYgXXXHMNYHZ+7tChQ5Ednjt37szUqVN566236NWrF02aNGHAgAG8/PLL1K1bl02bNvH4448zbNgw+3QCHTt25Mknn+Sxxx7j8OHD3HjjjdStW5fdu3czZcoULr30UntitGzZMqKiooiOjr7g90BEpLi2J6Xz8bJ9fL3uEAAuThbuuTSSkb0a4e5Sel0yyoMSIDmn5557jn379tG7d2+8vLy47777uOGGG4psxrlQPj4+dOzYkbfeeos9e/aQl5dHWFgYQ4cO5dlnn7Xv98033/D4449z2223cfr0aRo0aMCrr74KmDU5X375Jc8//zxjx44lJCSEF198sUAH6KK0bNmSJUuWMGrUKLp27YphGERHR9O/f/9zHuPs7MyQIUOYNWsW11xzDbm5uXz22Wc89dRTRe5/8803M27cOF577TXc3Nz45ZdfePbZZ7n99ttJTk4mPDyce++9lyeffLLAca+99hrt2rVj0qRJTJkyBZvNRnR0NLfccgt33XWXfb8vvviCoUOH/tdtFhG5IFabwf7jp9l37DRzNxzmp02JAFgsMPKKRgzqEoG/53831VdEFqOozhLVXHp6Ov7+/qSlpRUawZOdnc2+ffuIjIwssjOsVH1Hjx6lWbNmrFu3zr5siyNs2bKFyy+/nJ07d9r7D/2bPq8iUlI2m8G8DYeZ9WcC8UfSycqz2rc5WeDKpkHc1TmCLg0CHBhl0c73/f1vqgESKaGgoCCmTp1KQkKCQxOgI0eO8Omnn54z+RERKa48q42/Dpxk46FUvlx7yN63B8DD1YnoOj40CPThvm5RNKtbNf7mKAESuQD/HnbvCL169XJ0CCJSiR07lcP8zYms3JPCqj3HSc/Ot2/zdXdhWI9oejcLJjLAG2en4k/NUVkoARIREalGTufk8+7vu5m6fC951rO9YGp7u9E2vCax0bW5uV09fD0qZ9+e4lICJCIiUg2cPJ3Lz1uSePf3XSSmZQPQqp4/fVqE0D6iFq3DalTJmp5zUQIkIiJShZ04ncvEX3cye81BcvPNSWnDanky+ppmXNE0yMHROY4SIBERkSooO8/K9xuOMH7hdlIyzBn8m4T4cWObugzqHIFHKS6lVBkpARIREalC0rPz+HjpXmb9mcDx02bi0yjIhxeubUbn6NolWmuwKlMCJCIiUgUYhsHc9Yd5Zf52UjLMtbnq+nswqIu5IGllm6m5rCkBEhERqcTSsvL4fsNhvlh9kPi/V2OPCvBmZK9GXNUsGBdnJwdHWDEpARI5h+PHj9OkSRNWr15NRESEw+K45ZZb6NKlCyNHjnRYDCJS8RiGwcfL9vHGLzvI+btzs5ebMw/1bMg9l0bi5qLE53x0d6oJi8Vy3sd/rZt1PhEREUycOPE/91u/fj3XXHMNgYGBeHh4EBERQf/+/UlJSbng1y5L48aN49prry0y+enVqxfOzs788ccfhbb16NGDESNGFCqfN29eobb33Nxcxo8fT6tWrfDy8iIgIIDY2FimT59OXl4eAM8//zwvv/wy6enppXJdIlL5ZeTkM3zWX7w8fxs5+TYaB/vy/DVNWf5UT+7vEa3kpxhUA1RNJCYm2n+fM2cOzz//PDt27LCXeXp6lunrJycnc8UVV3DttdeycOFCatSowb59+/j+++/JzMwss9fNy8vD1bXkk3llZWUxdepU5s+fX2hbQkICq1at4sEHH2Tq1Kl06tTpgmLLzc2ld+/ebNy4kbFjxxIbG4ufnx9//PEHb7zxBm3atKF169a0bNmSiIgIZs2axf33339BryUiVUNuvo15Gw7z3u+7STiRiauzheevacodncLVubmElCKWBsOA3NOOeRRzLdvg4GD7w9/fH4vFUqBs6dKltGvXDg8PD6KiohgzZgz5+WenRX/hhReoX78+7u7u1K1bl4cffhgwazsOHDjAo48+aq9NKsrKlStJT0/n448/pk2bNkRGRtKzZ08mTpxI/fr17ftt3bqVq6++Gj8/P3x9fenatSt79uwBwGaz8eKLL1KvXj3c3d1p3bo1CxYssB+7f/9+LBYLX375JT169MDDw4PPPvsMgOnTp9OkSRM8PDxo3LgxkydPPu/9+vnnn3FxcaFz586Ftk2fPp1rrrmG+++/nzlz5nD69OlivQf/NnHiRJYuXcpvv/3GAw88QOvWrYmKimLgwIH8+eefNGzY0L7vddddxxdffHFBryMilV9WrpUZK/bR4/VFPPn1JhJOZBLs58Hs+zpzZ+cIJT8XQDVApSEvE16p65jXfvYIuHlf1CkWLlzIHXfcwTvvvGNPOO677z4ARo8ezddff81bb73F7NmzadasGUlJSWzcuBGAb7/9llatWnHfffcxdOjQc75GcHAw+fn5zJ07l1tuuaXIf6yHDx+mW7du9OjRg99//x0/Pz9WrFhhT8Tefvtt3nzzTT744APatGnDtGnTuO6669i6dWuBZOGpp57izTffZPr06bi7u/PRRx8xevRo3nvvPdq0acP69esZOnQo3t7e3HXXXUXGu3TpUmJiYgqVG4bB9OnTmTRpEo0bN6ZRo0Z8+eWXDB48uPg3/G+zZs3iiiuuoE2bNoW2ubq6Fqi56tChA+PGjSMnJwd3d/cSv5aIVD5Wm8HeYxn8vCWJT1butw9pr+PrztCukQzsGI6Pu77GL5TunPDyyy/z9NNP25OBqKgoxo4dy5NPPsno0aNJSEggODiYK664AldXV+rXr0+HDh0AqFWrFs7Ozvj6+hIcHHzO1+jUqRPPPvssAwcOZNiwYXTo0IGePXsyaNAggoLMmUgnTZqEv78/s2fPtn/5N2rUyH6ON954g6eeeooBAwYA8Nprr7Fo0SImTpzIpEmT7PuNGDGCm266yf587NixvPnmm/ayyMhI4uPj+eCDD86ZAO3fv5+6dQsntb/++iuZmZn07t0bgDvuuIOpU6deUAK0a9cuevToUax9Q0NDycnJISkpyaEr0ItI2bDaDA6dzCT+SDpz1x9mW1I6ianZ5NvO1vLXq+nJsO7R3NKuXrWfxLA0KAEqDa5eZk2Mo177Iq1bt441a9bw8ssv28usVivZ2dlkZmZy6623MnHiRKKiorjqqqvo27cv1157LS4uJfv4vPzyy4wcOZLff/+dP/74gylTpvDKK6+wdOlSWrRowYYNG+jatWuRfXbS09M5cuQIsbGxBcpjY2PttVFn/LPm5tixYxw8eJB77rmnQA1Vfn4+/v7+54w1KysLDw+PQuVTp06lf//+9mu/7bbbeOKJJ9ixYweXXHJJ8W7E3wzDKHa19Zk+WmXZX0pEyt+B46eZELeT37cnc+ofq7Gf4ebiRMfIWtzUNpRrW9bVkPZSpASoNFgsF90M5Ug2m40xY8YUqDU5w8PDg7CwMHbs2EFcXBy//vorw4cP5/XXX2fJkiUl7mBcu3Ztbr31Vm699VbGjRtHmzZteOONN/jkk0+K1RH73wlDUUmEt/fZ98JmM4eGfvTRR3Ts2LHAfs7O5/4fVEBAACdPnixQduLECebNm0deXh7vv/++vdxqtTJt2jRee+01APz8/EhLSyt0ztTUVPz8/OzPGzVqxLZt284Zw79fG6BOnTrF2l9EKi6bzWDlnuPM+vMAcfFH7bU87i5O1KvpyRVNgujZOJD6tb0I9PWoVguUliclQELbtm3ZsWMHDRo0OOc+np6eXHfddVx33XU88MADNG7cmM2bN9O2bVvc3NywWq0lfl03Nzeio6PtnYhbtmzJJ598UuTILT8/P+rWrcvy5cvp1q2bvXzlypX25riiBAUFERoayt69e7n99tuLHVubNm3sHajPmDVrFvXq1WPevHkFyn/77TfGjRvHyy+/jIuLC40bN+bnn38udM41a9YUqCUaOHAgzz77LOvXry/UDyg/P5+cnBx7Mrdlyxbq1atHQEBAsa9BRCoWm81gzf4TjPkh3j5hIUC3RnV45PKGtKrnrxqecqQESHj++ee55pprCAsL49Zbb8XJyYlNmzaxefNmXnrpJWbMmIHVaqVjx454eXkxc+ZMPD097X1RIiIiWLp0KQMGDMDd3b3IL+kff/yR2bNnM2DAABo1aoRhGPzwww/Mnz+f6dOnA/Dggw/y7rvvMmDAAJ555hn8/f35448/6NChA5dccglPPPEEo0ePJjo6mtatWzN9+nQ2bNjArFmzznt9L7zwAg8//DB+fn706dOHnJwc1q5dy8mTJ885uWDv3r155plnOHnyJDVr1gTM5q9bbrmF5s2bF9g3PDycp556ip9++onrr7+e4cOH89577/HAAw9w33334enpSVxcHFOnTmXmzJn240aMGMFPP/3E5ZdfztixY7n00kvx9fVl7dq1vPbaa0ydOpXWrVsDsGzZMnr16lW8N1REKgyrzeDXbUf5YeMRVu05bu/I7OPuwk1tQxnYsT6Ng/3+4yxSJgwpJC0tzQCMtLS0QtuysrKM+Ph4IysrywGRlY7p06cb/v7+BcoWLFhgdOnSxfD09DT8/PyMDh06GB9++KFhGIYxd+5co2PHjoafn5/h7e1tdOrUyfj111/tx65atcpo2bKl4e7ubpzrI7Vnzx5j6NChRqNGjQxPT0+jRo0aRvv27Y3p06cX2G/jxo1Gr169DC8vL8PX19fo2rWrsWfPHsMwDMNqtRpjxowxQkNDDVdXV6NVq1bGzz//bD923759BmCsX7++0OvPmjXLaN26teHm5mbUrFnT6Natm/Htt9+e9z516tTJmDJlimEYhrF27VoDMFavXl3kvtdee61x7bXX2p+vXbvW6N27txEYGGj4+fkZMTExxhdffFHouOzsbGPcuHFGixYtDA8PD6NWrVpGbGysMWPGDCMvL88wDPMz5+fnZ6xateq88Ral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fbvNZjNGjx5tBAcHG+7u7ka3bt2MzZs3OzDii7No0SIDKPS46667DMMo3vVmZWUZDz74oFGrVi3D09PTuOaaa4yEhAQHXM2FOd89yMzMNHr16mXUqVPHcHV1NerXr2/cddddha6vMt+Doq4dMKZPn27fp6p/Dv7rHlT1z8GQIUPsf+Pr1KljXH755fbkxzCq/vtvGOe/BxXt/bcYhmGUbp2SiIiISMWmPkAiIiJS7SgBEhERkWpHCZCIiIhUO0qAREREpNpRAiQiIiLVjhIgERERqXaUAImIiEi1owRIREREqh0lQCIiRYiIiGDixImODkNEyogSIBFxuLvvvpsbbrgBgB49ejBixIhye+0ZM2ZQo0aNQuVr1qzhvvvuK7c4RKR8uTg6ABGRspCbm4ubm9sFH1+nTp1SjEZEKhrVAIlIhXH33XezZMkS3n77bSwWCxaLhf379wMQHx9P37598fHxISgoiDvvvJOUlBT7sT169ODBBx9k5MiRBAQEcOWVVwIwYcIEWrRogbe3N2FhYQwfPpyMjAwAFi9ezODBg0lLS7O/3gsvvAAUbgJLSEjg+uuvx8fHBz8/P/r168fRo0ft21944QVat27NzJkziYiIwN/fnwEDBnDq1KmyvWkickGUAIlIhfH222/TuXNnhg4dSmJiIomJiYSFhZGYmEj37t1p3bo1a9euZcGCBRw9epR+/foVOP6TTz7BxcWFFStW8MEHHwDg5OTEO++8w5YtW/jkk0/4/fffefLJJwHo0qULEydOxM/Pz/56jz/+eKG4DMPghhtu4MSJEyxZsoS4uDj27NlD//79C+y3Z88e5s2bx48//siPP/7IkiVLePXVV8vobonIxVATmIhUGP7+/ri5ueHl5UVwcLC9/P3336dt27a88sor9rJp06YRFhbGzp07adSoEQANGjRg/PjxBc75z/5EkZGRjB07lvvvv5/Jkyfj5uaGv78/FoulwOv926+//sqmTZvYt28fYWFhAMycOZNmzZqxZs0a2rdvD4DNZmPGjBn4+voCcOedd/Lbb7/x8ssvX9yNEZFSpxogEanw1q1bx6JFi/Dx8bE/GjduDJi1LmfExMQUOnbRokVceeWVhIaG4uvry6BBgzh+/DinT58u9utv27aNsLAwe/ID0LRpU2rUqMG2bdvsZREREfbkByAkJITk5OQSXauIlA/VAIlIhWez2bj22mt57bXXCm0LCQmx/+7t7V1g24EDB+jbty/Dhg1j7Nix1KpVi+XLl3PPPfeQl5dX7Nc3DAOLxfKf5a6urgW2WywWbDZbsV9HRMqPEiARqVDc3NywWq0Fytq2bcs333xDREQELi7F/7O1du1a8vPzefPNN3FyMiu8v/zyy/98vX9r2rQpCQkJHDx40F4LFB8fT1paGk2aNCl2PCJScagJTEQqlIiICP7880/2799PSkoKNpuNBx54gBMnTnDbbbexevVq9u7dyy+//MKQIUPOm7xER0eTn5/Pu+++y969e5k5cyZTpkwp9HoZGRn89ttvpKSkkJmZWeg8V1xxBS1btuT222/nr7/+YvXq1QwaNIju3bsX2ewmIhWfEiARqVAef/xxnJ2dadq0KXXq1CEhIYG6deuyYsUKrFYrvXv3pnnz5jzyyCP4+/vba3aK0rp1ayZMmMBrr71G8+bNmTVrFuPGjSuwT5cuXRg2bBj9+/enTp06hTpRg9mUNW/ePGrWrEm3bt244ooriIqKYs6cOaV+/SJSPiyGYRiODkJERESkPKkGSERERKodJUAiIiJS7SgBEhERkWpHCZCIiIhUO0qAREREpNpRAiQiIiLVjhIgERERqXaUAImIiEi1owRIREREqh0lQCIiIlLtKAESERGRauf/AXP9eZAhEOFUAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot training result\n",
"plt.plot(evaluation_result['train']['auc'], label='Train Score (AUC)')\n",
"plt.plot(evaluation_result['valid']['auc'], label='Test Score (AUC)')\n",
"\n",
"plt.xlabel('Iteration')\n",
"plt.ylabel('Model Performance')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "55282a27-226d-4f75-a73b-2c3c21db6382",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"{'status': 'ok', 'restart': False}"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# clean GPU memory\n",
"import IPython\n",
"app = IPython.Application.instance()\n",
"app.kernel.do_shutdown(restart=False)"
]
},
{
"cell_type": "markdown",
"id": "d208396c-fa1b-4282-b88b-6486830442a0",
"metadata": {
"tags": []
},
"source": [
"<a name='s2-3.2'></a>\n",
"### XGBoost on GPU Cluster with Dask ###\n",
"By default, XGBoost trains models sequentially. This is fine if the dataset is small, but as the size of dataset or model grows, we will want to consider running XGBoost in distributed mode with Dask to speed up computations and reduce the memory burden on the GPU. XGBoost relies on CUDA and Dask to provide an efficient distributed training solution over multiple GPUs. \n",
"\n",
"During distributed training, XGBoost trains a model with a subset of data on each worker. When data is loaded with Dask-cuDF, the subsets are cuDF DataFrame partitions scatter across individual GPU workers. The histogram of gradients for each tree node is synched across workers. \n",
"\n",
"<p><img src='images/xgboost_dask.png' width=720></p>"
]
},
{
"cell_type": "markdown",
"id": "eb57047e-954e-459f-8db9-ee6c793ed85c",
"metadata": {},
"source": [
"By default, Dask will only use a single GPU. To use multiple GPUs, users will want to either use the `dask_cuda.LocalCUDACluster()`[[doc]](https://docs.rapids.ai/api/dask-cuda/stable/api.html) API or launch Dask workers from the command line (one per GPU). We will initialize a `dask.distributed.Client` by pointing it to the address of the cluster scheduler. The Dask client connects to and submits computations to a Dask cluster. \n",
"\n",
"When using XGBoost with Dask, we need to call the `xgboost.dask` interface from the client side. The main difference with XGBoosts Dask interface is that we pass our Dask client as an additional argument for carrying out the computation. Note that if the client parameter below is set to `None`, XGBoost will use the default client returned by Dask."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "9fbd41cb-f1c9-4995-94d1-db042b881bb8",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2026-02-11 18:40:58,829 - distributed.preloading - INFO - Creating preload: dask_cuda.initialize\n",
"2026-02-11 18:40:58,829 - distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n",
"2026-02-11 18:40:58,844 - distributed.preloading - INFO - Creating preload: dask_cuda.initialize\n",
"2026-02-11 18:40:58,845 - distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n",
"2026-02-11 18:40:58,867 - distributed.preloading - INFO - Creating preload: dask_cuda.initialize\n",
"2026-02-11 18:40:58,867 - distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n",
"2026-02-11 18:40:58,867 - distributed.preloading - INFO - Creating preload: dask_cuda.initialize\n",
"2026-02-11 18:40:58,867 - distributed.preloading - INFO - Import preload module: dask_cuda.initialize\n"
]
}
],
"source": [
"# import dependencies\n",
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"from dask.distributed import Client, wait\n",
"from dask_cuda import LocalCUDACluster\n",
"\n",
"# instantiate a Client\n",
"cluster=LocalCUDACluster()\n",
"client=Client(cluster)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3eb48d7c-9169-486c-b979-277c5c9aff55",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [],
"source": [
"# get the machine's external IP address\n",
"from requests import get\n",
"\n",
"ip=get('https://api.ipify.org').content.decode('utf8')\n",
"\n",
"print(f'Dask dashboard (status) is accessible on http://{ip}:8787/status')\n",
"print(f'Dask dashboard (gpu) is accessible on http://{ip}:8787/gpu')"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "7d72dda5-bb7b-42cc-901e-6a36ae591821",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# import dependencies\n",
"import xgboost\n",
"from dask_ml.model_selection import train_test_split\n",
"from dask_ml.metrics import accuracy_score\n",
"\n",
"import dask_cudf\n",
"import matplotlib.pyplot as plt\n",
"import time"
]
},
{
"cell_type": "markdown",
"id": "3cf80e2c-5dca-4b9f-9ea9-8e8cb18788c3",
"metadata": {},
"source": [
"We start by loading the data into GPUs. After data loading, we prepare the training and testing splits. We use Dask-cuDF for loading data from the disk, and the `dask_ml.model_selection.train_test_split()`[[doc]](https://ml.dask.org/modules/generated/dask_ml.model_selection.train_test_split.html) function from [Dask-ML](https://ml.dask.org/) for splitting up the dataset. The GPU backend of Dask works seamlessly with utilities in Dask-ML so the entire machine learning pipeline can be accelerated. \n",
"\n",
"<p><img src='images/tip.png' width=720></p>\n",
"\n",
"Even using Dask Dataframes, XGBoost executes completely in memory, meaning we cant spill as dynamically from GPU to host memory. The total amount of RAM needed on the cluster is directly proportional to the total size of the training dataset. Users should expect large amounts of unmanaged memory during the training phase, consumed by the heap of the training tasks. This heap memory requirements are directly proportional to total dataset size / number of workers. This is unlike most other Dask workflows, where heap size is proportional to partition size * threads per worker."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "d1ee700c-5e7a-4562-9be0-9a1d225f9f7f",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# initializing list\n",
"features_list=['brand', 'cat_0', 'cat_1', 'cat_2', 'cat_3', \n",
" 'price', 'ts_hour', 'ts_minute', 'ts_weekday', \n",
" 'brand_target_sum', 'brand_count', 'cat_0_target_sum', \n",
" 'cat_0_count', 'cat_1_target_sum', 'cat_1_count', \n",
" 'cat_2_target_sum', 'cat_2_count', 'cat_3_target_sum', \n",
" 'cat_3_count', 'TE_brand_target', 'TE_cat_0_target', \n",
" 'TE_cat_1_target', 'TE_cat_2_target', 'TE_cat_3_target', \n",
" 'relative_price_product', 'relative_price_category']\n",
" \n",
"include=features_list+['target']"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "63be3656-4724-4493-a6ce-fb5e59aa6cf7",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total of 2461697 records split across 4 partitions. \n"
]
}
],
"source": [
"# import data\n",
"parquet_dir='processed_parquet'\n",
"ddf=dask_cudf.read_parquet(parquet_dir, columns=include)\n",
"\n",
"print(f'Total of {len(ddf)} records split across {ddf.npartitions} partitions. ')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "3a6db9e0-99c8-4c54-8bc1-b5b0116e8e4f",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# XGBoost treats all data as 32-bit float internally\n",
"y=ddf['target'].astype('float32')\n",
"X=ddf[features_list].astype('float32')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "5bc23334-3cfd-4f39-95c7-fd6189a5670b",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"DoneAndNotDoneFutures(done={<Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-1-cf2fcd5973afe6e2f36b5e2379193148', 2)>, <Future: finished, type: cudf.core.series.Series, key: ('split-0-c6d73fb89f1d48fba4b6fb7e9ba13f6f', 2)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-0-cf2fcd5973afe6e2f36b5e2379193148', 0)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-1-cf2fcd5973afe6e2f36b5e2379193148', 0)>, <Future: finished, type: cudf.core.series.Series, key: ('split-1-c6d73fb89f1d48fba4b6fb7e9ba13f6f', 2)>, <Future: finished, type: cudf.core.series.Series, key: ('split-1-c6d73fb89f1d48fba4b6fb7e9ba13f6f', 0)>, <Future: finished, type: cudf.core.series.Series, key: ('split-1-c6d73fb89f1d48fba4b6fb7e9ba13f6f', 3)>, <Future: finished, type: cudf.core.series.Series, key: ('split-0-c6d73fb89f1d48fba4b6fb7e9ba13f6f', 0)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-0-cf2fcd5973afe6e2f36b5e2379193148', 1)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-0-cf2fcd5973afe6e2f36b5e2379193148', 3)>, <Future: finished, type: cudf.core.series.Series, key: ('split-0-c6d73fb89f1d48fba4b6fb7e9ba13f6f', 3)>, <Future: finished, type: cudf.core.series.Series, key: ('split-0-c6d73fb89f1d48fba4b6fb7e9ba13f6f', 1)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-1-cf2fcd5973afe6e2f36b5e2379193148', 1)>, <Future: finished, type: cudf.core.series.Series, key: ('split-1-c6d73fb89f1d48fba4b6fb7e9ba13f6f', 1)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-0-cf2fcd5973afe6e2f36b5e2379193148', 2)>, <Future: finished, type: cudf.core.dataframe.DataFrame, key: ('split-1-cf2fcd5973afe6e2f36b5e2379193148', 3)>}, not_done=set())"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# split data into train and test sets\n",
"X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=42)\n",
"X_train, X_test, y_train, y_test=client.persist([X_train, X_test, y_train, y_test])\n",
"wait([X_train, X_test, y_train, y_test])"
]
},
{
"cell_type": "markdown",
"id": "1419d87b-f2f1-4177-9be2-6694373d8c7f",
"metadata": {},
"source": [
"We then create an `xgboost.dask.DaskMatrix`[[doc]](https://xgboost.readthedocs.io/en/stable/python/python_api.html#xgboost.dask.DaskDMatrix) object and pass it to `xgboost.dask.train()`, along with some other parameters, much like XGBoost's normal, non-Dask interface. We have to pass a Dask DataFrame or Dask Array to the `data` and `label` parameters. Importantly, we have to pass the Dask client as an additional argument for carrying out the computation. If we don't pass a client, `xgboost.dask.train()` will use a default client returned by Dask. \n",
"\n",
"The `xgboost.dask.DaskDMatrix` acts like a normal DMatrix and works as a proxy for local DMatrix scattered around the workers. The `DaskDMatrix` constructor forces computation that scatters DMatrix around the workers, which means it's where all earlier computations are actually being carried out, including operations like `.read_csv()`. To isolate the computation in DaskDMatrix from other lazy computations, we can explicitly wait for results of input data before constructing a `DaskDMatrix`. "
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "0edccc32-9701-4307-8051-7b39e3ae6770",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [],
"source": [
"# create DMatrix\n",
"dtrain=xgboost.dask.DaskDMatrix(client, X_train, y_train)\n",
"dtest=xgboost.dask.DaskDMatrix(client, X_test, y_test)"
]
},
{
"cell_type": "markdown",
"id": "95808d1a-5bc0-4edc-86e2-e1ade5aee4ad",
"metadata": {},
"source": [
"Next, we fit the model. We can implement more advanced early stopping strategies, which are implemented as a [callback](https://xgboost.readthedocs.io/en/stable/python/callbacks.html) function in XGBoost. Furthermore, we can implement custom objectives and evaluation metrics, as described [here](https://xgboost.readthedocs.io/en/stable/tutorials/custom_metric_obj.html). \n",
"\n",
"<p><img src='images/tip.png' width=720></p>\n",
"\n",
"We evaluate model performance with the popular [Receiver Operating Characteristic Area under the Curve](https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve) by using `auc` for `eval_metric`. In a distributed environment, the AUC is calculated as a weighted average over the AUC of training rows on each node. Distributed AUC is an approximation that is sensitive to the distribution of data across workers. It will yield `NaN` when input dataset contains only negative or positive samples (on any node). \n",
"\n",
"Unlike `xgboost.train()`, which returns a booster, `xgboost.dask.train()` returns a dictionary with the boosters and evaluation results. "
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "c47d8326-fd22-48f3-8280-bd90ef2e269b",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:distributed.scheduler:Receive client connection: Client-worker-3cc01278-0779-11f1-887d-0242ac120003\n",
"INFO:distributed.core:Starting established connection to tcp://127.0.0.1:51218\n",
"INFO:distributed.scheduler:Receive client connection: Client-worker-3cc12906-0779-11f1-887a-0242ac120003\n",
"INFO:distributed.core:Starting established connection to tcp://127.0.0.1:51222\n",
"INFO:distributed.scheduler:Receive client connection: Client-worker-3cc14430-0779-11f1-8872-0242ac120003\n",
"INFO:distributed.core:Starting established connection to tcp://127.0.0.1:51226\n",
"INFO:distributed.scheduler:Receive client connection: Client-worker-3cc13d09-0779-11f1-8876-0242ac120003\n",
"INFO:distributed.core:Starting established connection to tcp://127.0.0.1:51224\n",
"[18:41:11] task [xgboost.dask-0]:tcp://127.0.0.1:42681 got new rank 0\n",
"[18:41:11] task [xgboost.dask-1]:tcp://127.0.0.1:37073 got new rank 1\n",
"[18:41:11] task [xgboost.dask-2]:tcp://127.0.0.1:39483 got new rank 2\n",
"[18:41:11] task [xgboost.dask-3]:tcp://127.0.0.1:39523 got new rank 3\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training 2216183 samples took 0.07 minutes. \n"
]
}
],
"source": [
"# define model parameters\n",
"xgb_params={ \n",
" 'eval_metric': ['auc'], \n",
" 'objective': 'binary:logistic',\n",
" 'tree_method': 'gpu_hist'\n",
"}\n",
"\n",
"# train the model\n",
"start=time.time()\n",
"xgb_dask_clf=xgboost.dask.train(client, \n",
" xgb_params, \n",
" dtrain=dtrain,\n",
" evals=[(dtrain, 'train'), (dtest, 'valid')],\n",
" num_boost_round=350,\n",
" early_stopping_rounds=10, \n",
" verbose_eval=False\n",
")\n",
"elapsed_time=time.time()-start\n",
"\n",
"print(f'Training {len(X_train)} samples took {round(elapsed_time/60, 2)} minutes. ')"
]
},
{
"cell_type": "markdown",
"id": "34d23daf-5a51-46ce-824a-a9a66065c30a",
"metadata": {},
"source": [
"Given the data and a set of parameters, the `xgboost.dask.train()` returns a booster and the computation history as a dictionary: \n",
"```\n",
"{'booster': Booster,\n",
" 'history': dict}\n",
" ``` \n",
"\n",
"The Booster returned is the same as the one returned by `xgboost.train()`, which means we can use it to predict or save for later. The `xgboost.Booster`[[doc]](https://xgboost.readthedocs.io/en/stable/python/python_api.html#xgboost.Booster) model can be referenced with `output['booster']`. For prediction, we pass the output returned by train into `xgboost.dask.predict()`[[doc]](https://xgboost.readthedocs.io/en/stable/python/python_api.html#xgboost.dask.predict) or equivalently `output['booster']`. The usage of `.predict()` is further described [here](https://xgboost.readthedocs.io/en/stable/prediction.html). \n",
"\n",
"Lastly, we evaluate the model. "
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "5e573ef7-4621-4bfc-a162-9b2216c3e68a",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy score for test set: 61.48%\n",
"Throughput is: 1675892.22 per seconds. \n"
]
}
],
"source": [
"# predict\n",
"start=time.time()\n",
"prediction_test=xgboost.dask.predict(client, xgb_dask_clf, dtest)\n",
"elapsed_time=time.time()-start\n",
"\n",
"score=accuracy_score(y_test.compute().values.get(), \n",
" (prediction_test>0.5).compute().astype('float32'))\n",
"print(f'Accuracy score for test set: {round(float(score)*100, 2)}%')\n",
"\n",
"throughput=round(len(X_test)/elapsed_time, 2)\n",
"print(f'Throughput is: {throughput} per seconds. ')"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "b46ad6c8-9e8c-4037-9e49-dbf17cf6c9bd",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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Bgzgu+++O+/xFRUVPPnkk0RHR+Pt7U2nTp1YuHChff+uXbu49dZbiYmJwWKxMHfu3Ea+ggu3Pc2c/2dgezfIO2hujBriwIpERERcg4cjf/jSpUuZOnUq8+fPZ/jw4bz++uuMHj2a3bt307Fjx1rPGTduHNnZ2SxYsID4+HhycnKorq627y8tLSUuLo7bb7+dRx55pKkupd5sNoPtaScBGOh1xNzYOlaLnoqIiDQBhwagOXPmcP/99/PAAw8AMHfuXL788kteffVVZs2addbxK1euZM2aNaSkpBASYvaTiYmJqXHMwIEDGThwIABPPPFE417ARUjJLaaoohofTzeiSn4yN0Zq0VMREZGm4LBHYJWVlSQnJzNq1Kga20eNGsX69etrPefTTz8lMTGR2bNnExERQZcuXXj00UcpKyu7qFoqKiooLCys8dHYtqWdWf7CPSPZ3KhV30VERJqEw1qAcnNzsVqthIXVnO04LCyMrKysWs9JSUlh3bp1+Pj4sHz5cnJzc5kyZQr5+fk1+gHV16xZs3j66acv+PwLcfrxV9/IINi92dyoFiAREZEm4fBO0JafLfRpGMZZ206z2WxYLBYWL17MoEGDGDNmDHPmzOHtt9++qFag6dOnU1BQYP9IS0u74Neqq8O5JQD0CyiA0jxz/p/2CY3+c0VERMSBLUChoaG4u7uf1dqTk5NzVqvQaeHh4URERBAUFGTf1r17dwzDID09nc6dO19QLd7e3nh7N+3My6n5pQB0sR4wN7RP0OzPIiIiTcRhLUBeXl4MGDCApKSkGtuTkpIYNmxYrecMHz6cjIwMiouL7dv279+Pm5sbkZGRjVpvQ6q22sg4abZYtS861QE6YoADKxIREXEtDn0ENm3aNN566y0WLlzInj17eOSRR0hNTWXy5MmA+WjqnnvusR9/55130qZNGyZOnMju3btZu3Ytjz32GJMmTcLX1xcwO1dv27aNbdu2UVlZybFjx9i2bRsHDx50yDXWJrOgnGqbgZe7G37Ht5kb1QFaRESkyTh0GPz48ePJy8vjmWeeITMzk169erFixQqio6MByMzMJDU11X68v78/SUlJPPTQQyQmJtKmTRvGjRvHs88+az8mIyODfv362b9/8cUXefHFFxkxYgSrV69usms7n7RTj79iWntgydxublQHaBERkSZjMQzDcHQRzU1hYSFB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41//+pf9GGd/H/zSPXD298GkSZPs/49v27atceWVV9rDj2E4/+/fMM5/D5rb799iGIbRsG1KIiIiIs2b+gCJiIiIy1EAEhEREZejACQiIiIuRwFIREREXI4CkIiIiLgcBSARERFxOQpAIiIi4nIUgERERMTlKACJiNQiJiaGuXPnOroMEWkkCkAi4nD33XcfY8eOBWDkyJFMnTq1yX7222+/TXBw8Fnbf/zxR37zm980WR0i0rQ8HF2AiEhjqKysxMvL64LPb9u2bQNWIyLNjVqARKTZuO+++1izZg3z5s3DYrFgsVg4cuQIALt372bMmDH4+/sTFhbG3XffTW5urv3ckSNH8uCDDzJt2jRCQ0O5+uqrAZgzZw4JCQn4+fkRFRXFlClTKC4uBmD16tVMnDiRgoIC+8976qmngLMfgaWmpnLTTTfh7+9PYGAg48aNIzs7277/qaeeom/fvrz33nvExMQQFBTEHXfcQVFRUePeNBG5IApAItJszJs3j6FDh/LrX/+azMxMMjMziYqKIjMzkxEjRtC3b182b97MypUryc7OZty4cTXOf+edd/Dw8OD777/n9ddfB8DNzY2XX36Zn376iXfeeYdvv/2Wxx9/HIBhw4Yxd+5cAgMD7T/v0UcfPasuwzAYO3Ys+fn5rFmzhqSkJA4dOsT48eNrHHfo0CE++eQTPvvsMz777DPWrFnD888/30h3S0Quhh6BiUizERQUhJeXF61ataJ9+/b27a+++ir9+/fnueees29buHAhUVFR7N+/ny5dugAQHx/P7Nmza7zm//Ynio2NZebMmfzud79j/vz5eHl5ERQUhMViqfHzfu7rr79mx44dHD58mKioKADee+89evbsyY8//sjAgQMBsNlsvP322wQEBABw991388033/DXv/714m6MiDQ4tQCJSLOXnJzMqlWr8Pf3t39069YNMFtdTktMTDzr3FWrVnH11VcTERFBQEAA99xzD3l5eZSUlNT55+/Zs4eoqCh7+AHo0aMHwcHB7Nmzx74tJibGHn4AwsPDycnJqde1ikjTUAuQiDR7NpuNG264gRdeeOGsfeHh4fav/fz8auw7evQoY8aMYfLkycycOZOQkBDWrVvH/fffT1VVVZ1/vmEYWCyWX9zu6elZY7/FYsFms9X554hI01EAEpFmxcvLC6vVWmNb//79+fjjj4mJicHDo+7/29q8eTPV1dW89NJLuLmZDd4ffPDBL/68n+vRowepqamkpaXZW4F2795NQUEB3bt3r3M9ItJ86BGYiDQrMTExbNy4kSNHjpCbm4vNZuP3v/89+fn5TJgwgU2bNpGSksJXX33FpEmTzhteOnXqRHV1Nf/4xz9ISUnhvffe47XXXjvr5xUXF/PNN9+Qm5tLaWnpWa9z1VVX0bt3b371q1+xZcsWNm3axD333MOIESNqfewmIs2fApCINCuPPvoo7u7u9OjRg7Zt25KamkqHDh34/vvvsVqtXHPNNfTq1Ys//OEPBAUF2Vt2atO3b1/mzJnDCy+8QK9evVi8eDGzZs2qccywYcOYPHky48ePp23btmd1ogbzUdYnn3xC69atueyyy7jqqquIi4tj6dKlDX79ItI0LIZhGI4uQkRERKQpqQVIREREXI4CkIiIiLgcBSARERFxOQpAIiIi4nIUgERERMTlKACJiIiIy1EAEhEREZejACQiIiIuRwFIREREXI4CkIiIiLgcBSARERFxOf8fTEA11tXDk90AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot training results\n",
"history=xgb_dask_clf['history']\n",
"\n",
"plt.plot(history['train']['auc'], label='Train Score (AUC)')\n",
"plt.plot(history['valid']['auc'], label='Test Score (AUC)')\n",
"\n",
"plt.xlabel('Iteration')\n",
"plt.ylabel('Model Performance')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "5bc3160f-a83d-4a9d-9417-05f0bf32c920",
"metadata": {
"tags": []
},
"source": [
"<a name='s2-e2'></a>\n",
"### Exercise #2 - Experimentation ###\n",
"\n",
"Machine learning requires experimentation to achieve optimal results. There are some model parameters we can use to reduce overfitting. At a high level, they can be categorized as: \n",
"1. Parameters that control model complexity: \n",
" * `max_depth`, `min_child_weight` and `gamma`\n",
"2. Parameters that add randomness to make training robust to noise: \n",
" * `subsample` and `colsample_bytree`\n",
"\n",
"We can also reduce `eta` (`learning_rate`) or increase `num_round`.\n",
"\n",
"**Instructions**: <br>\n",
"* Modify the `<FIXME>`s only and execute the below cell to reduce overfitting. "
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "fce1d30f-e619-472c-9121-98454023bcad",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:distributed.worker:Run out-of-band function '_start_tracker'\n",
"[18:41:50] task [xgboost.dask-0]:tcp://127.0.0.1:42681 got new rank 0\n",
"[18:41:50] task [xgboost.dask-1]:tcp://127.0.0.1:37073 got new rank 1\n",
"[18:41:50] task [xgboost.dask-2]:tcp://127.0.0.1:39483 got new rank 2\n",
"[18:41:50] task [xgboost.dask-3]:tcp://127.0.0.1:39523 got new rank 3\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training 2216183 samples took 0.04 minutes. \n"
]
}
],
"source": [
"# define model parameter\n",
"xgb_params={ \n",
" 'eval_metric': ['auc'], \n",
" 'objective': 'binary:logistic',\n",
" 'tree_method': 'gpu_hist', \n",
" 'subsample': 0.8,\n",
" 'colsample_bytree': 0.8, \n",
" 'learning_rate': 0.5\n",
"}\n",
"\n",
"# train the model\n",
"start=time.time()\n",
"xgb_dask_clf=xgboost.dask.train(client, \n",
" xgb_params, \n",
" dtrain=dtrain,\n",
" evals=[(dtrain, 'train'), (dtest, 'valid')],\n",
" num_boost_round=350,\n",
" early_stopping_rounds=10, \n",
" verbose_eval=False\n",
")\n",
"elapsed_time=time.time()-start\n",
"\n",
"print(f'Training {len(X_train)} samples took {round(elapsed_time/60, 2)} minutes. ')"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "6f9fdf9f-9848-4a43-80c0-fe1cc5280c2c",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# evaluate model\n",
"history=xgb_dask_clf['history']\n",
"\n",
"plt.plot(history['train']['auc'], label='Train Score (AUC)')\n",
"plt.plot(history['valid']['auc'], label='Test Score (AUC)')\n",
"\n",
"plt.xlabel('Iteration')\n",
"plt.ylabel('Model Performance')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "6494a2ca-23b7-4f15-81ae-9d31abd4f209",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Accuracy score for test set: 61.26%\n",
"Throughput is: 2343298.89 per seconds. \n"
]
}
],
"source": [
"# predict\n",
"start=time.time()\n",
"prediction_test=xgboost.dask.predict(client, xgb_dask_clf, dtest)\n",
"elapsed_time=time.time()-start\n",
"\n",
"score=accuracy_score(y_test.compute().values.get(), \n",
" (prediction_test>0.5).compute().astype('float32'))\n",
"print(f'Accuracy score for test set: {round(float(score)*100, 2)}%')\n",
"\n",
"throughput=round(len(X_test)/elapsed_time, 2)\n",
"print(f'Throughput is: {throughput} per seconds. ')"
]
},
{
"cell_type": "markdown",
"id": "950a3bc2-f06c-474d-bbc3-0fa527bb6f05",
"metadata": {},
"source": [
"<a name='s2-3.3'></a>\n",
"### Save Model ###\n",
"\n",
"XGBoost has two distinct parts: \n",
"1. The model consisting of trees\n",
"2. Hyperparameters and configurations used for building the model\n",
"\n",
"Generally, we are only concerned with the model (#1), but sometimes the model's training configuration (#2) such as the objective function can also be useful if the model needs to be trained further. "
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "6bf27227-5323-4512-b3cf-96cac6c08fc8",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# save model\n",
"xgb_dask_clf['booster'].save_model('model.json')"
]
},
{
"cell_type": "markdown",
"id": "67a97d94-05d0-472f-8e59-49fd20010138",
"metadata": {},
"source": [
"We can use instantiate `xgboost.Booster()`[[doc]](https://xgboost.readthedocs.io/en/stable/python/python_api.html#xgboost.Booster) and use `.load_model()`[[doc]](https://xgboost.readthedocs.io/en/stable/python/python_api.html#xgboost.Booster.load_model) to load the model configuration. "
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "38b513dd-6168-4ae5-8ce5-f1fc96ed6309",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# load model\n",
"xgb_dask_clf=xgboost.Booster()\n",
"xgb_dask_clf.load_model('model.json')"
]
},
{
"cell_type": "markdown",
"id": "9a459eb1-3c25-49a5-bf51-2c67c8ae0d47",
"metadata": {},
"source": [
"<a name='s2-4'></a>\n",
"## Feature Importances ##\n",
"Ensemble trees provide estimates of feature importance from a trained model. Users can get the scores with `xgboost.Booster.get_score()`[[doc]](https://xgboost.readthedocs.io/en/stable/python/python_api.html#xgboost.Booster.get_score). Generally, importance provides a score that indicates how useful or valuable each feature was in the construction of the trees within the model. The more frequently a feature is used to split the data, the higher its relative importance. The importance types are defined as: \n",
"* `weight` (default) - the number of times a feature is used to split the data across all trees. This is equivalent to `xgboost.Booster.get_fscore()`[[doc]](https://xgboost.readthedocs.io/en/stable/python/python_api.html#xgboost.Booster.get_score)\n",
"* `gain` - the average gain across all splits the feature is used in\n",
"* `cover` - the average coverage across all splits the feature is used in\n",
"* `total_gain` - the total gain across all splits the feature is used in\n",
"* `total_cover` - the total coverage across all splits the feature is used in\n",
"\n",
"We plot the scores manually. Alternatively, the built-in `xgboost.plot_importance()`[[doc]](https://xgboost.readthedocs.io/en/stable/python/python_api.html#xgboost.plot_importance) can be used. \n",
"\n",
"Weight-based importance, also known as “frequency,” counts the number of times a feature is used to split the data across all trees. Features that appear more frequently are considered more important. This method can sometimes favor high cardinality features but provides insights into which features are used most often during tree construction.\n",
"\n",
"Cover-based importance measures the coverage, or the number of observations impacted by splits using a feature. It indicates how widely a feature is used across different trees. This metric is useful when you want to understand the reach of a feature within the dataset.\n",
"\n",
"Gain-based feature importance measures the improvement in model accuracy or the reduction in error when a feature is used to split data within a tree. It sums up the gain from all splits that use a particular feature across all trees in the model. This method tends to highlight features that make significant contributions to the accuracy of the model.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "b8910bc7-049b-4faf-ad53-b1befd97cd79",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"[('price', 1618.0),\n",
" ('relative_price_product', 1606.0),\n",
" ('relative_price_category', 1438.0),\n",
" ('ts_minute', 1293.0),\n",
" ('ts_hour', 1188.0),\n",
" ('TE_brand_target', 1033.0),\n",
" ('ts_weekday', 817.0),\n",
" ('brand', 636.0),\n",
" ('brand_target_sum', 573.0),\n",
" ('TE_cat_1_target', 480.0),\n",
" ('TE_cat_2_target', 465.0),\n",
" ('TE_cat_0_target', 395.0),\n",
" ('cat_1', 377.0),\n",
" ('cat_2', 279.0),\n",
" ('brand_count', 265.0),\n",
" ('cat_2_target_sum', 231.0),\n",
" ('cat_0', 223.0),\n",
" ('cat_1_target_sum', 165.0),\n",
" ('TE_cat_3_target', 127.0),\n",
" ('cat_0_target_sum', 72.0),\n",
" ('cat_2_count', 69.0),\n",
" ('cat_1_count', 43.0),\n",
" ('cat_0_count', 16.0),\n",
" ('cat_3', 4.0)]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# get scores\n",
"scores=xgb_dask_clf.get_score()\n",
"scores=sorted(scores.items(), key=lambda x:x[1], reverse=True)\n",
"scores"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "a6d3bce0-ffff-4ffa-a9e7-5d8d452dc5b3",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjEAAAIyCAYAAAA6+5taAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACHMklEQVR4nO3dd1yV9fs/8NcBZMpWQRIEZyo4K3N83LlXS9Myd5bmyG2muXHkSstt4i7LVeZeuQeKK3OC4MCJoKiAcP3+8Mv988g6B27gvvH1fDzuR557XOc6p5tzrnOP620QEQERERGRzljkdgJEREREmcEihoiIiHSJRQwRERHpEosYIiIi0iUWMURERKRLLGKIiIhIl1jEEBERkS6xiCEiIiJdssrtBLJLUlISbt68CUdHRxgMhtxOh4iIiEwgInj06BG8vLxgYZH+sZY8W8TcvHkT3t7euZ0GERERZUJERASKFCmS7jp5tohxdHQE8OJNcHJyyuVsiIiIyBQxMTHw9vZWvsfTk2eLmORTSE5OTixiiIiIdMaUS0F4YS8RERHpEosYIiIi0iUWMURERKRLLGKIiIhIl1jEEBERkS6xiCEiIiJdYhFDREREusQihoiIiHSJRQwRERHpEosYIiIi0iUWMURERKRLLGKIiIhIl1jEEBERkS6xiCEiIiJdsjJ3g3/++QdTpkxBcHAwbt26hXXr1qF169ZG65w/fx5DhgzB3r17kZSUhHLlyuG3336Dj48PACAuLg4DBw7EqlWr8PTpU9SvXx8///wzihQposSIiopCnz59sHHjRgBAy5YtMWvWLLi4uGT+1arId+imTG8bNrGZipkQERG9nsw+EhMbG4sKFSpg9uzZqS6/cuUKatasiTfffBN79uzBqVOnMGLECNja2irr9OvXD+vWrcPq1auxf/9+PH78GM2bN0diYqKyTvv27RESEoItW7Zgy5YtCAkJQYcOHTLxEomIiCgvMoiIZHpjgyHFkZhPPvkE+fLlw7Jly1LdJjo6GgULFsSyZcvQtm1bAMDNmzfh7e2Nv//+G40aNcL58+dRtmxZHD58GFWrVgUAHD58GNWqVcN///2H0qVLZ5hbTEwMnJ2dER0dDScnp8y+xDTxSAwREZH6zPn+Nvt0UnqSkpKwadMmDB48GI0aNcLJkyfh5+eHYcOGKYVOcHAwEhIS0LBhQ2U7Ly8v+Pv74+DBg2jUqBEOHToEZ2dnpYABgHfffRfOzs44ePBgqkVMXFwc4uLilMcxMTFqvrRsxYKIiIjIfKpe2Hvnzh08fvwYEydOROPGjbFt2za8//77+OCDD7B3714AQGRkJKytreHq6mq0rYeHByIjI5V1ChUqlCJ+oUKFlHVeFRgYCGdnZ2Xy9vZW86URERGRxqhaxCQlJQEAWrVqhW+++QYVK1bE0KFD0bx5c8ydOzfdbUUEBoNBefzyv9Na52XDhg1DdHS0MkVERGThlRAREZHWqVrEFChQAFZWVihbtqzR/DJlyiA8PBwA4Onpifj4eERFRRmtc+fOHXh4eCjr3L59O0X8u3fvKuu8ysbGBk5OTkYTERER5V2qFjHW1tZ4++23ceHCBaP5Fy9eRNGiRQEAVapUQb58+bB9+3Zl+a1bt3D27FlUr14dAFCtWjVER0fj6NGjyjpHjhxBdHS0sg4RERG93sy+sPfx48e4fPmy8jg0NBQhISFwc3ODj48PBg0ahLZt26JWrVqoW7cutmzZgj///BN79uwBADg7O6Nr164YMGAA3N3d4ebmhoEDByIgIAANGjQA8OLITePGjdG9e3fMmzcPAPDFF1+gefPmJt2ZRERERHmf2UXM8ePHUbduXeVx//79AQAdO3bEkiVL8P7772Pu3LkIDAxEnz59ULp0afzxxx+oWbOmss306dNhZWWFNm3aKM3ulixZAktLS2WdFStWoE+fPspdTC1btkyzNw0RERG9frLUJ0bL9NQnhrdYExERvWDO9zfHTiIiIiJdYhFDREREusQihoiIiHSJRQwRERHpEosYIiIi0iUWMURERKRLLGKIiIhIl1jEEBERkS6xiCEiIiJdYhFDREREusQihoiIiHSJRQwRERHpEosYIiIi0iUWMURERKRLLGKIiIhIl1jEEBERkS6xiCEiIiJdYhFDREREusQihoiIiHSJRQwRERHpEosYIiIi0iUWMURERKRLLGKIiIhIl1jEEBERkS6xiCEiIiJdYhFDREREusQihoiIiHSJRQwRERHpEosYIiIi0iWr3E6A1OU7dFOmtw2b2EzFTIiIiLIXj8QQERGRLrGIISIiIl1iEUNERES6ZHYR888//6BFixbw8vKCwWDA+vXr01y3R48eMBgMmDFjhtH8uLg49O7dGwUKFICDgwNatmyJ69ev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TwBIcbTkzp07ytEZT09PxMfHIyoqKt11bt++nSL+3bt3UxzlSWZjYwMnJyejiYiIiPIuVYsYPz8/eHp6Yvv27cq8+Ph47N27F9WrVwcAVKlSBfny5TNa59atWzh79qyyTrVq1RAdHY2jR48q6xw5cgTR0dHKOkRERPR6M/vupMePH+Py5cvK49DQUISEhMDNzQ0+Pj7o168fJkyYgJIlS6JkyZKYMGEC7O3t0b59ewCAs7MzunbtigEDBsDd3R1ubm4YOHAgAgIClLuVypQpg8aNG6N79+6YN28eAOCLL75A8+bNeWcSERERAchEEXP8+HHUrVtXedy/f38AQMeOHbFkyRIMHjwYT58+Rc+ePREVFYWqVati27ZtcHR0VLaZPn06rKys0KZNGzx9+hT169fHkiVLYGlpqayzYsUK9OnTR7mLqWXLlmn2piEiIqLXj9lFTJ06dSAiaS43GAwYNWoURo0aleY6tra2mDVrFmbNmpXmOm5ubli+fLm56REREdFrgmMnERERkS6xiCEiIiJdYhFDREREusQihoiIiHSJRQwRERHpEosYIiIi0iUWMURERKRLLGKIiIhIl1jEEBERkS6xiCEiIiJdYhFDREREusQihoiIiHSJRQwRERHpEosYIiIi0iUWMURERKRLLGKIiIhIl1jEEBERkS6xiCEiIiJdYhFDREREusQihoiIiHSJRQwRERHpEosYIiIi0iUWMURERKRLLGKIiIhIl1jEEBERkS6xiCEiIiJdYhFDREREusQihoiIiHSJRQwRERHpEosYIiIi0iUWMURERKRLLGKIiIhIl1QvYp4/f47vvvsOfn5+sLOzQ7FixTBmzBgkJSUp64gIRo0aBS8vL9jZ2aFOnTo4d+6cUZy4uDj07t0bBQoUgIODA1q2bInr16+rnS4RERHplJXaASdNmoS5c+ciKCgI5cqVw/Hjx9G5c2c4Ozujb9++AIDJkydj2rRpWLJkCUqVKoVx48bhvffew4ULF+Do6AgA6NevH/7880+sXr0a7u7uGDBgAJo3b47g4GBYWlqqnTa9hnyHbsrS9mETm6mUCRERZYbqRcyhQ4fQqlUrNGv24gPe19cXq1atwvHjxwG8OAozY8YMDB8+HB988AEAICgoCB4eHli5ciV69OiB6OhoLFq0CMuWLUODBg0AAMuXL4e3tzd27NiBRo0a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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot feature importances\n",
"plt.bar(x=[feat for feat, score in scores], height=[score for feat, score in scores])\n",
"plt.xticks(rotation=90)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "87f7e119-2810-4b4f-bd40-38245d889122",
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"{'status': 'ok', 'restart': False}"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:distributed.nanny:Closing Nanny at 'tcp://127.0.0.1:43491'. Reason: nanny-close\n",
"INFO:distributed.nanny:Nanny asking worker to close. Reason: nanny-close\n",
"INFO:distributed.nanny:Closing Nanny at 'tcp://127.0.0.1:40997'. Reason: nanny-close\n",
"INFO:distributed.nanny:Nanny asking worker to close. Reason: nanny-close\n",
"INFO:distributed.nanny:Closing Nanny at 'tcp://127.0.0.1:44361'. Reason: nanny-close\n",
"INFO:distributed.nanny:Nanny asking worker to close. Reason: nanny-close\n",
"INFO:distributed.nanny:Closing Nanny at 'tcp://127.0.0.1:32995'. Reason: nanny-close\n",
"INFO:distributed.nanny:Nanny asking worker to close. Reason: nanny-close\n",
"INFO:distributed.scheduler:Remove client Client-worker-3cc14430-0779-11f1-8872-0242ac120003\n",
"INFO:distributed.core:Received 'close-stream' from tcp://127.0.0.1:51226; closing.\n",
"INFO:distributed.scheduler:Remove client Client-worker-3cc13d09-0779-11f1-8876-0242ac120003\n",
"INFO:distributed.core:Received 'close-stream' from tcp://127.0.0.1:51224; closing.\n",
"INFO:distributed.scheduler:Remove client Client-worker-3cc12906-0779-11f1-887a-0242ac120003\n",
"INFO:distributed.core:Received 'close-stream' from tcp://127.0.0.1:51222; closing.\n",
"INFO:distributed.scheduler:Remove client Client-worker-3cc14430-0779-11f1-8872-0242ac120003\n",
"INFO:distributed.scheduler:Remove client Client-worker-3cc13d09-0779-11f1-8876-0242ac120003\n",
"INFO:distributed.scheduler:Remove client Client-worker-3cc12906-0779-11f1-887a-0242ac120003\n",
"INFO:distributed.scheduler:Remove client Client-worker-3cc01278-0779-11f1-887d-0242ac120003\n",
"INFO:distributed.core:Received 'close-stream' from tcp://127.0.0.1:51218; closing.\n",
"INFO:distributed.scheduler:Remove client Client-worker-3cc01278-0779-11f1-887d-0242ac120003\n",
"INFO:distributed.core:Received 'close-stream' from tcp://127.0.0.1:51140; closing.\n",
"INFO:distributed.core:Received 'close-stream' from tcp://127.0.0.1:51136; closing.\n",
"INFO:distributed.core:Received 'close-stream' from tcp://127.0.0.1:51144; closing.\n",
"INFO:distributed.scheduler:Close client connection: Client-worker-3cc14430-0779-11f1-8872-0242ac120003\n",
"INFO:distributed.scheduler:Close client connection: Client-worker-3cc13d09-0779-11f1-8876-0242ac120003\n",
"INFO:distributed.scheduler:Close client connection: Client-worker-3cc12906-0779-11f1-887a-0242ac120003\n",
"INFO:distributed.scheduler:Remove worker <WorkerState 'tcp://127.0.0.1:42681', name: 0, status: closing, memory: 7, processing: 0>\n",
"INFO:distributed.core:Removing comms to tcp://127.0.0.1:42681\n",
"INFO:distributed.scheduler:Remove worker <WorkerState 'tcp://127.0.0.1:37073', name: 1, status: closing, memory: 7, processing: 0>\n",
"INFO:distributed.core:Removing comms to tcp://127.0.0.1:37073\n",
"INFO:distributed.scheduler:Remove worker <WorkerState 'tcp://127.0.0.1:39483', name: 2, status: closing, memory: 7, processing: 0>\n",
"INFO:distributed.core:Removing comms to tcp://127.0.0.1:39483\n",
"INFO:distributed.core:Received 'close-stream' from tcp://127.0.0.1:51142; closing.\n",
"INFO:distributed.scheduler:Close client connection: Client-worker-3cc01278-0779-11f1-887d-0242ac120003\n",
"INFO:distributed.scheduler:Remove worker <WorkerState 'tcp://127.0.0.1:39523', name: 3, status: closing, memory: 7, processing: 0>\n",
"INFO:distributed.core:Removing comms to tcp://127.0.0.1:39523\n",
"INFO:distributed.scheduler:Lost all workers\n",
"INFO:distributed.scheduler:Scheduler closing...\n",
"INFO:distributed.scheduler:Scheduler closing all comms\n"
]
}
],
"source": [
"# clean GPU memory\n",
"import IPython\n",
"app = IPython.Application.instance()\n",
"app.kernel.do_shutdown(restart=False)"
]
},
{
"cell_type": "markdown",
"id": "f20b0671-e9a6-4fca-b3e2-be2730194739",
"metadata": {},
"source": [
"**Well Done!** Let's move to the [next notebook](2_03_model_tuning.ipynb). "
]
},
{
"cell_type": "markdown",
"id": "2591ab18-7848-4c75-818a-1d11de62ebd6",
"metadata": {},
"source": [
"<a href=\"https://www.nvidia.com/dli\"> <img src=\"images/DLI_Header.png\" alt=\"Header\" style=\"width: 400px;\"/> </a>"
]
}
],
"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.16"
}
},
"nbformat": 4,
"nbformat_minor": 5
}