【发布时间】:2020-02-08 23:13:15
【问题描述】:
我想在一个数据集上迭代训练 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)
虽然不像我正在工作的代码那样明显,但上面显示每个模型的处理时间会随着您运行的批次数逐渐增加。我不希望会出现这种情况,因为池处理已全部包含在内,并且在每次运行结束时都会删除所有内容。
是什么导致速度变慢?
【问题讨论】:
-
RandomForestClassifier可以使用多核 cpu -n_jobs参数。试试这种方法并比较运行时间。 -
@Poolka,谢谢,但问题不是“我怎样才能让 sklearn.RandomForest 运行得更快”,而是“为什么同一个森林在使用 multiprocessing.Pool 时运行速度越来越慢”
-
@PF1 你在什么操作系统上运行,你用的是什么版本的 Python?
-
@Jed 如果您的环境在单个池中表现出减速,或者我对每次创建/销毁池的猜测是否正确,我会很感兴趣
标签: python scikit-learn multiprocessing random-forest