sklearn scikit machine learning learn guide fit examples example python machine-learning scikit-learn

python - machine - scikit-learn validación cruzada splits personalizados para datos de series de tiempo



scikit learn guide (1)

Me gustaría usar el GridSearchCV de scikit-learn para determinar algunos parámetros de hipertexto para un modelo de bosque aleatorio. Mis datos dependen del tiempo y se parecen a

import pandas as pd train = pd.DataFrame({''date'': pd.DatetimeIndex([''2012-1-1'', ''2012-9-30'', ''2013-4-3'', ''2014-8-16'', ''2015-3-20'', ''2015-6-30'']), ''feature1'': [1.2, 3.3, 2.7, 4.0, 8.2, 6.5], ''feature2'': [4, 4, 10, 3, 10, 9], ''target'': [1,2,1,3,2,2]}) >>> train date feature1 feature2 target 0 2012-01-01 1.2 4 1 1 2012-09-30 3.3 4 2 2 2013-04-03 2.7 10 1 3 2014-08-16 4.0 3 3 4 2015-03-20 8.2 10 2 5 2015-06-30 6.5 9 2

¿Cómo puedo implementar la siguiente técnica de plegado de validación cruzada?

train:(2012, 2013) - test:(2014) train:(2013, 2014) - test:(2015)

Es decir, quiero utilizar 2 años de observaciones históricas para entrenar un modelo y luego probar su precisión en el año siguiente.


Solo tiene que pasar un iterable con los splits a GridSearchCV. Esta división debe tener el siguiente formato:

[ (split1_train_idxs, split1_test_idxs), (split2_train_idxs, split2_test_idxs), (split3_train_idxs, split3_test_idxs), ... ]

Para obtener los idx puedes hacer algo como esto:

groups = df.groupby(df.date.dt.year).groups # {2012: [0, 1], 2013: [2], 2014: [3], 2015: [4, 5]} sorted_groups = [value for (key, value) in sorted(groups.items())] # [[0, 1], [2], [3], [4, 5]] cv = [(sorted_groups[i] + sorted_groups[i+1], sorted_groups[i+2]) for i in range(len(sorted_groups)-2)]

Esto se ve así:

[([0, 1, 2], [3]), # idxs of first split as (train, test) tuple ([2, 3], [4, 5])] # idxs of second split as (train, test) tuple

Entonces puedes hacer:

GridSearchCV(estimator, param_grid, cv=cv, ...)