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 !!
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)