【问题标题】:scaling sklearn RandomForestClassifier for RandomizedSearchCV为 RandomizedSearchCV 缩放 sklearn RandomForestClassifier
【发布时间】:2019-08-18 06:30:23
【问题描述】:

我在具有 28 个 CPU 和 ~190GB RAM 的单个集群节点上训练 sklearn.ensemble.RandomForestClassifier()。单独训练这个分类器运行速度非常快,使用机器上的所有内核并使用 ~93GB RAM:

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_jobspre_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)

【问题讨论】:

    标签: python scikit-learn random-forest hpc


    【解决方案1】:

    如果单个分类器训练使您的所有核心饱和,那么并行化网格搜索也无济于事。为网格搜索设置 n_jobs=1,为分类器保持 n_jobs=-1。 这应该可以避免内存不足的情况。

    【讨论】:

    • 是的,我也想通了。同样重要的是强制使用线程后端,进程分叉正在扼杀我的内存使用。
    猜你喜欢
    • 2019-08-03
    • 2018-03-25
    • 2019-11-28
    • 2018-08-20
    • 2015-12-10
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    相关资源
    最近更新 更多