web-dev-qa-db-fra.com

Comment utiliser un TimeSeriesSplit avec un objet GridSearchCV pour régler un modèle dans scikit-learn?

J'ai recherché sklearn docs for TimeSeriesSplit et docs for cross-validation mais je n'ai pas pu trouver d'exemple de travail.

J'utilise la version 0.19 de sklearn.

Ceci 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 j'essaye:

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)

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

J'ai le problème: GridSearchCV essaie d'appeler len(cv) mais my_cv Est un itérateur sans longueur. Cependant, l'état docs pour GridSearchCV je peux utiliser un

int, générateur de validation croisée ou un itérable, facultatif

J'ai essayé d'utiliser TimeSeriesSplit sans la .split(X) mais cela ne fonctionnait toujours pas.

Je suis sûr que j'oublie quelque chose de simple, merci !!

19
cd98

Il s'avère que le problème était que j'utilisais GridSearchCV de sklearn.grid_search, qui est obsolète. Importation de GridSearchCV depuis sklearn.model_selection a 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])

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

tscv = TimeSeriesSplit(n_splits=2)
gsearch = GridSearchCV(estimator=model, cv=tscv,
                        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)
17
cd98