和 XGBoost 集成#

这个指引会介绍如何在 Mars 里使用 XGBoost 进行训练和预测。

安装#

如果你试图在单机比如你的笔记本上使用 Mars,确保 XGBoost 已经安装。

你能通过 pip 安装 XGBoost:

pip install xgboost

访问 XGBoost 安装指引 获取更多信息。

另一方面,如果你在集群上使用 Mars,确保 XGBoost 在每个 worker 上安装。

准备数据#

首先,我们使用 scikit-learn 来加载波士顿房屋数据集。

In [1]: from sklearn.datasets import load_boston
In [2]: boston = load_boston()

接着从数据创建 Mars DataFrame。

In [3]: import mars.dataframe as md
In [4]: data = md.DataFrame(boston.data, columns=boston.feature_names)

查看 DataFrame 前五条数据。

In [5]: data.head().execute()
Out[5]:
      CRIM    ZN  INDUS  CHAS    NOX  ...  RAD    TAX  PTRATIO       B  LSTAT
0  0.00632  18.0   2.31   0.0  0.538  ...  1.0  296.0     15.3  396.90   4.98
1  0.02731   0.0   7.07   0.0  0.469  ...  2.0  242.0     17.8  396.90   9.14
2  0.02729   0.0   7.07   0.0  0.469  ...  2.0  242.0     17.8  392.83   4.03
3  0.03237   0.0   2.18   0.0  0.458  ...  3.0  222.0     18.7  394.63   2.94
4  0.06905   0.0   2.18   0.0  0.458  ...  3.0  222.0     18.7  396.90   5.33

[5 rows x 13 columns]

mars.dataframe.DataFrame.describe() 给出了所有列的统计信息。

In [6]: data.describe().execute()
Out[6]:
             CRIM          ZN       INDUS  ...     PTRATIO           B       LSTAT
count  506.000000  506.000000  506.000000  ...  506.000000  506.000000  506.000000
mean     3.613524   11.363636   11.136779  ...   18.455534  356.674032   12.653063
std      8.601545   23.322453    6.860353  ...    2.164946   91.294864    7.141062
min      0.006320    0.000000    0.460000  ...   12.600000    0.320000    1.730000
25%      0.082045    0.000000    5.190000  ...   17.400000  375.377500    6.950000
50%      0.256510    0.000000    9.690000  ...   19.050000  391.440000   11.360000
75%      3.677083   12.500000   18.100000  ...   20.200000  396.225000   16.955000
max     88.976200  100.000000   27.740000  ...   22.000000  396.900000   37.970000

[8 rows x 13 columns]

我们可以把数据打乱,然后把他们分成训练和测试集。

In [7]: from mars.learn.model_selection import train_test_split
In [8]: X_train, X_test, y_train, y_test = \
   ...:     train_test_split(data, boston.target, train_size=0.7, random_state=0)

现在我们可以创建一个 MarsDMatrix,它非常类似于 xgboost.DMatrix.

In [9]: from mars.learn.contrib import xgboost as xgb

In [10]: train_dmatrix = xgb.MarsDMatrix(data=X_train, label=y_train)
In [11]: test_dmatrix = xgb.MarsDMatrix(data=X_test, label=y_test)

训练#

训练可以包含两种方式:

  1. 调用 train(),它接受一个 MarsDMatrix

  2. 使用 scikit-learn 接口 XGBClassifierXGBRegressor

对于 train(),运行如下代码。

In [12]: params = {'objective': 'reg:squarederror','colsample_bytree': 0.3,'learning_rate': 0.1,
    ...:           'max_depth': 5, 'alpha': 10, 'n_estimators': 10}

In [13]: booster = xgb.train(dtrain=train_dmatrix, params=params)

对于 scikit-learn 接口,运行如下代码。

In [14]: xg_reg = xgb.XGBRegressor(objective='reg:squarederror', colsample_bytree=0.3,
    ...:                           learning_rate=0.1, max_depth=5, alpha=10, n_estimators=10)

In [15]: xg_reg.fit(X_train, y_train)
Out[15]:
XGBRegressor(alpha=10, base_score=0.5, booster='gbtree', colsample_bylevel=1,
             colsample_bynode=1, colsample_bytree=0.3, gamma=0,
             importance_type='gain', learning_rate=0.1, max_delta_step=0,
             max_depth=5, min_child_weight=1, missing=None, n_estimators=10,
             n_jobs=1, nthread=None, objective='reg:squarederror',
             random_state=0, reg_alpha=0, reg_lambda=1, scale_pos_weight=1,
             seed=None, silent=None, subsample=1, verbosity=1)

预测#

对于预测,也有两种方式。

  1. 调用 predict(),它也接受一个 MarsDMatrix

  2. 调用 XGBClassifier.predict() 或者 XGBRegressor.predict(),确保他们已经训练过了。

对于 predict(),我们可以用训练过的模型来调用。

In [16]: xgb.predict(booster, X_test)
Out[16]:
476    12.694860
490     9.062592
304    19.793633
216    14.832405
256    24.101620
         ...
250    16.733646
224    21.917801
500    14.239252
134    11.500128
248    15.969764
Name: predictions, Length: 152, dtype: float32

对于 XGBRegressor.predict(),运行如下代码。

In [17]: xg_reg.predict(X_test)
Out[17]:
476    12.059338
490     8.448854
304    20.644527
216    14.706422
256    23.231501
         ...
250    16.597778
224    22.945301
500    13.720667
134    11.226119
248    15.548668
Name: predictions, Length: 152, dtype: float32

分布式训练和预测#

部署参考 在集群中部署 部分,在 Kubernetes 上运行参考 在 Kubernetes 中部署 部分。

一旦一个集群存在,你可以要么设置默认 session,训练和预测就会自动提交到集群,要么你可以通过 session=*** 显示指定运行的 session。

XGBRegressor.fit() 为例。

# A cluster has been configured, and web UI is started on <web_ip>:<web_port>
import mars
# set the session as the default one
sess = mars.new_session('http://<web_ip>:<web_port>')

reg = xgb.XGBRegressor()

# training will submitted to cluster by default
reg.fit(X_train)

# Or, session could be specified as well
reg.fit(X_train, session=sess)