Differenza tra fit e fit_transform nei modelli scikit_learn?


110

Sono un principiante della scienza dei dati e non capisco la differenza tra fite i fit_transformmetodi di scikit-learn. Qualcuno può semplicemente spiegare perché potremmo aver bisogno di trasformare i dati?

Che cosa significa adattamento del modello ai dati di allenamento e trasformazione in dati di test? Significa, ad esempio, convertire variabili categoriali in numeri in treno e trasformare un nuovo set di funzionalità per testare i dati?



@sds La risposta di cui sopra fornisce il collegamento a questa domanda.
Kaushal28,

Facciamo domanda fitsu training datasete utilizziamo il transformmetodo su both- il set di dati di training e il set di dati di test
Prakash Kumar

Risposte:


117

Per centrare i dati (renderli con media zero e errore standard unitario), sottrarre la media e quindi dividere il risultato per la deviazione standard.

x=xμσ

μσ

fit()μσtransform()

fit_transform()xxfit()transform()


1
Grazie mille per la tua risposta. Solo una cosa. Per parametri nel modello, ciò non significa per esempio pendenza e intercettazione per regressione? quando ti adatti diciamo una regressione lineare per esempio quali parametri sono adattati nel metodo di adattamento? Parametri di normalizzazione o parametri del modello come pendenza e intercettazione?
Kaggle,

1
μσget_params()

2
Il mio commento precedente è in realtà sbagliato. In caso di regressione lineare, i parametri adattati sono coef_(ovvero pendenza e intercetta), non quelli restituiti da get_params()(che, invece, restituisce l'insieme degli argomenti del costruttore del modello con i loro valori associati).
K3 --- rnc,

Bella risposta! Mi sono imbattuto nel tuo post durante la ricerca su questo argomento, ma devo chiarire. Ciò significa che se supponiamo di voler trasformare ogni serie di esempi successivi, non dovremmo mai chiamare fit_transform()in quanto non ci consentirebbe di accedere allo stato degli oggetti interni, per trasformare gli esempi successivi con gli stessi parametri ottenuti utilizzando fit()il set di dati iniziale? Ciò si verifica ad esempio quando si dispone di un set di dati di test e si desidera trasformare il set di test per passarlo al classificatore addestrato.
AKKA,

Dopo aver chiamato t.fit_transform(train_data), t è installato, in modo da poterlo utilizzare in sicurezza t.transform(test_data).
K3 --- rnc,

10

La seguente spiegazione si basa su fit_transformdi Imputerclasse, ma l'idea è la stessa per fit_transformaltre classi scikit_learn piace MinMaxScaler.


transformsostituisce i valori mancanti con un numero. Per impostazione predefinita, questo numero è il mezzo di colonne di alcuni dati scelti. Considera il seguente esempio:

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

Ora l'imputer ha imparato a usare una media (1 + 8) / 2 = 4.5 per la prima colonna e media (2 + 3 + 5.5) / 3 = 3.5 per la seconda colonna quando viene applicata a dati a due colonne:

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

noi abbiamo

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

Quindi fitdall'imputer calcola la media delle colonne da alcuni dati, e con transformessa applica quei mezzi ad alcuni dati (che sta semplicemente sostituendo i valori mancanti con i mezzi). Se entrambi questi dati sono uguali (ovvero i dati per il calcolo dei mezzi e i dati ai quali vengono applicati) è possibile utilizzare fit_transformche è sostanzialmente fitseguito da un transform.

Ora le tue domande:

Perché potremmo aver bisogno di trasformare i dati?

"Per vari motivi, molti set di dati del mondo reale contengono valori mancanti, spesso codificati come spazi vuoti, NaN o altri segnaposto. Tali set di dati sono tuttavia incompatibili con gli stimatori di apprendimento di scikit che presuppongono che tutti i valori in un array siano numerici" ( fonte )

Che cosa significa adattamento del modello ai dati di allenamento e trasformazione in dati di test?

Il fitdi un imputer non ha nulla a che fare con l' fitusato nel montaggio del modello. Pertanto, l'utilizzo di un imputer fitsui dati di allenamento calcola solo i mezzi di ciascuna colonna di dati di allenamento. L'utilizzo transformdei dati di test sostituisce quindi i valori mancanti dei dati di test con mezzi calcolati dai dati di allenamento.


3

In parole povere, fit_transform significa fare dei calcoli e poi fare delle trasformazioni (diciamo calcolare il mezzo delle colonne da alcuni dati e quindi sostituire i valori mancanti). Quindi, per il set di allenamento, è necessario sia calcolare che effettuare la trasformazione.

Ma per il set di test, l'apprendimento automatico applica la previsione in base a ciò che è stato appreso durante il set di training e quindi non è necessario calcolarlo, esegue solo la trasformazione.


3

Questi metodi vengono utilizzati per le trasformazioni del set di dati in scikit-learn:

Facciamo un esempio per il ridimensionamento dei valori in un set di dati:

Qui il metodo di adattamento , quando applicato al set di dati di training, apprende i parametri del modello (ad esempio, media e deviazione standard). È quindi necessario applicare il metodo di trasformazione sul set di dati di training per ottenere il set di dati di training trasformato (ridimensionato). Potremmo anche eseguire entrambi questi passaggi in un solo passaggio applicando fit_transform sul set di dati di training.

Allora perché abbiamo bisogno di 2 metodi separati: adattarsi e trasformare ?

In pratica, è necessario disporre di un set di dati di formazione e test separato ed è qui che aiuta avere un metodo separato di adattamento e trasformazione . Appliciamo l' adattamento al set di dati di training e utilizziamo il metodo di trasformazione su entrambi: il set di dati di training e il set di dati di test. Pertanto, il training e il set di dati di test vengono quindi trasformati (ridimensionati) utilizzando i parametri del modello che sono stati appresi applicando il metodo di adattamento del set di dati di training.

Codice di esempio:

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

2

Questa non è una risposta tecnica ma, si spera, è utile sviluppare il nostro intuito:

In primo luogo, tutti gli stimatori sono addestrati (o "adattati") su alcuni dati di addestramento. Quella parte è abbastanza semplice.

In secondo luogo, tutti gli stimatori di scikit-learn possono essere utilizzati in una pipeline e l'idea con una pipeline è che i dati scorrano attraverso la pipeline. Una volta inseriti a un determinato livello nella pipeline, i dati vengono passati alla fase successiva della pipeline, ma ovviamente i dati devono essere modificati (trasformati) in qualche modo; in caso contrario, non avresti affatto bisogno di quella fase in cantiere. Quindi, Transform è un modo di trasformare i dati per soddisfare le esigenze della fase successiva nella pipeline.

Se non stai usando una pipeline, penso ancora che sia utile pensare a questi strumenti di apprendimento automatico in questo modo perché, anche il classificatore più semplice sta ancora eseguendo una funzione di classificazione. Prende come input alcuni dati e produce un output. Anche questa è una pipeline; solo molto semplice.

In breve, fit esegue l'addestramento, trasforma i dati nella pipeline in modo da passare alla fase successiva della pipeline e fit_transform esegue sia l'adattamento che la trasformazione in un passaggio possibilmente ottimizzato.


"" Appliciamo adattamento al set di dati di training e utilizziamo il metodo di trasformazione su entrambi: il set di dati di training e il set di dati di test "" :) Bello
Prakash Kumar

2
Penso che volevi commentare qui sotto. Lo inoltrerò a Prasad Nageshkar. (Beh ... lo avrei se avessi la reputazione.)
Eric McLachlan il

1

V1V2V1V2

Venendo ad un'altra domanda, prima costruisci il modello nel set di addestramento che è (il modello apprende gli schemi o il comportamento dei tuoi dati dal set di addestramento) e quando esegui lo stesso modello nel set di test tenta di identificare modelli o comportamenti simili una volta identificato, trae le sue conclusioni e fornisce risultati di conseguenza sulla formazione dei dati


0

Prendi in considerazione un'attività che richiede di normalizzare i dati. Ad esempio, possiamo usare una normalizzazione min-max o una normalizzazione z-score. Ci sono alcuni parametri intrinseci nel modello. I valori minimo e massimo nella normalizzazione min-max e la deviazione media e standard nella normalizzazione del punteggio z. La funzione fit () calcola i valori di questi parametri.

Effetto di adattamento ()

La funzione di trasformazione applica i valori dei parametri sui dati effettivi e fornisce il valore normalizzato.

Effetto di transform ()

La funzione fit_transform () esegue entrambi nello stesso passaggio.

Effetto di fit_transform ()

Si noti che lo stesso valore si ottiene se eseguiamo in 2 passaggi o in un singolo passaggio.


0

"fit" calcola la media e lo std da utilizzare per il ridimensionamento successivo . (solo un calcolo), non ti viene dato nulla .

"transform" utilizza una media precedentemente calcolata e std per ridimensionare automaticamente i dati (sottrarre la media da tutti i valori e quindi dividerla per std).

"fit_transform" fa entrambe le cose contemporaneamente. Quindi puoi farlo con 1 riga di codice anziché 2.

Ora diamo un'occhiata in pratica:

Per il set di training X , facciamo "fit_transform" perché dobbiamo calcolare media e std, e quindi usarlo per ridimensionare automaticamente i dati. Per il set di test X , beh, abbiamo già la media e lo std, quindi facciamo solo la parte "trasforma".

È semplicissimo. Stai andando bene. Continuate così, amico mio :-)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.