我正在阅读dask-lightgbm估计器的实现(特别是dask_lightgb.core.py中的_train_part
函数),但看不到训练集的整体情况习惯于适合最终的估算器?
_train_part
函数接受布尔参数return_model
,并且在train
函数的实现中(使用client.submit
在每个工作程序上调用_train_part
),return_model
仅在工作人员为“ master_worker”(其本身似乎是随机选择的Dask工作人员)时才为true。从逻辑上讲,每个工作人员都被分配了整个模型训练集的1 / n块-其中n =工人总数-然后,每个工人在训练集的自己子集上训练自己的独立模型。 return_model
参数控制_train_part
是否返回每个工作人员的模型,因此,除一个工作人员外,它对所有工作人员-因此所有模型都返回None。
代码:
def _train_part(params, model_factory, list_of_parts, worker_addresses, return_model, local_listen_port=12400,
time_out=120, **kwargs):
network_params = build_network_params(worker_addresses, get_worker().address, local_listen_port, time_out)
params.update(network_params)
# Concatenate many parts into one
parts = tuple(zip(*list_of_parts))
data = concat(parts[0])
label = concat(parts[1])
weight = concat(parts[2]) if len(parts) == 3 else None
try:
model = model_factory(**params)
model.fit(data, label, sample_weight=weight)
finally:
_safe_call(_LIB.LGBM_NetworkFree())
return model if return_model else None
这是否等同于在训练集的1 / n子样本上训练lightgbm估计器的非分布式版本?我想念什么吗?我感觉好像缺少了一部分,要么将工人的独立模型合并为一个模型,要么将单个估算器更新为由单独的工人学习的单个树。
谢谢!
答案 0 :(得分:0)
答案是肯定的-dask_lightgbm使用所有可用的训练样本。 Dask的职责仅是在工作人员之间分发数据。一旦设置了network parameters,LightGBM便会处理所有分布式学习。并不是每个工人都在训练自己的独立模型-LightGBM只是在训练一个模型-但是每个工人都会得到它的副本。因此,只有选定的工作人员返回拟合的估计量,其他所有人都返回无。