Я просматриваю реализацию оценок dask-lightgbm (в частности, функцию _train_part
в dask_lightgb.core.py), и я не вижу, как весь обучающий набор используется для соответствия окончательной оценке?
Функция _train_part
принимает логический аргумент return_model
, а в реализации функции train
(которая использует client.submit
для вызова _train_part
для каждого рабочего процесса) return_model
истинно только тогда, когда рабочий процесс является master_worker (который сам по себе является случайно выбранным рабочим процессом Dask). ). Логически, каждый рабочий получает 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
Разве это не эквивалентно обучению нераспределенной версии оценщика lightgbm на подвыборке 1/n обучающего набора? Я что-то упускаю? Я чувствую, что упускаю часть, где либо независимые модели рабочих объединяются в одну, либо где одна оценка обновляется с помощью отдельных деревьев, изученных отдельными рабочими.
Благодарю вас!