使用sklearn的GridSearchCV在大数据(15750个样本)中寻找优化参数
我正在尝试在Python中使用sklearn的GridSearchCV来寻找SVM分类器的参数。我的训练数据形状是(15750,65536),也就是说有15750个样本,每个样本有65536个特征。
默认设置下,一切都运行得很好!但是,当我想使用并行处理功能,通过设置n_jobs时,我遇到了一个问题:数据被加载到内存中(在一台有48GB内存的机器上,大约占用了14%的内存),但它从来没有开始进行网格搜索/训练!在(h)top中,进程状态是S(这基本上是停止的状态!)。它继续占用内存,但从未开始运行(CPU使用率保持为零!)。
我尝试了不同的n_jobs值,比如2、3到5(这台机器有8个核心)。但都没有成功!根据文档,对于大数据,可以在GridSearchCV中使用pre_dispatch选项,这样可以限制复制的数据量,避免内存问题。所以我甚至尝试了n_jobs=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)
1 个回答
1
你试过把 n_jobs 设置为 -1 吗?这个设置是告诉 sklearn 使用所有的 CPU。对我来说,这个设置效果很好(不过我训练的数据样本比较少)。