Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Estimador Final | Pipelines
Introdução ao Aprendizado de Máquina com Python

Estimador Final

Deslize para mostrar o menu

Pipeline foi utilizado anteriormente para pré-processamento, mas seu verdadeiro propósito é encadear o pré-processamento com um preditor final. A última etapa em um pipeline pode ser qualquer estimador (normalmente um modelo) que produza previsões.

Note
Nota

Ao chamar .fit(), cada transformador executa .fit_transform(). Ao chamar .predict(), o pipeline utiliza .transform() antes de enviar os dados para o estimador final. Isso é necessário porque novos dados devem ser transformados exatamente como os dados de treinamento.

Por que .transform()?

Usar .fit_transform() em novos dados pode alterar as codificações (por exemplo, em OneHotEncoder), criando colunas incompatíveis e previsões não confiáveis. .transform() garante pré-processamento consistente, ignorando categorias não vistas e mantendo a mesma ordem das colunas.

Aqui está o conjunto de dados original antes de qualquer transformação. Esses dados brutos são o ponto de partida para o processo de transformação. Nenhuma codificação ou pré-processamento foi aplicada ainda—cada linha mostra uma instância com sua característica de cor como uma string. Estes são os dados que serão transformados usando etapas de pré-processamento no pipeline.

Esta tabela mostra o conjunto de dados antes da codificação one-hot. A coluna Color é categórica—ela contém valores em formato de texto em vez de números. Você irá transformar essa coluna em colunas binárias separadas no próximo passo usando a codificação one-hot, que é essencial para que a maioria dos modelos de machine learning processe dados categóricos corretamente.

Veja como ficam os dados de treinamento após a codificação one-hot:

A tabela abaixo mostra o conjunto de dados após a aplicação da codificação one-hot. A coluna original Color foi substituída por colunas binárias separadas—Color_Red, Color_Blue e Color_Green. Cada coluna indica se a instância possui aquela cor específica (1) ou não (0).

Observe que a coluna original Color foi substituída por três colunas separadas: Color_Red, Color_Blue e Color_Green. Cada coluna indica se uma cor específica está presente para aquela instância, utilizando 1 para sim e 0 para não. Essa transformação é chamada de one-hot encoding.

Essa alteração é fundamental para modelos de aprendizado de máquina, pois a maioria dos algoritmos não consegue trabalhar diretamente com dados textuais ou categóricos. Ao converter categorias em colunas binárias separadas, você fornece ao modelo características numéricas claras que podem ser usadas para aprender padrões e fazer previsões. Essa abordagem também evita que o modelo assuma qualquer relação ordinal entre as categorias originais, o que poderia levar a conclusões incorretas.

Aqui estão as novas instâncias para prever:

Aqui estão os novos dados nos quais você deseja fazer previsões. Este é o input bruto—o estado 'antes'—exatamente como aparece antes de qualquer transformação ou pré-processamento. O pipeline irá transformar esses dados para corresponder ao formato utilizado durante o treinamento antes de realizar as previsões.

O próximo passo é transformar essas novas instâncias utilizando o codificador ajustado anteriormente. Isso garante que os novos dados sejam processados da mesma forma que os dados de treinamento, assegurando consistência e previsões confiáveis do modelo.

Se .fit_transform() fosse aplicado a novas instâncias, o OneHotEncoder poderia gerar colunas em uma ordem diferente ou até mesmo introduzir novas colunas. Isso faria com que os novos dados fossem transformados de forma inconsistente com o conjunto de treinamento, tornando as previsões não confiáveis.

Se você usar .fit_transform() em novos dados em vez de .transform(), o codificador tratará os novos dados como se estivesse vendo-os pela primeira vez. Isso faz com que:

  • Reaprenda as categorias a partir dos novos dados;
  • Altere a ordem das colunas com base no novo conjunto de categorias;
  • Adicione uma nova coluna para qualquer categoria não vista anteriormente, como 'Color_Yellow' neste caso.

Isso cria uma incompatibilidade entre os dados de treinamento e de predição, tornando as previsões não confiáveis e podendo causar erros no seu pipeline.

Observe a diferença entre a transformação incorreta e a correta. A tabela com a transformação incorreta inclui uma nova coluna (Color_Yellow) e altera a ordem das colunas em relação aos dados de treinamento. Isso quebra a consistência entre o treinamento e a previsão:

  • O modelo espera as mesmas colunas e na mesma ordem do treinamento;
  • Novas colunas ou colunas reordenadas confundem o modelo, levando ao uso de atributos incorretos;
  • As previsões tornam-se não confiáveis porque a estrutura de entrada não corresponde ao que o modelo aprendeu.

Sempre garanta que novos dados sejam transformados com .transform() após o ajuste, para que as colunas e a ordem permaneçam consistentes. Isso é essencial para previsões precisas e confiáveis.

No entanto, ao usar .transform(), garante-se que os novos dados sejam codificados exatamente como os dados de treinamento, ignorando categorias não vistas durante o treinamento:

Ao utilizar .transform() em novos dados, apenas as colunas do treinamento são incluídas na saída. Quaisquer categorias não vistas durante o treinamento—como 'Yellow'—são ignoradas. Isso garante que os novos dados correspondam à estrutura esperada pelo modelo, sem colunas extras ou ausentes.

Comparação das três tabelas:

  • Os dados originais de treinamento (após one-hot encoding) possuem colunas para Color_Red, Color_Blue e Color_Green;
  • Os novos dados transformados incorretamente (usando .fit_transform()) adicionam uma coluna Color_Yellow e removem Color_Green, alterando a ordem e a estrutura das colunas;
  • Os novos dados transformados corretamente (usando .transform()) mantêm as mesmas colunas e ordem do conjunto de treinamento, com zeros para categorias não vistas como Yellow.

O uso de .transform() é a abordagem correta porque garante que os novos dados sejam processados exatamente da mesma forma que os dados de treinamento. Isso assegura que o modelo receba os dados no formato esperado, evitando erros e tornando as previsões confiáveis.

Adicionando o Estimador Final

Basta adicionar o modelo como o último passo do pipeline:

pipe = make_pipeline(
    ct,
    SimpleImputer(strategy='most_frequent'),
    StandardScaler(),
    KNeighborsClassifier()
)
pipe.fit(X, y)
pipe.predict(X_new)

Isso permite que todo o fluxo de trabalho—pré-processamento + predição—seja executado com uma única chamada.

12345678910111213141516171819202122232425262728293031323334353637
from sklearn.pipeline import make_pipeline from sklearn.compose import ColumnTransformer from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier import pandas as pd # Example data data = pd.DataFrame({ 'color': ['red', 'blue', 'green'], 'value': [1, 2, 3] }) labels = [0, 1, 0] # Define a simple column transformer (placeholder for real preprocessing) ct = ColumnTransformer([ ('imputer', SimpleImputer(strategy='most_frequent'), ['color']) ]) # --- Before: Pipeline with only preprocessing steps --- # This pipeline only transforms the data; it cannot make predictions. pipeline_preprocessing = make_pipeline( ct, StandardScaler() ) # pipeline_preprocessing.fit(data) # Only fits transformers, no estimator at the end # --- After: Pipeline with a final estimator --- # Now the pipeline ends with a model, so it can fit and predict. pipeline_full = make_pipeline( ct, StandardScaler(), KNeighborsClassifier() ) pipeline_full.fit(data, labels) predictions = pipeline_full.predict(data) print("Predictions:", predictions)

Adicionar o estimador final como o último passo transforma seu pipeline em um fluxo de trabalho completo de ponta a ponta. Em vez de apenas preparar os dados, o pipeline agora realiza tanto o pré-processamento quanto a predição em um único objeto. Isso significa que é possível chamar fit() e predict() diretamente no pipeline, e ele aplicará automaticamente todas as etapas de pré-processamento antes de fazer as previsões.

Essa abordagem é importante porque:

  • Garante que todos os dados sejam processados exatamente da mesma forma tanto no treinamento quanto na predição;
  • Reduz o risco de erros, como esquecer uma etapa de pré-processamento ao prever novos dados;
  • Deixa o código mais limpo e fácil de manter, já que todo o fluxo de trabalho é gerenciado em um só lugar.

Ao encadear o pré-processamento e a modelagem, você assegura consistência, confiabilidade e simplicidade em seus projetos de aprendizado de máquina.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 5

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Seção 3. Capítulo 5
some-alt