sklearn StandardScaler, не разрешает прямое преобразование, нам нужно fit_transform
В чем разница между fit_transform и transform? Почему трансформация не работает напрямую?
from sklearn.preprocessing import StandardScaler
X_scaler = StandardScaler()
X_train = X_scaler.fit_transform(X_train)
X_test = X_scaler.transform(X_test)
Если непосредственно преобразовано, это дает ошибку ниже
NotFitedError: Этот экземпляр StandardScaler еще не установлен. Вызовите "fit" с соответствующими аргументами перед использованием этого метода.
1 ответ
StandardScaler
согласно документации:
Стандартизируйте функции, удаляя среднее значение и масштабируя до дисперсии единиц
Так что сначала нужно как-то узнать о значении и дисперсии ваших данных. Так fit()
или же fit_transform()
нужен так, чтобы StandardScaler
может пройти через все ваши данные, чтобы найти среднее значение и дисперсию. К ним можно получить доступ по атрибутам:
mean_: среднее значение для каждой функции (столбца) в обучающем наборе.
var_: дисперсия для каждого объекта в обучающем наборе.
Обратите внимание, что они будут рассчитываться отдельно для каждого столбца данных.
В transform()
будет просто использовать те mean
а также variance
значения для масштабирования данных.
Теперь вы можете сказать, почему просто не рассчитывать эти атрибуты во время transform()
, Это делается для того, чтобы тестовые данные масштабировались так же, как и тренировочные данные (из fit_transform()
). Если вы рассчитываете среднее значение и дисперсию данных в каждом вызове transform()
тогда все передаваемые данные будут иметь разный масштаб, а это не то, что вам нужно.
Это верно для всех трансформаторов Scikit.
1) fit()
- будет только просматривать данные и сохранять все необходимые атрибуты данных
2) transform()
- Используйте сохраненные атрибуты из fit()
изменить данные
3) fit_transform()
- функция полезности для fit()
а потом transform()
одни и те же данные.
Обычно вы звоните fit_transform()
на тренировочных данных, и только transform()
по данным испытаний.