这个指引会介绍如何在 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() 给出了所有列的统计信息。
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.
MarsDMatrix
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)
训练可以包含两种方式:
调用 train(),它接受一个 MarsDMatrix。
train()
使用 scikit-learn 接口 XGBClassifier 和 XGBRegressor。
XGBClassifier
XGBRegressor
对于 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)
对于预测,也有两种方式。
调用 predict(),它也接受一个 MarsDMatrix。
predict()
调用 XGBClassifier.predict() 或者 XGBRegressor.predict(),确保他们已经训练过了。
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。
session=***
以 XGBRegressor.fit() 为例。
XGBRegressor.fit()
# A cluster has been configured, and web UI is started on <web_ip>:<web_port> from mars.session import new_session # set the session as the default one sess = new_session('http://<web_ip>:<web_port>').as_default() 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)