в чем разница между 'transform' и 'fit_transform' в sklearn


117

В наборе инструментов sklearn-python есть две функции transformи fit_transformabout sklearn.decomposition.RandomizedPCA. Описание двух функций следующее

введите описание изображения здесь введите описание изображения здесь

Но в чем разница между ними?


5
est.fit_transform(X)всегда эквивалентно est.fit(X).transform(X), но обычно быстрее.
Фред Фу

Ответы:


22

Здесь разница: вы можете использовать pca.transform, только если вы уже вычислили PCA на матрице.

   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]])

если вы хотите использовать, .transformвам нужно научить правилу трансформации ваш ПК

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

В частности, преобразование PCA применяет изменение базиса, полученное с помощью разложения PCA матрицы X, к матрице Z.


Я изменил свой вопрос. Обе функции возвращают одинаковые значения.
tqjustc

2
Вы имеете в виду, что fit_transformэто комбинация двух функций fitи transform?
tqjustc

6
Если вы используете подгонку и трансформацию на одной и той же матрице, да. Нет, если вы поместите матрицу x, а затем трансформируете матрицу z
Donbeo

В строке [14] написано «ftransform», что это?
Радждип Бисвас,

97

В api оценки scikit-learn ,

fit() : используется для создания параметров модели обучения из данных обучения

transform(): параметры, созданные из fit()метода, применяемые к модели для создания преобразованного набора данных.

fit_transform(): комбинация fit()и transform()api в одном наборе данных

введите описание изображения здесь

Ознакомьтесь с главой 4 из этой книги и ответом от stackexchange для большей ясности.


57

Эти методы используются для центрирования / масштабирования заданных данных. Это в основном помогает нормализовать данные в определенном диапазоне.

Для этого мы используем метод Z-score.

Z-оценка

Мы делаем это на обучающем наборе данных.

1. Fit (): метод вычисляет параметры μ и σ и сохраняет их как внутренние объекты.

2. Transform (): метод, использующий эти вычисленные параметры, применяет преобразование к определенному набору данных.

3. Fit_transform (): объединяет методы fit () и transform () для преобразования набора данных.

Фрагмент кода для масштабирования / стандартизации функций (после train_test_split).

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

Мы применяем такое же преобразование параметров (обучающий набор, два параметра μ и σ (значения)) к нашему набору тестирования.


1
Спасибо за это объяснение. Мне было любопытно, сохранятся ли значения «соответствия», и это помогло!
Адиб

2
+1 за пример кода. У меня возникла путаница, можно ли использовать fit_transform в наборе поездов, а затем преобразовать тестовый набор, или вам нужна отдельная подгонка в поезде
Вивек

3
fit_tranform (..) не может использоваться для X_test, потому что тестовый тест должен использовать μ и σ, вычисленные из набора данных X_train. fit_tranform (..) может использоваться только в наборе обучающих данных. Пожалуйста, поправьте мое понимание.
дайа

1
Да вы правы. В тесте можно использовать только преобразование (..), поскольку оно использует изученные параметры из X_train для стандартизации данных
X_test

7

Общее различие между методами:

  • fit (raw_documents [, y]): изучите словарный словарь всех токенов в необработанных документах.
  • fit_transform (raw_documents [, y]): изучите словарь словаря и верните матрицу термин-документ. Это эквивалентно подгонке с последующим преобразованием, но реализуется более эффективно.
  • transform (raw_documents): преобразовать документы в матрицу документ-термин. Подсчет маркеров извлечения из необработанных текстовых документов с использованием словаря, подогнанного под соответствие, или словаря, предоставленного конструктору.

Как fit_transform, так и transform возвращают одну и ту же матрицу Document-term.

Источник


4

Вот основная разница между .fit()&.fit_transform() :

.поместиться():

используется в контролируемом обучении с двумя объектами / параметрами (x, y) для соответствия модели и запуска модели, где мы знаем, что мы собираемся предсказать

.fit_transform ():

используется в неконтролируемом обучении с одним объектом / параметром (x), где мы не знаем, что мы собираемся предсказать.


Это не очень точно; fit () также можно использовать в обучении без учителя. Но если вы пытаетесь излишне упростить ради краткости, то это хороший способ объяснить новичку.
Радждип Бисвас,

3

С точки зрения непрофессионала, fit_transform означает выполнение некоторых вычислений, а затем преобразование (скажем, вычисление средних значений столбцов на основе некоторых данных с последующей заменой отсутствующих значений). Итак, для обучающего набора вам нужно как рассчитать, так и выполнить преобразование.

Но для набора для тестирования машинное обучение применяет прогнозирование на основе того, что было изучено во время набора для обучения, поэтому ему не нужно вычислять, оно просто выполняет преобразование.


1

Зачем и когда использовать каждый из них:

Все ответы довольно хороши, но я бы сделал акцент на том, ПОЧЕМУ и КОГДА использовать каждый метод.

fit (), преобразование (), fit_transform ()

Обычно у нас есть проблема контролируемого обучения с (X, y) в качестве набора данных, и мы разбиваем его на данные обучения и данные тестирования:

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)

Представьте, что мы устанавливаем токенизатор, если мы подбираем X, мы включаем данные тестирования в токенизатор, но я видел эту ошибку много раз!

Правильно - соответствовать ТОЛЬКО с X_train , потому что вы не знаете «ваши будущие данные», поэтому вы не можете использовать данные X_test для чего-либо!

Затем вы можете преобразовать свои тестовые данные, но по отдельности, поэтому существуют разные методы.

Последний совет: X_train_transformed = model.fit_transform(X_train)эквивалентен:, X_train_transformed = model.fit(X_train).transform(X_train)но первый быстрее.

Обратите внимание, что то, что я называю «моделью», обычно будет масштабатором, преобразователем tfidf, векторизатором другого типа, токенизатором ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.