Diferença entre fit e fit_transform nos modelos scikit_learn?


110

Sou iniciante em ciência de dados e não entendo a diferença entre fite fit_transformmé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?



@sds A resposta acima fornece o link para esta pergunta.
Kaushal28

Nós aplicamos fitno training datasete usar o transformmétodo on both- o conjunto de dados de treinamento e o conjunto de dados de teste
Prakash Kumar

Respostas:


117

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.

x=xμσ

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 xxfit()transform()


11
Se você está procurando por um modelo que não seja o ideal, você pode optar por um modelo mais compacto, que combine com o seu estilo. quando você se encaixa, digamos uma regressão linear, por exemplo, quais parâmetros são ajustados no método de ajuste? Parâmetros de normalização ou parâmetros de modelo como inclinação e interceptação?
Kaggle

11
Quero dizer parâmetros internos para as transformações ( e no caso do StandardScaler). Qualquer que seja o método da transformação retorne. Veja este capítulo sobre imputação, por exemplo: scikit-learn.org/stable/modules/…σμσget_params()
K3 --- rnc

2
Meu comentário anterior está realmente errado. No caso de regressão linear, os parâmetros ajustados são coef_(ou seja, inclinação e interceptação), não os retornados por get_params()(que, em vez disso, retorna o conjunto de argumentos do construtor de modelo com seus valores associados).
K3 --- rnc

Ótima resposta! Encontrei sua postagem enquanto pesquisava sobre este tópico, mas preciso esclarecer. Isso significa que, se suponhamos que queremos transformar cada conjunto de exemplos subsequentes, nunca devemos chamar, fit_transform()pois isso não nos permitirá acessar o estado de objetos internos, transformar exemplos subsequentes com os mesmos parâmetros que foram obtidos fit()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.
AKKA

Depois de ligar t.fit_transform(train_data), t está instalado, para que você possa usá-lo com segurança t.transform(test_data).
K3 --- rnc

10

A seguinte explicação é baseada na fit_transformda Imputerclasse, mas a idéia é a mesma para fit_transformoutras classes scikit_learn gosto MinMaxScaler.


transformsubstitui 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:

imp = Imputer()
# calculating the means
imp.fit([[1, 3], [np.nan, 2], [8, 5.5]])

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:

X = [[np.nan, 11], 
     [4,      np.nan], 
     [8,      2],
     [np.nan, 1]]
print(imp.transform(X))

Nós temos

[[4.5, 11], 
 [4, 3.5],
 [8, 2],
 [4.5, 1]]

Portanto, fito imputador calcula as médias das colunas de alguns dados e transformaplica 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 o fit_transformque é basicamente a fitseguido por a transform.

Agora suas perguntas:

Por que precisamos transformar dados?

"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 que significa ajustar modelo em dados de treinamento e transformar em dados de teste?

O fitde um imputador não tem nada a ver com o fitusado no ajuste do modelo. Portanto, o uso do imputer fitnos dados de treinamento apenas calcula as médias de cada coluna de dados de treinamento. O uso transformde dados de teste substitui os valores ausentes dos dados de teste por meios que foram calculados a partir dos dados de treinamento.


3

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.


3

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:

scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train) 
scaler.transform(X_test) 

2

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.


"" Aplicamos o ajuste ao 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 "" :) Nice
Prakash Kumar

2
Eu acho que você quis comentar abaixo. Vou encaminhar para Prasad Nageshkar. (Bem ... eu teria se tivesse reputação.)
Eric McLachlan

1

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 normalV1V2V1V2

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


0

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.

Efeito de ajuste ()

A função de transformação aplica os valores dos parâmetros nos dados reais e fornece o valor normalizado.

Efeito de transform ()

A função fit_transform () executa as duas na mesma etapa.

Efeito de fit_transform ()

Observe que o mesmo valor é obtido, seja em duas etapas ou em uma única etapa.


0

"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 :-)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.