2017-10-13 9 views
3

J'ai recherché le sklearn docs for TimeSeriesSplit et le docs for cross-validation mais je n'ai pas pu trouver un exemple de travail. J'utilise Sklearn Version 0.19.Comment utiliser une TimeSeriesSplit avec un objet GridSearchCV pour ajuster un modèle dans scikit-learn?

C'est ma configuration

import xgboost as xgb 
from sklearn.model_selection import TimeSeriesSplit 
from sklearn.grid_search import GridSearchCV 
import numpy as np 
X = np.array([[4, 5, 6, 1, 0, 2], [3.1, 3.5, 1.0, 2.1, 8.3, 1.1]]).T 
y = np.array([1, 6, 7, 1, 2, 3]) 
tscv = TimeSeriesSplit(n_splits=2) 
for train, test in tscv.split(X): 
    print(train, test) 

donne:

[0 1] [2 3] 
[0 1 2 3] [4 5] 

Si je tente:

model = xgb.XGBRegressor() 
param_search = {'max_depth' : [3, 5]} 

my_cv = TimeSeriesSplit(n_splits=2).split(X) 
gsearch = GridSearchCV(estimator=model, cv=my_cv, 
         param_grid=param_search) 
gsearch.fit(X, y) 

donne: TypeError: object of type 'generator' has no len()

je reçois le problème: GridSearchCV est t riant pour appeler len(cv) mais my_cv est un itérateur sans longueur. Cependant, l'état docs for GridSearchCV je peux utiliser un

int, générateur de validation croisée ou un itératives, en option

J'ai essayé d'utiliser TimeSeriesSplit sans .split(X) mais il ne fonctionne toujours pas.

Je suis sûr que je néglige quelque chose de simple, merci !!

+1

Essayez d'utiliser 'my_cv = [(train, test) pour le train, le test en TimeSeriesSplit (n_splits = 2) .split (X) ] ' –

+0

qui fonctionne, merci! Mais la fonction ne devrait-elle pas fonctionner avec un itérateur? Quand le nombre d'observations est grand (pire si le nombre de plis est grand) je préfère ne pas garder ces grands tableaux en mémoire si possible – cd98

+1

Oui, il devrait le faire. Vous devriez signaler un problème sur la page de github de scikit-learn. –

Répondre

4

Il s'avère que le problème était que j'utilisais GridSearchCV de sklearn.grid_search, ce qui est obsolète. Importation GridSearchCV de sklearn.model_selection résolu le problème:

import xgboost as xgb 
from sklearn.model_selection import TimeSeriesSplit, GridSearchCV 
import numpy as np 
X = np.array([[4, 5, 6, 1, 0, 2], [3.1, 3.5, 1.0, 2.1, 8.3, 1.1]]).T 
y = np.array([1, 6, 7, 1, 2, 3]) 
tscv = TimeSeriesSplit(n_splits=2) 

model = xgb.XGBRegressor() 
param_search = {'max_depth' : [3, 5]} 

my_cv = TimeSeriesSplit(n_splits=2).split(X) 
gsearch = GridSearchCV(estimator=model, cv=my_cv, 
         param_grid=param_search) 
gsearch.fit(X, y) 

donne:

GridSearchCV(cv=<generator object TimeSeriesSplit.split at 0x11ab4abf8>, 
     error_score='raise', 
     estimator=XGBRegressor(base_score=0.5, colsample_bylevel=1, colsample_bytree=1, gamma=0, 
     learning_rate=0.1, max_delta_step=0, max_depth=3, 
     min_child_weight=1, missing=None, n_estimators=100, nthread=-1, 
     objective='reg:linear', reg_alpha=0, reg_lambda=1, 
     scale_pos_weight=1, seed=0, silent=True, subsample=1), 
     fit_params=None, iid=True, n_jobs=1, 
     param_grid={'max_depth': [3, 5]}, pre_dispatch='2*n_jobs', 
     refit=True, return_train_score=True, scoring=None, verbose=0)