Sou iniciante em ciência de dados e não entendo a diferença entre fit
e fit_transform
métodos no scikit-learn. Alguém pode simplesmente explicar por que precisamos transformar dados?
O que significa ajustar modelo em dados de treinamento e transformar em dados de teste? Significa, por exemplo, converter variáveis categóricas em números no trem e transformar um novo conjunto de recursos para testar dados?
python
scikit-learn
Kaggle
fonte
fonte
fit
notraining dataset
e usar otransform
método onboth
- o conjunto de dados de treinamento e o conjunto de dados de testeRespostas:
Para centralizar os dados (faça com que tenha média zero e erro padrão da unidade), você subtrai a média e depois divide o resultado pelo desvio padrão.
Você faz isso no conjunto de dados de treinamento. Mas então você deve aplicar a mesma transformação ao seu conjunto de testes (por exemplo, na validação cruzada) ou a exemplos recém-obtidos antes da previsão. Mas você precisa usar os mesmos dois parâmetros e (valores) usados para centralizar o conjunto de treinamento.σμ σ
Portanto, toda transformação de sklearnμ σ
fit()
apenas calcula os parâmetros (por exemplo, e no caso do StandardScaler ) e os salva como um estado interno de objetos. Posteriormente, você pode chamar seu método para aplicar a transformação a um conjunto específico de exemplos.σtransform()
fit_transform()
une essas duas etapas e é usado para o ajuste inicial dos parâmetros no conjunto de treinamento , mas também retorna um transformado . Internamente, apenas chama primeiro e depois os mesmos dados.x ′fit()
transform()
fonte
get_params()
coef_
(ou seja, inclinação e interceptação), não os retornados porget_params()
(que, em vez disso, retorna o conjunto de argumentos do construtor de modelo com seus valores associados).fit_transform()
pois isso não nos permitirá acessar o estado de objetos internos, transformar exemplos subsequentes com os mesmos parâmetros que foram obtidosfit()
no conjunto de dados inicial? Isso ocorre, por exemplo, quando você tem um conjunto de dados de teste e deseja transformar o conjunto de testes para passá-lo ao seu classificador treinado.t.fit_transform(train_data)
,t
está instalado, para que você possa usá-lo com segurançat.transform(test_data)
.A seguinte explicação é baseada na
fit_transform
daImputer
classe, mas a idéia é a mesma parafit_transform
outras classes scikit_learn gostoMinMaxScaler
.transform
substitui os valores ausentes por um número. Por padrão, esse número é o meio das colunas de alguns dados que você escolher. Considere o seguinte exemplo:Agora, o imputador aprendeu a usar uma média (1 + 8) / 2 = 4,5 para a primeira coluna e média (2 + 3 + 5,5) / 3 = 3,5 para a segunda coluna, quando aplicada a dados de duas colunas:
Nós temos
Portanto,
fit
o imputador calcula as médias das colunas de alguns dados etransform
aplica esses meios a alguns dados (que substitui apenas os valores ausentes pelos médios). Se esses dois dados forem os mesmos (ou seja, os dados para calcular as médias e os dados aos quais são aplicadas), você poderá usar ofit_transform
que é basicamente afit
seguido por atransform
.Agora suas perguntas:
"Por várias razões, muitos conjuntos de dados do mundo real contêm valores ausentes, geralmente codificados como espaços em branco, NaNs ou outros espaços reservados. Esses conjuntos de dados, no entanto, são incompatíveis com os estimadores do scikit-learn que assumem que todos os valores em uma matriz são numéricos" ( fonte )
O
fit
de um imputador não tem nada a ver com ofit
usado no ajuste do modelo. Portanto, o uso do imputerfit
nos dados de treinamento apenas calcula as médias de cada coluna de dados de treinamento. O usotransform
de dados de teste substitui os valores ausentes dos dados de teste por meios que foram calculados a partir dos dados de treinamento.fonte
Nos termos do leigo, fit_transform significa fazer algum cálculo e depois fazer a transformação (por exemplo, calcular as médias das colunas de alguns dados e, em seguida, substituir os valores ausentes). Portanto, para o conjunto de treinamento, você precisa calcular e fazer a transformação.
Mas, para o conjunto de testes, o aprendizado de máquina aplica a previsão com base no que foi aprendido durante o conjunto de treinamento e, portanto, não precisa ser calculado, apenas realiza a transformação.
fonte
Esses métodos são usados para transformações de conjuntos de dados no scikit-learn:
Vamos dar um exemplo para dimensionar valores em um conjunto de dados:
Aqui, o método de ajuste , quando aplicado ao conjunto de dados de treinamento, aprende os parâmetros do modelo (por exemplo, média e desvio padrão). Em seguida, precisamos aplicar o método de transformação no conjunto de dados de treinamento para obter o conjunto de dados de treinamento transformado (em escala). Também podemos executar essas duas etapas em uma etapa aplicando fit_transform no conjunto de dados de treinamento.
Então, por que precisamos de 2 métodos separados - ajustar e transformar ?
Na prática, precisamos ter um conjunto de dados de treinamento e teste separado e é aí que ter um método de ajuste e transformação separado ajuda. Aplicamos o ajuste no conjunto de dados de treinamento e usamos o método de transformação em ambos - o conjunto de dados de treinamento e o conjunto de dados de teste. Assim, o treinamento e o conjunto de dados de teste são transformados (escalados) usando os parâmetros do modelo que foram aprendidos ao aplicar o método de ajuste ao conjunto de dados de treinamento.
Código de exemplo:
fonte
Esta não é uma resposta técnica, mas espero que seja útil criar nossa intuição:
Em primeiro lugar, todos os estimadores são treinados (ou "em forma") em alguns dados de treinamento. Essa parte é bastante direta.
Segundo, todos os estimadores do scikit-learn podem ser usados em um pipeline e a idéia com um pipeline é que os dados fluam através do pipeline. Uma vez ajustados em um nível específico no pipeline, os dados são transmitidos para o próximo estágio no pipeline, mas obviamente os dados precisam ser alterados (transformados) de alguma maneira; caso contrário, você não precisaria desse estágio no pipeline. Portanto, transformar é uma maneira de transformar os dados para atender às necessidades do próximo estágio no pipeline.
Se você não estiver usando um pipeline, ainda acho útil pensar nessas ferramentas de aprendizado de máquina dessa maneira, porque mesmo o classificador mais simples ainda está executando uma função de classificação. Toma como entrada alguns dados e produz uma saída. Este também é um pipeline; apenas um muito simples.
Em resumo, o fit realiza o treinamento, transforma os dados no pipeline para transformá- los no próximo estágio do pipeline, e o fit_transform realiza o ajuste e a transformação em uma etapa possivelmente otimizada.
fonte
Ao aplicar as transformações que você está tentando fazer seus dados para se comportar normalmente, por exemplo, se você tiver duas variáveis e Ambas as medidas as distâncias, mas possui as unidades como centímetros e tem as unidades em Quilômetros de modo a fim de comparar estes dois você tem que convertê-los para as mesmas unidades ... assim Transformar está fazendo um comportamento semelhante ou fazendo-se comportar como uma distribuição normalV1 V2 V1 V2
Chegando a outra pergunta, primeiro você constrói o modelo no conjunto de treinamento (o modelo aprende os padrões ou o comportamento de seus dados no conjunto de treinamento) e, quando você executa o mesmo modelo no conjunto de teste, ele tenta identificar os padrões ou comportamentos semelhantes uma vez identificado, tira suas conclusões e dá resultados de acordo com os dados de treinamento
fonte
Considere uma tarefa que requer a normalização dos dados. Por exemplo, podemos usar uma normalização min-max ou normalização do escore z. Existem alguns parâmetros inerentes ao modelo. Os valores mínimo e máximo na normalização min-max e a média e desvio padrão na normalização do escore z. A função fit () calcula os valores desses parâmetros.
A função de transformação aplica os valores dos parâmetros nos dados reais e fornece o valor normalizado.
A função fit_transform () executa as duas na mesma etapa.
Observe que o mesmo valor é obtido, seja em duas etapas ou em uma única etapa.
fonte
"fit" calcula a média e o padrão para serem usados em redimensionamentos posteriores . (apenas uma computação), nada é dado a você.
"transform" usa uma média e std previamente calculadas para dimensionar automaticamente os dados (subtrair a média de todos os valores e depois dividi-la por std).
"fit_transform" faz as duas coisas ao mesmo tempo. Então você pode fazer isso com 1 linha de código em vez de 2.
Agora vamos ver na prática:
Para o conjunto de treinamento X , fazemos "fit_transform" porque precisamos calcular mean e std e, em seguida, usá-lo para dimensionar automaticamente os dados. Para o conjunto de testes X , bem, já temos a média e o padrão, portanto, apenas fazemos a parte "transformar".
É super simples. Você está indo muito bem. Continue seu bom trabalho meu amigo :-)
fonte