Różnica między fit a fit_transform w modelach scikit_learn?

110

Jestem początkujących do nauki danych i nie rozumiem różnicę między fiti fit_transformmetody w scikit-learn. Czy ktoś może po prostu wyjaśnić, dlaczego potrzebujemy transformacji danych?

Co to znaczy dopasowywanie modelu do danych treningowych i przekształcanie w dane testowe? Czy oznacza to na przykład przekształcenie zmiennych kategorialnych w liczby w pociągu i przekształcenie nowego zestawu funkcji do testowania danych?

Kaggle
źródło
@sds Odpowiedź powyżej zawiera link do tego pytania.
Kaushal28
Stosujemy fitna training dataseti użyć transformmetody na both- zestaw danych szkoleniowych i zbiór danych testowego
Prakash Kumar

Odpowiedzi:

117

Aby wyśrodkować dane (aby miał zero średniej i błąd standardowy jednostki), odejmujesz średnią, a następnie dzielisz wynik przez odchylenie standardowe.

x=xμσ

μσ

fit()μσtransform()

fit_transform()xxfit()transform()

K3 --- rnc
źródło
1
Bardzo dziękuję za odpowiedź. Po prostu jedno: czy parametry w modelu nie oznaczają dużego nachylenia i przechwytywania regresji? kiedy pasujesz, powiedzmy regresję liniową, na przykład, które parametry są dopasowane w metodzie dopasowania? Parametry normalizacji lub parametry modelu, takie jak nachylenie i punkt przecięcia?
Kaggle
1
μσget_params()
2
Mój poprzedni komentarz jest w rzeczywistości błędny. W przypadku regresji liniowej dopasowanymi parametrami są coef_(tj. Nachylenie i punkt przecięcia), a nie parametry zwracane przez get_params()(które zamiast tego zwracają zestaw argumentów konstruktora modelu z powiązanymi z nimi wartościami).
K3 --- rnc
Świetna odpowiedź! Natrafiłem na Twój post, szukając tego tematu, ale muszę to wyjaśnić. Czy to oznacza, że ​​jeśli założymy, że chcemy przekształcić każdy zestaw kolejnych przykładów, nigdy nie powinniśmy wywoływać, fit_transform()ponieważ nie pozwoliłoby nam to uzyskać dostępu do wewnętrznego stanu obiektów, aby przekształcić kolejne przykłady z tymi samymi parametrami, które zostały uzyskane przy użyciu fit()początkowego zestawu danych? Dzieje się tak na przykład wtedy, gdy masz testowy zestaw danych i chcesz przekształcić zestaw testowy, aby przekazać go wyszkolonemu klasyfikatorowi.
AKKA
Po wywołaniu t.fit_transform(train_data), t jest wyposażone, dzięki czemu można bezpiecznie używać t.transform(test_data).
K3 --- rnc
10

Poniższy opis opiera się na fit_transformz Imputerklasą, ale idea jest taka sama dla fit_transforminnych klas scikit_learn podoba MinMaxScaler.


transformzastępuje brakujące wartości liczbą. Domyślnie liczba ta oznacza kolumny niektórych wybranych danych. Rozważ następujący przykład:

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

Teraz imputer nauczył się używać średniej (1 + 8) / 2 = 4,5 dla pierwszej kolumny i średniej (2 + 3 + 5,5) / 3 = 3,5 dla drugiej kolumny, gdy zostanie zastosowana do danych dwukolumnowych:

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

dostajemy

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

Tak więc według fitimputera oblicza średnie kolumn z niektórych danych, i przez transformto stosuje te środki do niektórych danych (co po prostu zastępuje brakujące wartości środkami). Jeśli oba te dane są takie same (tj. Dane do obliczenia średnich i dane, które dotyczą tych środków), możesz użyć, fit_transformco w zasadzie fitnastępuje po nim transform.

Teraz twoje pytania:

Dlaczego możemy potrzebować przekształcać dane?

„Z różnych powodów wiele rzeczywistych zestawów danych zawiera brakujące wartości, często kodowane jako spacje, NaN lub inne symbole zastępcze. Takie zestawy danych są jednak niezgodne z estymatorami scikit-learn, które zakładają, że wszystkie wartości w tablicy są numeryczne” ( źródło )

Co to znaczy dopasowywanie modelu do danych treningowych i przekształcanie w dane testowe?

fitO imputer nie ma nic wspólnego z fitużywanych w modelu oprawy. Tak więc użycie imputera do fitdanych treningowych po prostu oblicza średnie z każdej kolumny danych treningowych. Wykorzystanie transformdanych testowych zastępuje następnie brakujące wartości danych testowych środkami obliczonymi na podstawie danych treningowych.

LoMaPh
źródło
3

W kategoriach laika fit_transform oznacza wykonanie pewnych obliczeń, a następnie transformację (powiedzmy obliczenie średnich kolumn z niektórych danych, a następnie zastąpienie brakujących wartości). Więc dla zestawu treningowego musisz zarówno obliczyć, jak i wykonać transformację.

Ale w przypadku zestawu testowego uczenie maszynowe stosuje predykcję na podstawie tego, czego nauczył się podczas zestawu szkoleniowego, więc nie trzeba go obliczać, po prostu wykonuje transformację.

Ashish Anand
źródło
3

Te metody są używane do transformacji zestawu danych w scikit-learn:

Weźmy przykład Skalowania wartości w zbiorze danych:

W tym przypadku metoda dopasowania zastosowana do zestawu danych szkoleniowych uczy się parametrów modelu (na przykład średniej i odchylenia standardowego). Następnie musimy zastosować metodę transformacji w zbiorze danych szkoleniowych, aby uzyskać przekształcony (skalowany) zestaw danych szkoleniowych. Możemy również wykonać oba te kroki w jednym kroku, stosując fit_transform w zbiorze danych szkoleniowych.

Dlaczego więc potrzebujemy 2 oddzielnych metod - dopasowania i przekształcenia ?

W praktyce musimy mieć osobny zestaw danych szkoleniowych i testowych, i tam właśnie pomaga oddzielna metoda dopasowania i transformacji . Stosujemy dopasowanie w zbiorze danych szkoleniowych i stosujemy metodę transformacji zarówno w zbiorze danych szkoleniowych, jak i zbiorze danych testowych. Zatem trening, a także zestaw danych testowych są następnie przekształcane (skalowane) przy użyciu parametrów modelu, których nauczyliśmy się przy stosowaniu metody dopasowania zestawu danych treningowych.

Przykładowy kod:

scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train) 
scaler.transform(X_test) 
Prasad Nageshkar
źródło
2

To nie jest odpowiedź techniczna, ale mam nadzieję, że pomocne jest budowanie naszej intuicji:

Po pierwsze, wszystkie estymatory są trenowane (lub „dopasowują”) do niektórych danych treningowych. Ta część jest dość prosta.

Po drugie, wszystkie estymatory scikit-learn mogą być używane w potoku, a idea w potoku polega na tym, że dane przepływają przez potok. Po dopasowaniu do określonego poziomu w potoku dane są przekazywane do następnego etapu w potoku, ale oczywiście dane należy w jakiś sposób zmienić (przekształcić); w przeciwnym razie ten etap nie byłby w ogóle potrzebny. Tak więc transformacja jest sposobem transformacji danych w celu zaspokojenia potrzeb następnego etapu w przygotowaniu.

Jeśli nie używasz potoku, nadal uważam, że warto pomyśleć o tych narzędziach uczenia maszynowego w ten sposób, ponieważ nawet najprostszy klasyfikator nadal wykonuje funkcję klasyfikacji. Pobiera na wejściu niektóre dane i tworzy wynik. To też jest rurociąg; po prostu bardzo prosty.

Podsumowując, fit wykonuje szkolenie, transformacja zmienia dane w potoku, aby przekazać je do następnego etapu w potoku, a fit_transform wykonuje dopasowanie i transformację w jednym możliwie zoptymalizowanym kroku.

Eric McLachlan
źródło
„” Dopasowujemy dopasowanie do zestawu danych szkoleniowych i stosujemy metodę transformacji zarówno - zestawu danych szkoleniowych, jak i zestawu danych testowych ”” :) Nicea
Prakash Kumar
2
Myślę, że chciałeś skomentować poniżej. Przekażę to Prasadowi Nageshkarowi. (Cóż ... zrobiłbym to, gdybym miał reputację.)
Eric McLachlan
1

V1V2V1V2

Przechodząc do innego pytania, najpierw budujesz model w zestawie szkoleniowym, który jest (model uczy się wzorców lub zachowania danych z zestawu szkoleniowego), a kiedy uruchamiasz ten sam model w zestawie testowym, próbuje zidentyfikować podobne wzorce lub zachowania po zidentyfikowaniu wyciąga wnioski i odpowiednio podaje wyniki szkolenia

użytkownik66487
źródło
0

Zastanów się nad zadaniem, które wymaga od nas normalizacji danych. Na przykład, możemy zastosować normalizację min-max lub normalizację z-score. W modelu występują pewne nieodłączne parametry. Wartości minimalne i maksymalne w normalizacji min-max oraz średnia i odchylenie standardowe w normalizacji z-score. Funkcja fit () oblicza wartości tych parametrów.

Efekt dopasowania ()

Funkcja transformacji stosuje wartości parametrów do danych rzeczywistych i podaje znormalizowaną wartość.

Efekt transform ()

Funkcja fit_transform () wykonuje obie czynności w tym samym kroku.

Wpływ fit_transform ()

Pamiętaj, że ta sama wartość jest uzyskiwana niezależnie od tego, czy wykonujemy dwa kroki, czy jeden krok.

Lovelyn David
źródło
0

„fit” oblicza średnią i std do późniejszego skalowania. (tylko obliczenia), nic ci nie jest dane .

„transformacja” wykorzystuje wcześniej obliczoną średnią i std do automatycznego skalowania danych (odejmij średnią od wszystkich wartości, a następnie podziel ją przez std).

„fit_transform” robi oba jednocześnie. Możesz to zrobić za pomocą 1 wiersza kodu zamiast 2.

Teraz spójrzmy na to w praktyce:

W przypadku zestawu szkoleniowego X wykonujemy „fit_transform”, ponieważ musimy obliczyć średnią i standard, a następnie użyć go do automatycznego skalowania danych. W przypadku zestawu testowego X mamy już wartość średnią i standardową, więc wykonujemy tylko część „przekształcania”.

To bardzo proste. Świetnie ci idzie. Oby tak dalej, przyjacielu :-)

Salman Tabatabai
źródło