Quais são as diferenças entre fit, transform, fit_transform e predict no sklearn ?

Quando começamos um projeto de ciência de dados, temos uma sequência de etapas para percorrer.

Primeiro, fazemos uma análise exploratório de dados (Exploratory Data Analysis – EDA), depois fazemos uma engenharia de atributos (Feature Engeneering – FE), depois fazemos a seleção dos atributos (Feature Selection -FS), após isto, fazemos a criação do modelo (Model Creation – MC) e por fim, colocamos o modelo em produção (Model Deployment – MD) para poder ser consumido.

A coluna de dados que queremos prever é chamada de coluna da variável dependente. As outras colunas são das variáveis independentes.

O nosso objetivo é criar um modelo que possa prever a variável dependente a partir das variáveis independentes.

Durante a etapa de criação do modelo, ainda podemos ter mais uma etapa de ajuste de hiperparâmetros.

Na etapa de pré-processamento de dados, temos o que chamamos de objetos que são os Transformers. Os Transformers são responsáveis por transformar o formato do dado.

Já na parte de treino, os objetos são o Models. Estes são responsáveis por gerar um modelo. Isto significa calcular os parâmetros e os pesos usados (como por exemplo, em redes neurais) pelos modelos gerados.

Como vamos na figura acima, a saída dos Transformers será usada como entrada para gerar os Models.

Abaixo seguem alguns exemplos de Transformers:

  • Standard Scaler -> Pega cada elemento da coluna e subtrai dele a média e divide pelo desvio padrão. É a conhecida estatística Z.
  • Min Max Scaler -> Pega cada elemento e subtrai do valor mínimo , e este resultado subtrai do valor máximo menos o valor mínimo.
  • PCA -> Análise de Componentes Principais (Principal Component Analisys).
  • Imputer -> Trata de dados faltantes.

Podemos também citar alguns exemplos de Models:

  • Linear Regression -> Regressão linear simples.
  • Logistic Regression -> Regressão logística.
  • Decision Tree -> Árvore de decisão.
  • Random Forest -> Random Forest.
  • AdaBoost -> AdaBoost.

Suponha que vamos querer usar o Min Max Scaler em todas as colunas numéricas de nossa base de dados. Isto significa, que para cada coluna, o Min Max Scaler vai ter que saber quem é o valor mínimo e o valor máximo daquela coluna, para poder fazer a transformação.

    \[novo \; x = (x - valor\; mínimo)/(valor\; máximo - valor\; mínimo)\]

Na parte de pré-processamento de dados, quando vamos calcular algo que será usado para fazer uma transformação, como o valor mínimo e o valor máximo no nosso exemplo, este cálculo é feito no método fit!

Depois que sabemos quais são o valor mínimo e o valor máximo em nosso exemplo, podemos pegar cada item da coluna que estamos aplicando o Scaler e fazer a transformação usando o método transform!

Se estivéssemos usando o Standard Scaler, então no fit estaríamos calculando a média ( \mu ) e o desvio padrão ( \sigma ) de uma coluna, e no transform estaríamos aplicando a fórmula:

    \[(x-\mu) / \sigma\]

Na respectiva coluna.

Suponha que em outra coluna, queremos preencher os dados faltantes. Para isso, podemos usar um Inputer Transformer. Se setarmos este transformer para usar a moda (valor que mais aparece na coluna) para preencher os dados faltantes, no fit, o transformer vai descobrir qual o dado é a moda, e no transform vai preencher as linhas da coluna que não possuem dados com o valor da moda.

E para que serve o método fit_transform ? Serve para fazer o fit e o transform com uma chamada só !

Após você fazer o tratamento dos dados, está na hora de seguir para o próximo passo no pipeline de machine learning. Está na hora de gerar o modelo !

Como entrada da geração do modelo, vamos fornecer os dados que foram transformados através do método transform, do passo de tratamento de dados.

Agora que estamos na parte de modelo, podemos fazer duas coisas: gerar o modelo e usar o modelo. Para gerar o modelo, vamos usar o método fit, e talvez seja por isso que as pessoas se confundem tanto, pois o mesmo nome foi usado para duas coisas diferentes. Quando trabalhamos no pré-processamento de dados, fit calcula alguns valores que serão importantes para a transformação, e quando chamamos o fit no parte de modelo, ele é usado para calcular os parâmetros e os pesos que serão usados nos modelos (caso o modelo use pesos, como é o caso de uma rede neural).

Quando um modelo está treinado, podemos usar o predict para fazer teste com os dados de teste (train_test_split() no sklearn), ou fornecer para ele dados novos para ele fazer a predição, que neste caso é chamado de inferência.

Sendo assim, podemos resumir a utilização dos métodos da seguinte forma:

fit()Treinamento
predict()Teste ou novos dados
Métodos usados para a fase de Modelo do pipeline de ML
fit() e transform()Treinamento
transform()Teste
Métodos usados para a fase de Pré-processamento do pipeline de ML

A pergunta que podemos nos fazer é: por que quando estamos fazendo pré-processamento, não usamos fit() ? Por que queremos fazer a transformação com os dados calculados do fit que foram obtidos com os dados de treino! Por que isso é importante ? Por que estaremos usando a mesma fórmula que usamos para fazer a transformação dos dados que serviram de entrada para treinar o modelo. Se usamos uma fórmula para treinar o modelo, e depois usamos outra para alterar os dados que vão ser entrada do modelo, então o modelo não terá uma boa performance, pois ele foi treinado com os dados segundo uma fórmula que não é a que foi usada.

Para ficar mais claro, suponha que em treinamento, usamos o fit e encontramos uma média igual a 10 e um desvio padrão de 3. Se calculássemos novamente a média e o desvio padrão nos dados de teste, e obtivéssemos valores diferentes, como por exemplo a média 5 e o desvio padrão 8, e usássemos estes valores para fazer a normalização da coluna, estaríamos aplicando uma outra fórmula a coluna. Seria como se estivéssemos usando outro tratamento para o mesmo. Mas, se o modelo foi treinado com uma fórmula em que a média era 10 e o desvio padrão era 3, como queremos que ele se saia bem se alterarmos estes valores ? Inclusive, se pudéssemos alterar estes valores, então poderíamos colocar qualquer valor e não precisaríamos pré-processar os dados para gerar os modelos ! Seria como se falássemos para um aluno que 2+2=4, mas na hora da prova disséssemos que 2+2=5. Não temo como o aluno se sair bem se não teve informação boa na aprendizagem, ou se eu ensinei uma coisa mas cobro outra totalmente diferente do que foi ensinado !

(baseado no vídeo)