我正在尝试使用Python中的sklearn中的GridSearchCV来查找SVM分类器的参数。训练数据的形状为(15750,65536)(15750个样本,特征维度:65536)。
使用默认设置一切正常!但是,如果我想使用并行处理选项,通过定义n_jobs我面临以下问题:数据被加载到内存中(在具有48 GB RAM的机器上,它占整个内存的大约14%),但它永远不会开始网格搜索/培训!在(h)顶部,过程状态为S(因此它基本上停止了!)。它继续占用内存,但从不开始运行(CPU使用率保持为零!)。
我为n_jobs尝试了不同的值,比如2,3-5(机器有8个核心)。但没有运气! 根据文档,对于大数据,可以在GridSearchCV中使用pre_dispatch选项,这样就可以限制复制数据的数量并避免内存问题。所以我尝试使用n_job = 2和pre_dispatch = 1,但仍然无效!
我还应该提一下,我用相同数量的样本尝试相同的代码,比如1000个样本,而且一切都很好!然而,问题是,鉴于对于一个进程,数据只占机器内存的15%,为什么它不能在至少两个内核上运行,pre_dispatch = 2?然后它应占用大约30%的机器内存。但为什么这个过程刚刚停止?甚至没有内存错误? 如果有办法解决它?
以下是完成工作的代码(主要来自sklearn文档):
sklearn版本:0.12.1和python版本:2.7.3
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
'C': [1, 10, 100, 1000]},
{'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]
clf = GridSearchCV(SVC(C=1), tuned_parameters, n_jobs=2, verbose=3, pre_dispatch=1)
clf.fit(tr, tt, cv=3)
答案 0 :(得分:1)
您是否尝试过n_jobs = -1,它指示sklearn使用所有CPU?这个设置对我来说非常适合(尽管我的训练样本数量要少得多)。