scikit的GridSearch和Python通常不会释放内存

42 python memory scikit-learn

我做了一些奇怪的观察,我的GridSearches在几个小时后仍然失败,我最初无法弄清楚原因.我随后监视了内存使用情况,发现它以几千兆字节(~6 Gb)启动并持续增加,直到它达到最大值时崩溃.硬件可以承受128 Gb.我正在尝试使用随机森林来分类大量的文本文档.为了简单起见 - 弄清楚发生了什么 - 我回到了天真的贝叶斯.

我正在使用的版本是

  • Python 3.4.2
  • scikit-learn 0.15.2

我在GitHub的scikit-issue列表上找到了一些关于这个主题的相关讨论:https://github.com/scikit-learn/scikit-learn/issues/565https://github.com/scikit-learn/scikit -learn /拉/ 770

听起来它已经成功解决了!

所以,我使用的相关代码是

grid_search = GridSearchCV(pipeline, 
                           parameters, 
                           n_jobs=1, # 
                           cv=5, 
                           scoring='roc_auc',
                           verbose=2,
                           pre_dispatch='2*n_jobs',
                           refit=False)  # tried both True and False

grid_search.fit(X_train, y_train)  
print('Best score: {0}'.format(grid_search.best_score_))  
print('Best parameters set:') 
Run Code Online (Sandbox Code Playgroud)

出于好奇,我后来决定通过嵌套for循环以快速和脏的方式进行网格搜索

for p1 in parameterset1:
    for p2 in parameterset2:
        ...
            pipeline = Pipeline([
                        ('vec', CountVectorizer(
                                   binary=True,
                                   tokenizer=params_dict[i][0][0],
                                   max_df=params_dict[i][0][1],
                                   max_features=params_dict[i][0][2],
                                   stop_words=params_dict[i][0][3],
                                   ngram_range=params_dict[i][0][4],)),
                         ('tfidf', TfidfTransformer(
                                      norm=params_dict[i][0][5],
                                      use_idf=params_dict[i][0][6],
                                      sublinear_tf=params_dict[i][0][7],)),
                         ('clf', MultinomialNB())])

            scores = cross_validation.cross_val_score(
                                        estimator=pipeline,
                                        X=X_train, 
                                        y=y_train, 
                                        cv=5, 
                                        scoring='roc_auc',
                                        n_jobs=1)

           params_dict[i][1] = '%s,%0.4f,%0.4f' % (params_dict[i][1], scores.mean(), scores.std())
           sys.stdout.write(params_dict[i][1] + '\n')
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.网格搜索运行并将结果写入stdout.但是,经过一段时间后,它再次超过128 Gb的内存上限.与scikit中的GridSearch相同的问题.经过一些实验,我终于发现了这一点

gc.collect()
len(gc.get_objects()) # particularly this part!
Run Code Online (Sandbox Code Playgroud)

在for循环中解决了问题,并且在~10小时的运行时间内内存使用率始终保持在6.5 Gb.

最后,我得到了上述解决方案,但是,我很想知道您可能导致此问题的原因以及您的提示和建议!

use*_*942 1

0.15.2 中的 RandomForest 不支持稀疏输入。

升级 sklearn 并重试...希望这将允许最终制作的多个副本消耗更少的内存。(并加快速度)