微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

dask_lightgbm使用的完整训练集?

如何解决dask_lightgbm使用的完整训练集?

我正在阅读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估计器的非分布式版本?我想念什么吗?我感觉好像缺少了一部分,要么将工人的独立模型合并为一个模型,要么将单个估算器更新为由单独的工人学习的单个树。

谢谢!

解决方法

答案是肯定的-dask_lightgbm使用所有可用的训练样本。 Dask的职责仅是在工作人员之间分发数据。一旦设置了network parameters,LightGBM便会处理所有分布式学习。并不是每个工人都在训练自己的独立模型-LightGBM只是在训练一个模型-但是每个工人都会得到它的副本。因此,只有选定的工作人员返回拟合的估计量,其他所有人都返回无。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。