为 RandomizedSearchCV 缩放 sklearn RandomForestClassifier
scaling sklearn RandomForestClassifier for RandomizedSearchCV
我正在一个具有 28 个 CPU 和 ~190GB 内存的集群节点上训练 sklearn.ensemble.RandomForestClassifier()
。单独训练这个分类器运行得非常快,使用机器上的所有内核并使用 ~93GB 内存:
x_train,x_test,y_train,y_test=sklearn.model_selection.train_test_split(x,y,test_size=.25,random_state=0)
clf=sklearn.ensemble.RandomForestClassifier(n_estimators=100,
random_state=0,
n_jobs=-1,
max_depth=10,
class_weight='balanced',
warm_start=False,
verbose=2)
clf.fit(x_train,y_train)
输出:
[Parallel(n_jobs=-1)]: Done 88 out of 100 | elapsed: 1.9min remaining: 15.2s
[Parallel(n_jobs=-1)]: Done 100 out of 100 | elapsed: 2.0min finished
CPU times: user 43min 10s, sys: 1min 33s, total: 44min 44s
Wall time: 2min 20s
但是,这个特定模型似乎不是最优的,其性能正确率约为 80%。所以我想使用 sklearn.model_selection.RandomizedSearchCV()
来优化模型的超参数。所以我这样设置搜索:
rfc = sklearn.ensemble.RandomForestClassifier()
rf_random = sklearn.model_selection.RandomizedSearchCV(estimator=rfc,
param_distributions=random_grid,
n_iter=100,
cv=3,
verbose=2,
random_state=0,
n_jobs=2,
pre_dispatch=1)
rf_random.fit(x, y)
但我找不到 n_jobs
和 pre_dispatch
的有效使用硬件的设置。以下是一些示例运行和结果:
n_jobs pre_dispatch Result
===========================================================================
default default Utilizes all cores but Job killed - out of memory
-1 1 Job killed - out of memory
12 1 Job killed - out of memory
3 1 Job killed - out of memory
2 1 Job runs, but only utilizes 2 cores, takes >230min (wall clock) per model
如何在 运行 超参数搜索时获得训练独立 RandomForestClassifier
时看到的性能?独立版本是如何并行化的,这样它就不会像网格搜索那样创建我的大型数据集的副本?
编辑:
以下参数组合有效地使用了所有内核来训练每个个体 RandomForestClassifier
,而无需并行化超参数搜索本身或增加 RAM 使用率。
model = sklearn.ensemble.RandomForestClassifier(n_jobs=-1, verbose=1)
search = sklearn.model_selection.RandomizedSearchCV(estimator=model,
param_distributions=random_grid,
n_iter=10,
cv=3,
verbose=10,
random_state=0,
n_jobs=1,
pre_dispatch=1)
with joblib.parallel_backend('threading'):
search.fit(x, y)
如果单个分类器训练使所有核心饱和,那么并行化网格搜索也没有任何好处。为 gridsearch 设置 n_jobs=1,为分类器保持 n_jobs=-1。
这应该避免内存不足的情况。
我正在一个具有 28 个 CPU 和 ~190GB 内存的集群节点上训练 sklearn.ensemble.RandomForestClassifier()
。单独训练这个分类器运行得非常快,使用机器上的所有内核并使用 ~93GB 内存:
x_train,x_test,y_train,y_test=sklearn.model_selection.train_test_split(x,y,test_size=.25,random_state=0)
clf=sklearn.ensemble.RandomForestClassifier(n_estimators=100,
random_state=0,
n_jobs=-1,
max_depth=10,
class_weight='balanced',
warm_start=False,
verbose=2)
clf.fit(x_train,y_train)
输出:
[Parallel(n_jobs=-1)]: Done 88 out of 100 | elapsed: 1.9min remaining: 15.2s
[Parallel(n_jobs=-1)]: Done 100 out of 100 | elapsed: 2.0min finished
CPU times: user 43min 10s, sys: 1min 33s, total: 44min 44s
Wall time: 2min 20s
但是,这个特定模型似乎不是最优的,其性能正确率约为 80%。所以我想使用 sklearn.model_selection.RandomizedSearchCV()
来优化模型的超参数。所以我这样设置搜索:
rfc = sklearn.ensemble.RandomForestClassifier()
rf_random = sklearn.model_selection.RandomizedSearchCV(estimator=rfc,
param_distributions=random_grid,
n_iter=100,
cv=3,
verbose=2,
random_state=0,
n_jobs=2,
pre_dispatch=1)
rf_random.fit(x, y)
但我找不到 n_jobs
和 pre_dispatch
的有效使用硬件的设置。以下是一些示例运行和结果:
n_jobs pre_dispatch Result
===========================================================================
default default Utilizes all cores but Job killed - out of memory
-1 1 Job killed - out of memory
12 1 Job killed - out of memory
3 1 Job killed - out of memory
2 1 Job runs, but only utilizes 2 cores, takes >230min (wall clock) per model
如何在 运行 超参数搜索时获得训练独立 RandomForestClassifier
时看到的性能?独立版本是如何并行化的,这样它就不会像网格搜索那样创建我的大型数据集的副本?
编辑:
以下参数组合有效地使用了所有内核来训练每个个体 RandomForestClassifier
,而无需并行化超参数搜索本身或增加 RAM 使用率。
model = sklearn.ensemble.RandomForestClassifier(n_jobs=-1, verbose=1)
search = sklearn.model_selection.RandomizedSearchCV(estimator=model,
param_distributions=random_grid,
n_iter=10,
cv=3,
verbose=10,
random_state=0,
n_jobs=1,
pre_dispatch=1)
with joblib.parallel_backend('threading'):
search.fit(x, y)
如果单个分类器训练使所有核心饱和,那么并行化网格搜索也没有任何好处。为 gridsearch 设置 n_jobs=1,为分类器保持 n_jobs=-1。 这应该避免内存不足的情况。