与LightGBM集成#

这是关于如何在Mars中使用LightGBM进行训练和预测的介绍。

安装#

如果您正在尝试在单台机器上使用 Mars,例如在您的笔记本电脑上,请确保已安装 LightGBM。

您可以通过pip安装LightGBM:

pip install lightgbm

访问 LightGBM 的安装指南 以获取更多信息。

另一方面,如果您在集群上使用Mars,请确保每个工作节点上都安装了LightGBM。

准备数据#

首先,我们使用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)

探索数据框的前5行数据。

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)

训练#

我们可以使用与LightGBM中实现的API类似的scikit-learn API来训练数据。

In [9]: from mars.learn.contrib import lightgbm as lgb
In [10]: lg_reg = lgb.LGBMRegressor(colsample_bytree=0.3, learning_rate=0.1,
    ...:                            max_depth=5, reg_alpha=10, n_estimators=10)

In [11]: lg_reg.fit(X_train, y_train)
Out[11]:
LGBMRegressor(boosting_type='gbdt', class_weight=None, colsample_bytree=0.3,
              importance_type='split', learning_rate=0.1, max_depth=5,
              min_child_samples=20, min_child_weight=0.001, min_split_gain=0.0,
              n_estimators=10, n_jobs=-1, num_leaves=31, objective=None,
              out_dtype_=dtype('float64'), random_state=None, reg_alpha=10,
              reg_lambda=0.0, silent=True, subsample=1.0,
              subsample_for_bin=200000, subsample_freq=0)

预测#

对于预测,可以使用scikit-learn API。

In [12]: lg_reg.predict(X_test)
Out[12]:
476    20.044731
490    18.540266
304    26.985506
216    21.946456
256    34.913612
         ...
250    24.234580
224    34.980905
500    21.376179
134    19.605267
248    23.253156
Name: predictions, Length: 152, dtype: float64

分布式训练和预测#

有关部署的内容,请参阅 在集群上运行 部分,或有关在 Kubernetes 上运行 Mars 的内容,请参阅 在 Kubernetes 上运行 部分。

一旦集群存在,您可以将会话设置为默认,会将上述训练和预测提交给该集群,或者您也可以明确指定session=***

LGBMRegressor.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>')

lg_reg = lgb.LGBMRegressor()

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

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

当您拥有一个现有的LightGBM模型时,也可以通过使用Mars LightGBM类将您的模型包装起来,以此在Mars对象上进行预测:

lg_reg = lgb.LGBMRegressor(raw_model)

# training will submitted to cluster by default
lg_reg.predict(X_test)