GridSearchCV:"TypeError:'StratifiedKFold'对象不可迭代"

use*_*897 4 pandas scikit-learn grid-search sklearn-pandas

我想在RandomForestClassifier中执行GridSearchCV,但数据不平衡,所以我使用StratifiedKFold:

from sklearn.model_selection import StratifiedKFold
from sklearn.grid_search import GridSearchCV
from sklearn.ensemble import RandomForestClassifier

param_grid = {'n_estimators':[10, 30, 100, 300], "max_depth": [3, None],
          "max_features": [1, 5, 10], "min_samples_leaf": [1, 10, 25, 50], "criterion": ["gini", "entropy"]}

rfc = RandomForestClassifier()

clf = GridSearchCV(rfc, param_grid=param_grid, cv=StratifiedKFold()).fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-597-b08e92c33165> in <module>()
     9 rfc = RandomForestClassifier()
     10 
---> 11 clf = GridSearchCV(rfc, param_grid=param_grid, cv=StratifiedKFold()).fit(X_train, y_train)

c:\python34\lib\site-packages\sklearn\grid_search.py in fit(self, X, y)
    811 
    812         """
--> 813         return self._fit(X, y, ParameterGrid(self.param_grid))

c:\python34\lib\site-packages\sklearn\grid_search.py in _fit(self, X, y, parameter_iterable)
    559                                     self.fit_params, return_parameters=True,
    560                                     error_score=self.error_score)
--> 561                 for parameters in parameter_iterable
    562                 for train, test in cv)

c:\python34\lib\site-packages\sklearn\externals\joblib\parallel.py in __call__(self, iterable)
    756             # was dispatched. In particular this covers the edge
    757             # case of Parallel used with an exhausted iterator.
--> 758             while self.dispatch_one_batch(iterator):
    759                 self._iterating = True
    760             else:

c:\python34\lib\site-packages\sklearn\externals\joblib\parallel.py in dispatch_one_batch(self, iterator)
    601 
    602         with self._lock:
--> 603             tasks = BatchedCalls(itertools.islice(iterator, batch_size))
    604             if len(tasks) == 0:
    605                 # No more tasks available in the iterator: tell caller to stop.

c:\python34\lib\site-packages\sklearn\externals\joblib\parallel.py in __init__(self, iterator_slice)
    125 
    126     def __init__(self, iterator_slice):
--> 127         self.items = list(iterator_slice)
    128         self._size = len(self.items)

c:\python34\lib\site-packages\sklearn\grid_search.py in <genexpr>(.0)
    560                                     error_score=self.error_score)
    561                 for parameters in parameter_iterable
--> 562                 for train, test in cv)
    563 
    564         # Out is a list of triplet: score, estimator, n_test_samples

TypeError: 'StratifiedKFold' object is not iterable
Run Code Online (Sandbox Code Playgroud)

当我写作时cv=StratifiedKFold(y_train)我有ValueError: The number of folds must be of Integral type.但是当我写`cv = 5时,它有效.

我不明白StratifiedKFold有什么问题

mak*_*kis 6

我有完全相同的问题.对我有用的解决方案是替换:

from sklearn.grid_search import GridSearchCV
Run Code Online (Sandbox Code Playgroud)

from sklearn.model_selection import GridSearchCV
Run Code Online (Sandbox Code Playgroud)

那它应该工作正常.


rll*_*rll 5

这里的问题是其他答案中提到的 API 更改,但答案可能更明确。

cv参数文档状态:

cv : int、交叉验证生成器或可迭代的、可选的

确定交叉验证拆分策略。cv 的可能输入是:

  • 无,使用默认的 3 折交叉验证,整数,指定折叠数。

  • 用作交叉验证生成器的对象。

  • 一个可迭代的产生训练/测试分割。

对于整数/无输入,如果 y 是二进制或多类,则使用 StratifiedKFold。如果估计器是分类器或者 y 既不是二元类也不是​​多类,则使用 KFold。

因此,无论使用哪种交叉验证策略,所需要的只是使用函数提供生成器split,如建议的那样:

kfolds = StratifiedKFold(5)
clf = GridSearchCV(estimator, parameters, scoring=qwk, cv=kfolds.split(xtrain,ytrain))
clf.fit(xtrain, ytrain)
Run Code Online (Sandbox Code Playgroud)


sim*_*mon 0

最新版本的api发生了变化。您过去在创建 stratifiedKFold 对象时传递 y,现在只传递数字。你稍后会通过 y。