Aprender en fit, aplicar en transform
Un transformador es un estimador con una segunda tarea. fit(X) aprende números de los datos (una media, un cuantil, un vocabulario), los guarda en atributos que terminan en guion bajo y devuelve self. transform(X) aplica luego esos números guardados a cualquier dato, nuevo o viejo, sin mirarlo para decidir nada. Esa separación es todo el sentido: los números se aprenden una vez con las filas de entrenamiento, y las filas de prueba solo se transforman. Un winsorizador es un buen primer ejemplo. fit aprende un cuantil inferior y uno superior por columna, y transform recorta con np.clip entre ellos. Si transform recalculara los cuantiles con los datos que recibe, cada conjunto se recortaría a su propio rango y la información de entrenamiento nunca llegaría al conjunto de prueba. Herede de TransformerMixin y BaseEstimator y obtiene además fit_transform y el mecanismo de parámetros gratis.
Las tablas reales mezclan números y categorías, así que scikit-learn ofrece ColumnTransformer([(nombre, transformador, columnas), ...]): cada rama trata sus columnas y las salidas se pegan lado a lado. Aquí la rama numérica es make_pipeline(Winsorizer(0.02, 0.98), StandardScaler()) y la categórica OneHotEncoder(handle_unknown='ignore'), que convierte una categoría desconocida en una fila de ceros en vez de un error. sparse_threshold=0 fuerza un arreglo denso. Para nombrar las columnas de salida, cada paso debe responder a get_feature_names_out, por eso su winsorizador debe implementarlo: devuelve los nombres que recibió. La regla de oro es llamar a fit_transform con las filas de entrenamiento y solo a transform con las de prueba. En el panel de acciones (26 símbolos, 10.296 filas), el corte del 1 de enero de 2023 deja 5.564 filas de entrenamiento y 4.732 de prueba, y cerca del 2,2 % de los valores de momentum de prueba caen fuera del rango 2 %–98 % de entrenamiento y se recortan a los límites de entrenamiento.
- Aprender una vez, aplicar en todas partes:
fitguarda números con las filas de entrenamiento,transformsolo los aplica. - Un preprocesador, dos ramas:
ColumnTransformerenvía números y categorías a sus propios pasos;handle_unknown="ignore"resiste categorías nuevas. - Implemente el contrato completo: un transformador que no sabe nombrar sus columnas de salida rompe
get_feature_names_outpara todo el pipeline.
Lab: qué se califica
- El constructor5 pts
- Fit y transform20 pts
- Nombres de variables y pipelines10 pts
- El preprocesador de dos ramas15 pts
- Dividir por fecha10 pts
- Ajustar solo con el pasado10 pts
- El estudio del panel30 pts