#python #normalization #cross-validation #k-fold #standardization
#python #нормализация #перекрестная проверка #k-кратная #стандартизация
Вопрос:
Я всегда знал, что стандартизация или нормализация должны подходить только для обучающего набора, а затем использоваться для преобразования тестового набора. Итак, что я бы сделал:
scaler = StandardScaler()
scaler.fit_transform(X_train)
scaler.transform(X_test)
Теперь, если бы я использовал эту модель для новых данных, я мог бы просто сохранить «scaler» и загрузить его в любой новый скрипт.
У меня возникли проблемы с пониманием того, как это работает для K-кратного резюме. Лучше ли перенастраивать и преобразовывать скейлер при каждом сгибе? Я мог бы понять, как это работает при построении модели, но что, если я захочу использовать эту модель позже. Какой масштабатор мне следует сохранить?
Далее я хочу распространить это на данные временных рядов. Я понимаю, как k-fold работает для временных рядов, но опять же, как мне объединить это с CV? В этом случае я бы предложил сохранить самый последний масштабатор, поскольку он будет соответствовать 4/5 (в случае k = 5) данных, чтобы он соответствовал самым (последним) данным. Будет ли это правильным подходом?
Комментарии:
1. Теоретически да, вы должны переобучить масштабатор k раз для проверки. На практике я обнаружил, что это не имеет значения, если ваша выборка в каждом сгибе большая. Если вы хотите использовать модель позже, вы должны сохранить модель и масштабируемую программу, обученную на всех доступных обучающих данных.
2. Спасибо за ваш ответ. Однако у меня все еще есть вопрос. То, что вы говорите в последнем предложении: «вы должны поддерживать модель и масштабатор, обученные на всех доступных обучающих данных». Однако при перенастройке скейлера для каждого сгиба я по сути создаю 5 разных скейлеров, ни один из которых не подходит для всех данных, верно? Поэтому я бы не получил единую подгонку масштабирования для всех обучающих данных.
3. используйте перекрестную проверку для оценки производительности вашей модели вне выборки, но когда вы хотите использовать модель для составления прогнозов вне выборки, полезно обучить ее всем доступным данным, а не только (k-1) / k из них, и сделать то же самоепроблема с вашим масштабатором
4. Итак, если я правильно понимаю, я сначала использую K-кратный (скажем, K = 5) CV с 5 различными экземплярами масштабатора (каждый подходит на 4/5, а затем преобразует оставшуюся 1/5), чтобы оценить производительность модели. Затем, как только я буду удовлетворен, я построю модель для всего набора, который был fit_transformed все сразу с помощью scaler? (Извините, если это вопросы для новичков, я вроде как новичок в этом, лол)
5. Да, это правильно
Ответ №1:
Лучше ли перенастраивать и преобразовывать скейлер при каждом сгибе?
ДА. Возможно, вы захотите прочитать документ scikit-learn о перекрестной проверке:
Так же, как важно тестировать предиктор на данных, полученных в результате обучения, предварительная обработка (например, стандартизация, выбор функций и т. Д.) И аналогичные преобразования данных аналогичным образом должны быть извлечены из обучающего набора и применены к готовым данным для прогнозирования.
Какой масштабатор мне следует сохранить?
Сохраните скейлер (и любую другую предварительную обработку, то есть конвейер) и предиктор, обученный на всех ваших обучающих данных, а не только (k-1) / k из них из перекрестной проверки или 70% из одного разделения.
-
Если вы используете регрессионную модель, это так просто.
-
Если для обучения вашей модели требуется поиск по гиперпараметрам с использованием перекрестной проверки (например, поиск по сетке для параметров обучения xgboost), то вы уже собрали информацию из разных слоев, поэтому вам нужен другой набор тестов для оценки истинной производительности модели вне выборки. (После того, как вы сделали эту оценку, вы можете еще раз переучиться на комбинированных данных train test. Этот последний шаг не всегда выполняется для нейронных сетей, которые параметризованы для определенного размера выборки.)