sklearn: validación cruzada definida por el usuario para datos de series de tiempo

Estoy tratando de resolver un problema de aprendizaje automático. Tengo un conjunto de datos específico con elementos de series de tiempo . Para este problema estoy usando la conocida biblioteca de python – sklearn . Hay muchos iteradores de validación cruzada en esta biblioteca. También hay varios iteradores para definir la validación cruzada. El problema es que realmente no sé cómo definir una validación cruzada simple para series de tiempo. Aquí hay un buen ejemplo de lo que estoy tratando de obtener:

Supongamos que tenemos varios períodos (años) y queremos dividir nuestro conjunto de datos en varios fragmentos de la siguiente manera:

 data = [1, 2, 3, 4, 5, 6, 7] train: [1] test: [2] (or test: [2, 3, 4, 5, 6, 7]) train: [1, 2] test: [3] (or test: [3, 4, 5, 6, 7]) train: [1, 2, 3] test: [4] (or test: [4, 5, 6, 7]) ... train: [1, 2, 3, 4, 5, 6] test: [7] 

Realmente no puedo entender cómo crear este tipo de validación cruzada con las herramientas de sklearn. Probablemente debería usar PredefinedSplit de sklearn.cross_validation así:

 train_fraction = 0.8 train_size = int(train_fraction * X_train.shape[0]) validation_size = X_train.shape[0] - train_size cv_split = cross_validation.PredefinedSplit(test_fold=[-1] * train_size + [1] * validation_size) 

Resultado:

 train: [1, 2, 3, 4, 5] test: [6, 7] 

Pero todavía no es tan bueno como una división de datos anterior

Puede obtener las divisiones de validación cruzada deseadas sin utilizar sklearn . Aquí un ejemplo

 import numpy as np from sklearn.svm import SVR from sklearn.feature_selection import RFECV # Generate some data. N = 10 X_train = np.random.randn(N, 3) y_train = np.random.randn(N) # Define the splits. idxs = np.arange(N) cv_splits = [(idxs[:i], idxs[i:]) for i in range(1, N)] # Create the RFE object and compute a cross-validated score. svr = SVR(kernel="linear") rfecv = RFECV(estimator=svr, step=1, cv=cv_splits) rfecv.fit(X_train, y_train) 

Mientras tanto, se agregó a la biblioteca: http://scikit-learn.org/stable/modules/cross_validation.html#time-series-split

Ejemplo del documento:

 >>> from sklearn.model_selection import TimeSeriesSplit >>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]]) >>> y = np.array([1, 2, 3, 4, 5, 6]) >>> tscv = TimeSeriesSplit(n_splits=3) >>> print(tscv) TimeSeriesSplit(n_splits=3) >>> for train, test in tscv.split(X): ... print("%s %s" % (train, test)) [0 1 2] [3] [0 1 2 3] [4] [0 1 2 3 4] [5]