División de Entrenamiento/Prueba y Validación Cruzada
El último tema sobre series temporales será la preparación de datos para entrenar y probar modelos de aprendizaje automático: división entrenamiento/prueba y validación cruzada.
Al dividir los datos de series temporales en conjuntos de entrenamiento y prueba, es importante tener en cuenta el aspecto temporal de los datos. A diferencia de otros tipos de conjuntos de datos, el muestreo aleatorio para la división no es adecuado para los datos de series temporales, ya que puede provocar fugas de datos y una evaluación sesgada del rendimiento del modelo.
El método más común para dividir los datos de series temporales es utilizar un punto fijo en el tiempo como punto de división entre los conjuntos de entrenamiento y de prueba. El conjunto de entrenamiento incluye todas las observaciones anteriores al punto de división, mientras que el conjunto de prueba incluye todas las observaciones posteriores al punto de división.
Por ejemplo, puede ser así:
12345678910111213import statsmodels.api as sm import pandas as pd # Load the dataset df = sm.datasets.get_rdataset('weather', 'nycflights13').data df['observation_time'] = pd.to_datetime(df.time_hour) df.drop(columns=['year', 'month', 'day', 'hour', 'time_hour'], inplace=True) print(df.head(10)) # Split data into training and test sets based on time train = df.loc[df['observation_time'] < '2013-08-01'] test = df.loc[df['observation_time'] >= '2013-08-01']
La validación cruzada funciona con la misma idea: dividir el conjunto de entrenamiento en dos partes (como antes) en cada iteración, teniendo en cuenta que el conjunto de validación siempre está por delante del conjunto de entrenamiento. En la primera iteración, se entrena el modelo candidato con los datos meteorológicos de enero a marzo y se valida con los datos de abril; en la siguiente iteración, se entrena con los datos de enero a abril y se valida con los datos de mayo, y así sucesivamente hasta el final del conjunto de entrenamiento. En total se realizan 5 iteraciones.
Veremos el validador cruzado de series temporales de la biblioteca scikit-learn
:
12345678910111213141516171819from sklearn.model_selection import TimeSeriesSplit import statsmodels.api as sm import pandas as pd # Load the dataset df = sm.datasets.get_rdataset('weather', 'nycflights13').data df['observation_time'] = pd.to_datetime(df.time_hour) df.drop(columns=['year', 'month', 'day', 'hour', 'time_hour'], inplace=True) df.head() # Create TimeSeriesSplit model tscv = TimeSeriesSplit(n_splits=5) # Split train and test sets for i, (train_index, test_index) in enumerate(tscv.split(df)): print(f'Fold {i}:') print(f' Train: index={train_index}') print(f' Test: index={test_index}')
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 3.33
División de Entrenamiento/Prueba y Validación Cruzada
Desliza para mostrar el menú
El último tema sobre series temporales será la preparación de datos para entrenar y probar modelos de aprendizaje automático: división entrenamiento/prueba y validación cruzada.
Al dividir los datos de series temporales en conjuntos de entrenamiento y prueba, es importante tener en cuenta el aspecto temporal de los datos. A diferencia de otros tipos de conjuntos de datos, el muestreo aleatorio para la división no es adecuado para los datos de series temporales, ya que puede provocar fugas de datos y una evaluación sesgada del rendimiento del modelo.
El método más común para dividir los datos de series temporales es utilizar un punto fijo en el tiempo como punto de división entre los conjuntos de entrenamiento y de prueba. El conjunto de entrenamiento incluye todas las observaciones anteriores al punto de división, mientras que el conjunto de prueba incluye todas las observaciones posteriores al punto de división.
Por ejemplo, puede ser así:
12345678910111213import statsmodels.api as sm import pandas as pd # Load the dataset df = sm.datasets.get_rdataset('weather', 'nycflights13').data df['observation_time'] = pd.to_datetime(df.time_hour) df.drop(columns=['year', 'month', 'day', 'hour', 'time_hour'], inplace=True) print(df.head(10)) # Split data into training and test sets based on time train = df.loc[df['observation_time'] < '2013-08-01'] test = df.loc[df['observation_time'] >= '2013-08-01']
La validación cruzada funciona con la misma idea: dividir el conjunto de entrenamiento en dos partes (como antes) en cada iteración, teniendo en cuenta que el conjunto de validación siempre está por delante del conjunto de entrenamiento. En la primera iteración, se entrena el modelo candidato con los datos meteorológicos de enero a marzo y se valida con los datos de abril; en la siguiente iteración, se entrena con los datos de enero a abril y se valida con los datos de mayo, y así sucesivamente hasta el final del conjunto de entrenamiento. En total se realizan 5 iteraciones.
Veremos el validador cruzado de series temporales de la biblioteca scikit-learn
:
12345678910111213141516171819from sklearn.model_selection import TimeSeriesSplit import statsmodels.api as sm import pandas as pd # Load the dataset df = sm.datasets.get_rdataset('weather', 'nycflights13').data df['observation_time'] = pd.to_datetime(df.time_hour) df.drop(columns=['year', 'month', 'day', 'hour', 'time_hour'], inplace=True) df.head() # Create TimeSeriesSplit model tscv = TimeSeriesSplit(n_splits=5) # Split train and test sets for i, (train_index, test_index) in enumerate(tscv.split(df)): print(f'Fold {i}:') print(f' Train: index={train_index}') print(f' Test: index={test_index}')
¡Gracias por tus comentarios!