Разница между fit и fit_transform в моделях scikit_learn?

110

Я новичок в науке данных , и я не понимаю разницу между fitи fit_transformметоды в scikit-учиться. Кто-нибудь может просто объяснить, почему нам может понадобиться преобразовать данные?

Что означает подгонка модели к тренировочным данным и преобразование в тестовые данные? Означает ли это, например, преобразование категориальных переменных в числа в поезде и преобразование нового набора функций для проверки данных?

Kaggle
источник
@sds Ответ выше дает ссылку на этот вопрос.
Kaushal28
Мы применяем fitметод training datasetи используем transformметод bothобучения - набор данных обучения и тестовый набор данных
Пракаш Кумар

Ответы:

117

Чтобы центрировать данные (сделать так, чтобы они имели нулевое среднее значение и единичную стандартную ошибку), вычтите среднее значение, а затем разделите результат на стандартное отклонение.

x=xμσ

Вы делаете это на тренировочном наборе данных. Но затем вы должны применить то же преобразование к своему тестовому набору (например, в перекрестной проверке) или к вновь полученным примерам до прогноза. Но вы должны использовать те же два параметра и (значения), которые вы использовали для центрирования обучающего набора.σμσ

Следовательно, каждое преобразование sklearn fit()просто вычисляет параметры (например, и в случае StandardScaler ) и сохраняет их как состояние внутренних объектов. После этого вы можете вызвать его метод, чтобы применить преобразование к определенному набору примеров.σμσtransform()

fit_transform()объединяет эти два шага и используется для начальной подгонки параметров на обучающем множестве , но также возвращает преобразованный . Внутренне он просто вызывает сначала, а затем и те же данные.х xxfit()transform()

K3 --- СРН
источник
1
Большое спасибо за ваш ответ. Просто одно. По параметрам в модели это не означает, например, наклон и перехват для регрессии? скажем, когда вы подгоняете линейную регрессию, например, какие параметры подгоняются в методе подгонки? Параметры нормализации или параметры модели, такие как наклон и перехват?
Kaggle
1
Я имею в виду внутренние параметры преобразования ( и в случае StandardScaler). Какой бы метод преобразования не возвращался. См. Эту главу о вменении, например: scikit-learn.org/stable/modules/…σμσget_params()
K3 --- rnc
2
Мой предыдущий комментарий на самом деле неверен. В случае линейной регрессии подгоняемыми параметрами являются coef_(то есть наклон и точка пересечения), а не возвращаемые get_params()(которые вместо этого возвращают набор аргументов конструктора модели с соответствующими значениями).
K3 ---
Отличный ответ! Я наткнулся на ваш пост при поиске по этой теме, но мне нужно уточнить. Означает ли это, что если предположить, что мы хотим преобразовать каждый набор последующих примеров, мы никогда не должны вызывать, fit_transform()поскольку это не позволило бы нам получить доступ к состоянию внутренних объектов, чтобы преобразовать последующие примеры с теми же параметрами, которые были получены с использованием fit()исходного набора данных? Это происходит, например, когда у вас есть набор тестовых данных, и вы хотите преобразовать набор тестов, чтобы передать его обученному классификатору.
АККА
После того, как вы звоните t.fit_transform(train_data), t будет установлен, так что вы можете спокойно использовать t.transform(test_data).
K3 --- rnc
10

Следующее объяснение основывается на fit_transformиз Imputerкласса, но идея та же для fit_transformдругих классов scikit_learn нравится MinMaxScaler.


transformзаменяет пропущенные значения числом. По умолчанию это число означает количество столбцов некоторых данных, которые вы выбираете. Рассмотрим следующий пример:

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

Теперь импутер научился использовать среднее (1 + 8) / 2 = 4,5 для первого столбца и среднее (2 + 3 + 5,5) / 3 = 3,5 для второго столбца, когда его применяют к данным из двух столбцов:

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

мы получили

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

Таким образом, fitсредство вычисления вычисляет средние значения столбцов по некоторым данным и transformприменяет эти средства к некоторым данным (которые просто заменяют пропущенные значения средними). Если оба эти данные одинаковы (т. Е. Данные для расчета среднего и данные, к которым применены средние значения), вы можете использовать их, за fit_transformкоторыми в основном fitследует a transform.

Теперь ваши вопросы:

Почему нам может понадобиться преобразовать данные?

«По различным причинам во многих реальных наборах данных содержатся пропущенные значения, часто кодируемые как пробелы, NaN или другие заполнители. Такие наборы данных, однако, несовместимы с оценками scikit-learn, которые предполагают, что все значения в массиве являются числовыми» ( источник )

Что означает подгонка модели к тренировочным данным и преобразование в тестовые данные?

fitИз imputer не имеет ничего общего с fitиспользуемым в модели фитинга. Таким образом, используя imputer's fitдля тренировочных данных просто вычисляет средние значения для каждого столбца обучающих данных. Использование transformданных испытаний затем заменяет пропущенные значения данных испытаний средними значениями, которые были рассчитаны на основе данных обучения.

LoMaPh
источник
3

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

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

Ашиш Ананд
источник
3

Эти методы используются для преобразования набора данных в scikit-learn:

Давайте возьмем пример для масштабирования значений в наборе данных:

Здесь метод подгонки , применяемый к набору обучающих данных, изучает параметры модели (например, среднее значение и стандартное отклонение). Затем нам нужно применить метод transform к обучающему набору данных, чтобы получить преобразованный (масштабированный) обучающий набор данных. Мы также можем выполнить оба этих шага за один шаг, применив fit_transform к набору данных обучения.

Тогда зачем нам два отдельных метода - подгонка и преобразование ?

На практике нам нужно иметь отдельный набор данных для обучения и тестирования, и здесь помогает отдельный метод подбора и преобразования . Мы применяем подгонку к обучающему набору данных и используем метод преобразования как для обучающего набора, так и для тестового набора данных. Таким образом, обучение, а также тест набор данные трансформируются (масштабирование) , используя параметры модели , которые были усвоены на применение FIT методы учебного набора данных.

Пример кода:

scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train) 
scaler.transform(X_test) 
Прасад Нагешкар
источник
2

Это не технический ответ, но, надеюсь, полезно построить нашу интуицию:

Во-первых, все оценщики обучаются (или "подгоняются") по некоторым обучающим данным. Эта часть довольно проста.

Во-вторых, все оценки scikit-learn могут использоваться в конвейере, и идея с конвейером состоит в том, что данные передаются через конвейер. После подбора на конкретном уровне в конвейере данные передаются на следующую стадию в конвейере, но очевидно, что данные необходимо каким-то образом изменить (трансформировать); в противном случае вам вообще не понадобится эта стадия в конвейере. Таким образом, преобразование - это способ преобразования данных для удовлетворения потребностей следующего этапа в конвейере.

Если вы не используете конвейер, я все же думаю, что полезно подумать об этих инструментах машинного обучения таким образом, потому что даже самый простой классификатор все еще выполняет функцию классификации. Он принимает в качестве входных данных некоторые данные и производит вывод. Это тоже конвейер; просто очень просто.

Таким образом, fit выполняет обучение, преобразовывает изменения данных в конвейере, чтобы передать их на следующий этап в конвейере, а fit_transform выполняет как фиттинг , так и преобразование в одном, возможно, оптимизированном этапе.

Эрик МакЛахлан
источник
«Мы применяем подгонку к обучающему набору данных и используем метод преобразования как для учебного набора данных, так и для тестового набора данных» »:) Ницца
Пракаш Кумар
2
Я думаю, что вы хотели прокомментировать ниже. Я передам его Прасаду Нагешкару. (Ну ... я бы имел, если бы у меня была репутация.)
Эрик МакЛахлан
1

V1V2V1V2

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

user66487
источник
0

Рассмотрим задачу, которая требует от нас нормализации данных. Например, мы можем использовать нормализацию min-max или нормализацию z-счета. В модели есть некоторые присущие ей параметры. Минимальные и максимальные значения нормализации min-max, а также среднее и стандартное отклонение нормализации z-показателя. Функция fit () вычисляет значения этих параметров.

Эффект соответствия ()

Функция преобразования применяет значения параметров к фактическим данным и выдает нормализованное значение.

Эффект трансформации ()

Функция fit_transform () выполняет оба шага за один шаг.

Эффект fit_transform ()

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

Лавлин Дэвид
источник
0

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

«transform» использует ранее вычисленное среднее и стандартное для автоматического масштабирования данных (вычтите среднее из всех значений, а затем разделите на стандартное).

"fit_transform" делает оба одновременно. Таким образом, вы можете сделать это с 1 строкой кода вместо 2.

Теперь давайте посмотрим на это на практике:

Для обучающего набора X мы делаем «fit_transform», потому что нам нужно вычислить среднее и стандартное, а затем использовать его для автоматического масштабирования данных. Что касается тестового набора X , у нас уже есть среднее и стандартное значение, поэтому мы выполняем только часть преобразования.

Это супер просто. Ты прекрасно справляешься. Продолжайте в том же духе, мой друг :-)

Салман Табатабай
источник