StandardScaler до и после разделения данных

20

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

1- Использование StandardScalerна всех данных. Например

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_fit = sc.fit(X)
X_std = X_fit.transform(X)

Или

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X = sc.fit(X)
X = sc.transform(X)

Или просто

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_std = sc.fit_transform(X)

2- Использование StandardScalerна разделенных данных.

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

Я хотел бы стандартизировать свои данные, но я не уверен, какой метод лучше!

tsumaranaina
источник

Ответы:

25

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

Например, знание распределения всего набора данных может повлиять на то, как вы обнаруживаете и обрабатываете выбросы, а также на то, как вы параметризуете свою модель. Хотя сами данные не раскрываются, информация о распространении данных есть. В результате производительность вашего набора тестов не является точной оценкой производительности на невидимых данных. Дальнейшее обсуждение, которое вы могли бы найти полезным, находится на перекрестной проверке .

redhqs
источник
Применимо ли то же самое к набору валидации? Другими словами, если я разделю свой учебный набор на наборы "Поезд" и "Валидация", узнаю ли я, что подходит только для поезда, а затем применил бы оба набора "Валидация" и "Тестирование"? или я узнаю соответствие всему набору данных, который включал в себя как примеры валидации, так и обучения, и беспокоюсь только о том, чтобы применить его к тестовому набору позже.
Фил Глау
привет - это правильно, подходит только в поезде - не проверка или проверка
redhqs
0

Как насчет следующего:

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()

X_train = sc.fit_transform(X_train)

X_test = sc.fit_transform (X_test)

Потому что, если X_test = sc.transform(X_test)возвращается, ошибка X_testеще не установлена. Или я что-то здесь упустил?

user253546
источник
2
Просто удалите посадку с X_test
tsumaranaina
0

Вы не должны делать fit_transform (X_test) на тестовых данных.
Подгонка уже произошла выше.

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform (X_test)
starsini
источник
Извините, это подразумевалось как ответ на то, что ниже :)
starsini