GridsearchCV sklearn 中的错误

Posted

技术标签:

【中文标题】GridsearchCV sklearn 中的错误【英文标题】:error in GridsearchCV sklearn 【发布时间】:2015-06-28 21:16:40 【问题描述】:

我正在尝试使用 GridsearchCV 在 sklearn 中调整 GB 分类器。代码如下:

from sklearn.grid_search import GridSearchCV
from sklearn.ensemble import GradientBoostingClassifier

param_grid = 'learning_rate': [0.1, 0.01, 0.001],
              'max_depth': [4, 6],
              'min_samples_leaf': [9, 17],
              'max_features': [0.3, 0.1]

est = GradientBoostingClassifier(n_estimators=3000)
# this may take some minutes
gs_cv = GridSearchCV(est, param_grid, scoring='f1', n_jobs=-1, verbose=1, pre_dispatch=5).fit(X.values, y)

# best hyperparameter setting
print 'Best hyperparameters: %r' % gs_cv.best_params_

数据集 X 是 100 万行 * 245 个特征。我在接近 32 个内核的机器上运行。运行上述代码时出现以下错误,

error                                     Traceback (most recent call last)
<ipython-input-22-cb545fec9989> in <module>()
      9 est = GradientBoostingClassifier(n_estimators=3000)
     10 # this may take some minutes
---> 11 gs_cv = GridSearchCV(est, param_grid, scoring='f1', n_jobs=-1, verbose=1, pre_dispatch=5).fit(X.values, y)
     12 
     13 # best hyperparameter setting

/var/webeng/opensource/aetna-anaconda/lib/python2.7/site-packages/sklearn/grid_search.pyc in fit(self, X, y)
    594 
    595         """
--> 596         return self._fit(X, y, ParameterGrid(self.param_grid))
    597 
    598 

/var/webeng/opensource/aetna-anaconda/lib/python2.7/site-packages/sklearn/grid_search.pyc in _fit(self, X, y, parameter_iterable)
    376                                     train, test, self.verbose, parameters,
    377                                     self.fit_params, return_parameters=True)
--> 378             for parameters in parameter_iterable
    379             for train, test in cv)
    380 

/var/webeng/opensource/aetna-anaconda/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in __call__(self, iterable)
    658                 # consumption.
    659                 self._iterating = False
--> 660             self.retrieve()
    661             # Make sure that we get a last message telling us we are done
    662             elapsed_time = time.time() - self._start_time

/var/webeng/opensource/aetna-anaconda/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in retrieve(self)
    510                 self._lock.release()
    511             try:
--> 512                 self._output.append(job.get())
    513             except tuple(self.exceptions) as exception:
    514                 try:

/var/webeng/opensource/aetna-anaconda/lib/python2.7/multiprocessing/pool.pyc in get(self, timeout)
    556             return self._value
    557         else:
--> 558             raise self._value
    559 
    560     def _set(self, i, obj):

error: 'i' format requires -2147483648 <= number <= 2147483647

当我使用 1000 行的子集运行相同的代码时,它可以工作。尝试了不同的 pre_dispatch 但仍然遇到问题。是因为数据大小还是其他原因?谢谢。

在 Python 2.7.9 上使用 sklearn 0.15.2

【问题讨论】:

无论i 是什么,它都比 32 位有符号整数大 - 它似乎与您的数据大小有关。另外,n_jobs 应该是 > 1 吗? 是的,我也是这么想的。将n_jobs 设为-1 表示您可以使用机器上的所有内核 X的尺寸是多少? X 的类别是什么?您是否尝试降低 n_estimators 的值?您是否尝试过 f1 之外的其他评分功能?您使用的是哪个后端?你试过 backend="threading" 吗? 如果您设置 n_jobs=32(或者您的核心数是多少),您会收到错误消息吗? 可能与此有关? github.com/scikit-learn/scikit-learn/issues/… 【参考方案1】:

我看到了 3 种可能的方法来解决这个问题:

1) 尝试将 sklearn 更新到最新版本

2) 尝试替换

from sklearn.grid_search import GridSearchCV

与:

from sklearn.model_selection import GridSearchCV

3) 如果您想在 GridSearchCV 中使用 n_jobs > 1,那么您必须使用 if __name__ == '__main__':

保护脚本

例如

if __name__ == '__main__':
    clf = MLPClassifier()
    my_param_grid = 'activation': ('tanh', 'relu')
    grid= model_selection.GridSearchCV(clf,   
    param_grid=my_param_grid,n_jobs=-1)
    grid.fit(X, y)

考虑完成所有 3 个步骤

【讨论】:

使用所有三个步骤时,我仍然收到相同的“BrokenProcessPool”错误。我在 Windows 机器上

以上是关于GridsearchCV sklearn 中的错误的主要内容,如果未能解决你的问题,请参考以下文章

Sklearn GridSearchCV 的参数无效

GridSearchCV(sklearn)中的多个估计器

GridSearchCV/RandomizedSearchCV 与 sklearn 中的 partial_fit

如何在 python 中的 sklearn 中获取 GridSearchCV 中的选定功能

GridSearchCV 的 sklearn 中的自定义“k 精度”评分对象

什么是 _passthrough_scorer 以及如何更改 GridsearchCV (sklearn) 中的计分器?