2016-10-26 7 views
3

möchte ich GridSearchCV in einem RandomForestClassifier auszuführen, die Daten sind jedoch nicht ausgeglichen, so dass ich StratifiedKFold:GridSearchCV mit 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) 

Aber ich erhalte eine Fehlermeldung:

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 

Wenn ich schreibe cv=StratifiedKFold(y_train) Ich habe ValueError: The number of folds must be of Integral type. Aber wenn ich `cv = 5 schreibe, funktioniert es.

Ich verstehe nicht, was mit StratifiedKFold falsch ist

Antwort

0

Die api in der neuesten Version geändert. Sie haben y übergeben und jetzt übergeben Sie nur die Nummer, wenn Sie das stratifiedKFold-Objekt erstellen. Du gibst das y später weiter.

+0

Ich schreibe 'cv = StratifiedKFold (10)' und 'erhalten Typeerror: 'StratifiedKFold' Objekt ist nicht iterable' Wann sollte ich y passieren? – user183897

+0

In der aktuellen Version importieren Sie sklearn.model_selection.StratifiedKFold. Und dann können Sie cv = StratifiedKFold (10) tun und es sollte kein Fehler sein. Vielleicht importieren Sie jedoch aus dem vorherigen Modul, das aus Kompatibilitätsgründen noch existiert, bis Version 20. – simon

+0

Könnte ich noch eine Frage stellen? Ich habe von dieser Seite http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-learn Datei scikit_learn-0.18-cp34-cp34m-win32.whl heruntergeladen, installiert, aber jetzt bekomme ich 'ImportError: DLL Laden fehlgeschlagen:% 1 ist keine gültige Win32-Anwendung. '. Was ist falsch? – user183897

0

Es scheint, dass cv=StratifiedKFold()).fit(X_train, y_train) sollte hier cv=StratifiedKFold()).split(X_train, y_train).

+0

Das hat nichts mit dem Fehler zu tun.Diese Zeile: clf = GridSearchCV (rfc, param_grid = param_grid, cv = StratifiedKFold()). fit (X_train, y_train) definiert nur das Objekt clf und ruft dann die Fit-Methode auf, um das clf zu trainieren/anzupassen. – sera

+0

@rll auch erwähnt, dass Fit sollte mit Split ersetzt werden. – ebrahimi

0

Das Problem eine API-Änderung ist wie in anderen Antworten erwähnt geändert werden, aber die Antworten deutlicher sein könnten.

Die cv Parameter-Dokumentation heißt es:

cv : int, cross-validation generator or an iterable, optional

Determines the cross-validation splitting strategy. Possible inputs for cv are:

  • None, to use the default 3-fold cross-validation, integer, to specify the number of folds.

  • An object to be used as a cross-validation generator.

  • An iterable yielding train/test splits.

For integer/None inputs, if y is binary or multiclass, StratifiedKFold used. If the estimator is a classifier or if y is neither binary nor multiclass, KFold is used.

Also, was auch immer der cross validation strategy verwendet, alles, was benötigt wird, ist der Generator, um die Funktion split verwenden, wie vorgeschlagen:

kfolds = StratifiedKFold(5) 
clf = GridSearchCV(estimator, parameters, scoring=qwk, cv=kfolds.split(xtrain,ytrain)) 
clf.fit(xtrain, ytrain) 
2

Ich hatte genau das gleiche Problem.

Die Lösung, die für mich gearbeitet zu ersetzen:

from sklearn.grid_search import GridSearchCV 

mit

from sklearn.model_selection import GridSearchCV 

Dann sollte es funktionieren.

0

In '0.18.1' Version von Sklearn.

GridSearchCV(estimator, param=param_grid, c=5)

implementiert eine StratifiedKFold mit 5 Splits.

Dokumentation:

> cv : int, cross-validation generator or an iterable, optional 
>   Determines the cross-validation splitting strategy. 
>   Possible inputs for cv are: 
>   - None, to use the default 3-fold cross validation, 
>   - integer, to specify the number of folds in a `(Stratified)KFold`, 
>   - An object to be used as a cross-validation generator. 
>   - An iterable yielding train, test splits. 
Verwandte Themen