Jaka jest różnica między „transform” i „fit_transform” w sklearn


Odpowiedzi:


22

Tutaj różnica, której możesz użyć pca.transform tylko wtedy, gdy już obliczyłeś PCA na macierzy

   In [12]: pc2 = RandomizedPCA(n_components=3)

    In [13]: pc2.transform(X) # can't transform because it does not know how to do it.
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-13-e3b6b8ea2aff> in <module>()
    ----> 1 pc2.transform(X)

    /usr/local/lib/python3.4/dist-packages/sklearn/decomposition/pca.py in transform(self, X, y)
        714         # XXX remove scipy.sparse support here in 0.16
        715         X = atleast2d_or_csr(X)
    --> 716         if self.mean_ is not None:
        717             X = X - self.mean_
        718 

    AttributeError: 'RandomizedPCA' object has no attribute 'mean_'

    In [14]: pc2.ftransform(X) 
    pc2.fit            pc2.fit_transform  

    In [14]: pc2.fit_transform(X)
    Out[14]: 
    array([[-1.38340578, -0.2935787 ],
           [-2.22189802,  0.25133484],
           [-3.6053038 , -0.04224385],
           [ 1.38340578,  0.2935787 ],
           [ 2.22189802, -0.25133484],
           [ 3.6053038 ,  0.04224385]])

jeśli chcesz używać .transform, musisz nauczyć swoją pca regułę transformacji

In [20]: pca = RandomizedPCA(n_components=3)

In [21]: pca.fit(X)
Out[21]: 
RandomizedPCA(copy=True, iterated_power=3, n_components=3, random_state=None,
       whiten=False)

In [22]: pca.transform(z)
Out[22]: 
array([[ 2.76681156,  0.58715739],
       [ 1.92831932,  1.13207093],
       [ 0.54491354,  0.83849224],
       [ 5.53362311,  1.17431479],
       [ 6.37211535,  0.62940125],
       [ 7.75552113,  0.92297994]])

In [23]: 

W szczególności transformacja PCA zastosuj zmianę bazy uzyskaną przy dekompozycji PCA macierzy X na macierz Z.


Zmodyfikowałem moje pytanie. Te dwie funkcje zwracają ten sam rodzaj wartości.
tqjustc

2
masz na myśli, że fit_transformjest to połączenie dwóch funkcji fiti transform?
tqjustc

6
Jeśli używasz dopasowania i przekształcenia na tej samej macierzy, tak. Nie, jeśli dopasujesz macierz x, a następnie przekształcisz macierz z
Donbeo

Line In [14] mówi „ftransform”, co to jest?
Rajdeep Biswas

97

W api estymatora scikit-Learn ,

fit() : służy do generowania parametrów modelu uczenia się z danych szkoleniowych

transform(): parametry wygenerowane na podstawie fit()metody, zastosowane do modelu w celu wygenerowania przekształconego zestawu danych.

fit_transform(): kombinacja fit()i transform()API w tym samym zbiorze danych

wprowadź opis obrazu tutaj

Sprawdź Rozdział-4 z tej książki i odpowiedź z stackexchange dla większej przejrzystości


55

Metody te służą do wyśrodkowania / skalowania cech danych. Zasadniczo pomaga znormalizować dane w określonym zakresie

W tym celu używamy metody Z-score.

Z-Score

Robimy to na zbiorze uczącym danych.

1. Fit (): Metoda oblicza parametry μ i σ i zapisuje je jako obiekty wewnętrzne.

2. Transform (): Metoda wykorzystująca te obliczone parametry stosuje transformację do określonego zbioru danych.

3. Fit_transform (): łączy metody fit () i transform () w celu transformacji zbioru danych.

Fragment kodu do skalowania / standaryzacji funkcji (po train_test_split).

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit_transform(X_train)
sc.transform(X_test)

Stosujemy tę samą (zestaw uczący te same dwa parametry μ i σ (wartości)) transformację parametru w naszym zbiorze testowym.


1
Dziękuję za to wyjaśnienie. Byłem ciekawy, czy wartości „dopasowania” są przenoszone i to pomogło!
Adib,

2
+1 dla przykładu kodu. Miałem zamieszanie, czy można użyć fit_transform na zestawie pociągowym, a następnie przekształcić zestaw testowy, czy też potrzebujesz osobnego dopasowania w pociągu
Vivek

2
Nie można użyć funkcji fit_tranform (..) dla X_test, ponieważ test testowy powinien wykorzystywać μ i σ obliczone ze zbioru danych X_train. Funkcja fit_tranform (..) może być używana tylko w zestawie danych uczących. Proszę, popraw moje zrozumienie.
Daya

1
Tak, masz rację. Tylko transform (..) może być użyte w teście, ponieważ wykorzystuje wyuczone parametry z X_train do standaryzacji danych
X_test

7

Ogólna różnica między metodami:

  • fit (raw_documents [, y]): Naucz się słownika wszystkich tokenów w surowych dokumentach.
  • fit_transform (raw_documents [, y]): Naucz się słownika słownictwa i zwróć macierz termin-dokument. Jest to równoważne dopasowaniu, po którym następuje transformacja, ale skuteczniej zaimplementowane.
  • transform (raw_documents): Przekształć dokumenty do macierzy terminów dokumentów. Extract token zlicza surowe dokumenty tekstowe przy użyciu słownika dopasowanego lub dostarczonego konstruktorowi.

Zarówno fit_transform, jak i transform zwracają tę samą macierz terminów dokumentu.

Źródło


4

Oto podstawowa różnica między .fit()& .fit_transform():

.dopasowanie():

jest używany w uczeniu nadzorowanym, mając dwa obiekty / parametry (x, y), aby dopasować model i stworzyć model do uruchomienia, gdzie wiemy, że to, co będziemy przewidywać

.fit_transform ():

jest używany w uczeniu nienadzorowanym, mając jeden obiekt / parametr (x), gdzie nie wiemy, co będziemy przewidywać.


Nie jest to zbyt precyzyjne; Funkcja fit () może być również używana w uczeniu się bez nadzoru. Ale jeśli próbujesz nadmiernie uprościć tylko ze względu na zwięzłość, jest to dobry sposób na wyjaśnienie początkującym.
Rajdeep Biswas

3

Mówiąc prościej, fit_transform oznacza wykonanie pewnych obliczeń, a następnie wykonanie transformacji (powiedzmy obliczenie średnich kolumn z niektórych danych, a następnie zastąpienie brakujących wartości). Tak więc w przypadku zestawu treningowego musisz zarówno obliczyć, jak i wykonać transformację.

Ale w przypadku zestawu testowego uczenie maszynowe stosuje przewidywanie na podstawie tego, czego nauczyliśmy się podczas zestawu uczącego, więc nie musi obliczać, po prostu wykonuje transformację.


1

Dlaczego i kiedy używać każdego z nich:

Wszystkie odpowiedzi są całkiem dobre, ale kładę nacisk na DLACZEGO i KIEDY stosuję każdą metodę.

fit (), transform (), fit_transform ()

Zwykle mamy nadzorowany problem uczenia się z (X, y) jako zbiorem danych i dzielimy go na dane treningowe i dane testowe:

import numpy as np
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y)

X_train_vectorized = model.fit_transform(X_train)
X_test_vectorized = model.transform(X_test)

Wyobraź sobie, że dopasowujemy tokenizer, jeśli dopasujemy X, dołączamy dane testowe do tokenizera, ale widziałem ten błąd wiele razy!

Prawidłowe jest dopasowanie TYLKO do X_train , ponieważ nie znasz "swoich przyszłych danych", więc nie możesz użyć danych X_test do dopasowania czegokolwiek!

Następnie możesz przekształcić dane testowe, ale oddzielnie, dlatego istnieją różne metody.

Ostatnia wskazówka: X_train_transformed = model.fit_transform(X_train)odpowiada: X_train_transformed = model.fit(X_train).transform(X_train) ale pierwsza jest szybsza.

Zwróć uwagę, że to, co nazywam „modelem”, zwykle będzie skalerem, transformatorem tfidf, innym rodzajem wektoryzatora, tokenizatorem ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.