GridSearchCV: "TypeError: 'StratifiedKFold' object is not iterable"
grid-search, pandas, scikit-learn, sklearn-pandas
Solution
I had exactly the same problem. The solution that worked for me is to replace:
from sklearn.grid_search import GridSearchCV
with
from sklearn.model_selection import GridSearchCV
Then it should work fine.
Problem
I want to perform GridSearchCV in a RandomForestClassifier, but data is not balanced, so I use 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) ``` But I get an error: ``` 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 ``` When I write `cv=StratifiedKFold(y_train)` I have `ValueError: The number of folds must be of Integral type.` But when I write `cv=5, it works. I don't understand what is wrong with StratifiedKFold