实时笔记本

你可以在 live session Binder 中运行此笔记本,或查看 Github 上的内容。

缩放 XGBoost

Dask 和 XGBoost 可以一起工作,以并行方式训练梯度提升树。这个笔记本展示了如何一起使用 Dask 和 XGBoost。

XGBoost 提供了一个强大的预测框架,并且在实践中表现良好。它在 Kaggle 竞赛中获胜,并在工业界广受欢迎,因为它具有良好的性能并且易于解释(即,从 XGBoost 模型中找到重要特征很容易)。

Dask 标志 Dask 标志

设置 Dask

我们设置了一个 Dask 客户端,它通过仪表板提供性能和进度指标。

您可以通过点击运行单元格后的链接来查看仪表板。

[ ]:
from dask.distributed import Client

client = Client(n_workers=4, threads_per_worker=1)
client

创建数据

首先,我们创建一批合成数据,包含100,000个样本和20个特征。

[ ]:
from dask_ml.datasets import make_classification

X, y = make_classification(n_samples=100000, n_features=20,
                           chunks=1000, n_informative=4,
                           random_state=0)
X

Dask-XGBoost 适用于数组和数据帧。有关从实际数据创建dask数组和数据帧的更多信息,请参阅 Dask数组Dask数据帧 的文档。

分割数据用于训练和测试

我们将数据集分为训练数据和测试数据,以确保我们有公平的测试,从而帮助评估:

[ ]:
from dask_ml.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15)

现在,让我们尝试使用 dask-xgboost 来处理这些数据。

训练 Dask-XGBoost

[ ]:
import dask
import xgboost
import dask_xgboost

dask-xgboost 是 xgboost 的一个小包装器。Dask 设置 XGBoost,提供数据,并让 XGBoost 使用 Dask 可用的所有工作线程在后台进行训练。

让我们进行一些训练:

[ ]:
params = {'objective': 'binary:logistic',
          'max_depth': 4, 'eta': 0.01, 'subsample': 0.5,
          'min_child_weight': 0.5}

bst = dask_xgboost.train(client, params, X_train, y_train, num_boost_round=10)

可视化结果

bst 对象是一个常规的 xgboost.Booster 对象。

[ ]:
bst

这意味着 XGBoost 文档 中提到的所有方法都可用。我们展示了两个例子来扩展这一点,但这些例子是关于 XGBoost 而不是 Dask 的。

绘制特征重要性

[ ]:
%matplotlib inline
import matplotlib.pyplot as plt

ax = xgboost.plot_importance(bst, height=0.8, max_num_features=9)
ax.grid(False, axis="y")
ax.set_title('Estimated feature importance')
plt.show()

我们在创建数据时指定了只有4个特征是信息性的,而只有3个特征显示为重要。

绘制接收者操作特征曲线

我们可以使用一个更高级的指标来确定我们的分类器的表现,通过绘制 接收者操作特征(ROC)曲线

[ ]:
y_hat = dask_xgboost.predict(client, bst, X_test).persist()
y_hat
[ ]:
from sklearn.metrics import roc_curve

y_test, y_hat = dask.compute(y_test, y_hat)
fpr, tpr, _ = roc_curve(y_test, y_hat)
[ ]:
from sklearn.metrics import auc

fig, ax = plt.subplots(figsize=(5, 5))
ax.plot(fpr, tpr, lw=3,
        label='ROC Curve (area = {:.2f})'.format(auc(fpr, tpr)))
ax.plot([0, 1], [0, 1], 'k--', lw=2)
ax.set(
    xlim=(0, 1),
    ylim=(0, 1),
    title="ROC Curve",
    xlabel="False Positive Rate",
    ylabel="True Positive Rate",
)
ax.legend();
plt.show()

这个受试者工作特征(ROC)曲线告诉我们分类器的表现如何。我们可以通过它向左上角弯曲的程度来判断它的表现。一个完美的分类器会在左上角,而一个随机的分类器会沿着对角线。

这条曲线下的面积是 area = 0.76。这告诉我们,我们的分类器对随机选择的实例进行正确预测的概率。

了解更多