Я хочу итеративно обучать 1000 случайных лесов на наборе данных. Чтобы ускорить процесс, я пытаюсь использовать несколько ядер во время повторного цикла обучения. Ниже приведен рабочий пример:
from sklearn.ensemble import RandomForestClassifier
from multiprocessing import Pool,cpu_count
import numpy as np
import pandas as pd
from time import time
n = 2000
ndims = 5000
X = pd.DataFrame(np.random.normal(0,1,n*ndims).reshape((n,ndims)))
y = pd.Series(np.random.choice([0, 1], size=(n)))
def draw_batches(n,size=100):
steps = np.arange(0,n,size)
if not n%size == 0:
steps = np.append(steps,n%size)[1:]
for step in steps:
if not step%size == 0:
yield step
else:
yield size
def pool(method,iters):
output = []
p = Pool(4)
try:
output = p.map(method,iters)
except Exception as e:
print(e)
pass
finally:
p.close()
p.join()
del p
return output
def importances(args):
model, i = args
y_ = y.copy()
model.fit(X,y_)
return model.feature_importances_
n_iters = 100
model_cls = RandomForestClassifier
for batch in draw_batches(n_iters,4):
print(batch)
t = time()
train_args = [(model_cls(n_estimators=50),i) for i in np.arange(batch)]
imps = pool(importances,train_args)
print((time()-t)/batch)
Хотя это и не так ярко выражено, как в коде, с которым я работаю, приведенное выше показывает, что время обработки для каждой модели постепенно увеличивается с увеличением количества выполняемых пакетов. Я не ожидал бы, что это так, поскольку обработка пула полностью завершена, и все удаляется в конце каждого запуска.
Что вызывает замедление?