Aprender no fit, aplicar no transform
Um transformador é um estimador com uma segunda tarefa. fit(X) aprende números dos dados (uma média, um quantil, um vocabulário), guarda-os em atributos terminados em sublinhado e devolve self. transform(X) então aplica esses números guardados a quaisquer dados, novos ou antigos, sem olhar para eles para decidir nada. Essa separação é todo o ponto: os números são aprendidos uma vez nas linhas de treino, e as linhas de teste são apenas transformadas. Um winsorizador é um bom primeiro exemplo. fit aprende um quantil inferior e um superior por coluna, e transform limita com np.clip entre eles. Se transform recalculasse os quantis nos dados que recebe, cada conjunto seria limitado ao seu próprio intervalo e a informação do treino nunca chegaria ao teste. Herde de TransformerMixin e BaseEstimator e você ganha também fit_transform e a mecânica dos parâmetros.
Tabelas reais misturam números e categorias, então o scikit-learn oferece ColumnTransformer([(nome, transformador, colunas), ...]): cada ramo trata suas colunas e as saídas são coladas lado a lado. Aqui o ramo numérico é make_pipeline(Winsorizer(0.02, 0.98), StandardScaler()) e o categórico é OneHotEncoder(handle_unknown='ignore'), que transforma uma categoria desconhecida numa linha de zeros em vez de um erro. sparse_threshold=0 força um array denso. Para nomear as colunas de saída, cada passo precisa responder a get_feature_names_out, e por isso seu winsorizador deve implementá-lo: ele devolve os nomes recebidos. A regra de ouro é chamar fit_transform nas linhas de treino e só transform nas de teste. No painel de ações (26 símbolos, 10.296 linhas), o corte em 1.º de janeiro de 2023 deixa 5.564 linhas de treino e 4.732 de teste, e cerca de 2,2% dos valores de momentum do teste caem fora do intervalo 2%–98% do treino e são limitados aos limites do treino.
- Aprenda uma vez, aplique em qualquer lugar:
fitguarda números das linhas de treino,transformsó os aplica. - Um pré-processador, dois ramos:
ColumnTransformerenvia números e categorias para seus próprios passos;handle_unknown="ignore"sobrevive a categorias novas. - Implemente o contrato inteiro: um transformador que não sabe nomear suas colunas de saída quebra
get_feature_names_outpara todo o pipeline.
Lab: o que é avaliado
- O construtor5 pts
- Fit e transform20 pts
- Nomes de variáveis e pipelines10 pts
- O pré-processador de dois ramos15 pts
- Dividir por data10 pts
- Ajustar apenas no passado10 pts
- O estudo do painel30 pts