scikit-learn GridSearchCV n_jobs != 1 冻结

Posted

技术标签:

【中文标题】scikit-learn GridSearchCV n_jobs != 1 冻结【英文标题】:scikit-lean GridSearchCV n_jobs != 1 freezing 【发布时间】:2017-12-08 15:04:13 【问题描述】:

我在随机森林上运行网格搜索并尝试使用不同的 n_jobs,但内核冻结,没有 CPU 使用率。使用 n_jobs=1 可以正常工作。我什至不能用 ctl-C 停止命令,必须重新启动内核。 我在 windows 7 上运行。我看到 OS X 也存在类似问题,但解决方案与 windows 7 无关。

from sklearn.ensemble import RandomForestClassifier
rf_tfdidf = Pipeline([('vect',tfidf),
                  ('clf', RandomForestClassifier(n_estimators=50, 
class_weight='balanced_subsample'))])

param_grid = ['vect__ngram_range':[(1,1)],
          'vect__stop_words': [stop],
          'vect__tokenizer':[tokenizer]
          ]
if __name__ == '__main__':
gs_rf_tfidf = GridSearchCV(rf_tfdidf, param_grid, scoring='accuracy', cv=5, 
                                                           verbose=10, 
                                                           n_jobs=2)
gs_rf_tfidf.fit(X_train_part, y_train_part)

谢谢。

【问题讨论】:

if name =='main' 之后的下一行需要有适当的缩进。 正如 sera 所说,这是缩进:github.com/scikit-learn/scikit-learn/issues/2889 - 顺便说一句,您的代码按原样运行而没有缩进错误 如果没有缩进问题,而这正是您在此处粘贴代码的方式,不妨看看 [this](此类问题还有其他问题:[github.com/scikit-learn/scikit-learn/issues/… etc ) ? 副本出错了。您在此处给出的问题与 Windows 无关。谢谢。 我发布的答案解决了我在 Windows 8 中遇到的类似问题。请尝试一下 【参考方案1】:

if __name__ == '__main__': 后面的缩进不正确。如果不是这种情况并且是复制粘贴错误,那么您可以尝试以下操作:

if __name__ =='main':
    # your code indented !

所以你的脚本的第一行是if __name__ == '__main__':,然后其余的代码在后面跟着适当的缩进。

新代码

from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline    

if __name__ == '__main__':

    rf_tfdidf = Pipeline([('vect',tfidf),('clf', RandomForestClassifier(n_estimators=50,class_weight='balanced_subsample'))])

    param_grid = ['vect__ngram_range':[(1,1)],'vect__stop_words': [stop],'vect__tokenizer':[tokenizer]]

    gs_rf_tfidf = GridSearchCV(rf_tfdidf, param_grid, scoring='accuracy', cv=5,verbose=10, n_jobs=-1)

    gs_rf_tfidf.fit(X_train_part, y_train_part)

这对我来说很好(Windows 8.1)

编辑

以下使用 PyCharm 可以正常工作。我没有使用过 spyder,但它也应该适用于 spyder:

代码

Class Test(object):
    def __init__(self):
        ###code here
        ###code here    

if __name__ == '__main__':
    Test()

【讨论】:

效果很好!就是想。我设法从控制台运行脚本,但是如何在我的 IDE (spyder) 中运行它并在需要时进行调试。 你好。一般来说,你应该使用像 VIM link 或 Atom link 这样的文本编辑器。您可以在 .py 文件中编写脚本,然后在控制台中运行它们。对于实时调试,您可以使用 PyCharm link。最后,我很高兴能帮上忙。您可以将其标记为已接受,以便其他人可以尝试相同的解决方案 @ShacharStern Spyder 非常易于使用。在菜单栏中,您将找到“调试”选项。您可以将断点放置到您希望代码运行的位置。 Vivek,我不认为你理解我。我知道如何使用 spyder。我只能从命令行运行此代码,因为它位于“if name == 'main':”中,我正在寻找一种在 spyder 上运行它的方法。 @VivekKumar 使用可以在 spyder 中运行的类。看这里link

以上是关于scikit-learn GridSearchCV n_jobs != 1 冻结的主要内容,如果未能解决你的问题,请参考以下文章

Scikit-learn 中的 GridSearchCV 输出问题

Scikit-Learn:GridSearchCV 的自定义损失函数

Scikit-learn 多输出分类器使用:GridSearchCV、Pipeline、OneVsRestClassifier、SGDClassifier

scikit-learn GridSearchCV 弃用警告

scikit-learn 中 LogisticRegression 上的 GridSearchCV

使用 GridSearchCV 调整 scikit-learn 的随机森林超参数