¿Cómo uso un TimeSeriesSplit con un objeto GridSearchCV para ajustar un modelo en scikit-learn?

He buscado en los documentos de TimeSeriesSplit para TimeSeriesSplit y en los documentos para la validación cruzada, pero no he podido encontrar un ejemplo funcional.

Estoy usando la versión 0.19 de sklearn.

Esta es mi configuración

 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) 

da:

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

Si lo bash

 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) 

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

Me sale el problema: GridSearchCV está intentando llamar a len(cv) pero my_cv es un iterador sin longitud. Sin embargo, los documentos para el estado GridSearchCV puedo usar un

int, generador de validación cruzada o un iterable, opcional

Intenté usar TimeSeriesSplit sin .split(X) pero aún no funcionó.

Estoy seguro de que estoy pasando por alto algo simple, gracias !!

Resulta que el problema era que estaba usando GridSearchCV de sklearn.grid_search , que está en desuso. La importación de GridSearchCV desde sklearn.model_selection resolvió el problema:

 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) 

da:

 GridSearchCV(cv=, 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)