Следует ли мне стандартизировать и отбрасывать тренд перед сплит-тренингом или тестированием?

Я новичок в python и пытаюсь выполнить задачу случайной регрессии леса. Я импортирую свой набор данных, в котором всего 5 столбцов (включая столбец даты). Мои данные зависят от времени, поэтому я не могу использовать разделение поездов / тестов. Поэтому вместо этого я делаю следующее

feature_cols = [ 'Rainfall' ,'Temperature','Usage amount']
target_v = df['water level']
X = df[feature_cols] 
y = target_v 

затем я использую разделение временных рядов в sklearn, чтобы разделить мои данные на обучение и тестирование

from sklearn.model_selection import TimeSeriesSplit
tss = TimeSeriesSplit(n_splits = 3)
for train_index, test_index in tss.split(X):
    X_train, X_test = X.iloc[train_index, :], X.iloc[test_index,:]
    y_train, y_test = y.iloc[train_index], y.iloc[test_index]

Теперь мне нужно выполнить предварительную обработку, такую ​​как масштабирование моих данных и удаление среднего значения (детренд). Итак, мой вопрос: что мне делать в первую очередь? т.е. сначала удалить среднее значение, а затем масштабировать данные или сначала масштабировать, а затем удалить среднее значение?

Также могу ли я выполнить 2 метода на всем моем фрейме данных (df) или на подмножестве моих данных (то есть только на данных обучения)? Если это подмножество, как мне это сделать?

Вот пример масштабирования и среднего удаления, которые я пробовал на всем моем фреймворке.

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns, index=df.index)

mean = np.mean((df.values), axis=-1, keepdims=True)
detrended = df - mean

Затем я использовал фрейм данных без тренда для разделения моих данных на обучение и тестирование и запустил свои модели. Не уверен, что это правильный подход? любая помощь будет оценена, спасибо


person lanny kayz    schedule 12.05.2020    source источник


Ответы (1)


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

Итак, что вам следует сделать в первую очередь, это Train Test Split. Затем подгоните масштабатор к данным обучения, преобразуйте данные обучения с помощью масштабатора, а затем преобразуйте данные тестирования с помощью того же средства масштабирования без переустановки. Делая это, вы гарантируете, что одни и те же значения будут одинаково представлены для всех будущих данных, которые могут быть переданы в сеть.

———————

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

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

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

person Mike    schedule 12.05.2020
comment
В этом есть смысл, спасибо @Mike. Не могли бы вы привести пример, как это сделать? Итак, допустим, я успешно разделил свои данные на X_train, X_test и y_train, y_test, я должен установить масштабатор только на X_train? а что вы подразумеваете под преобразованием данных тестирования с помощью того же масштабатора? - person lanny kayz; 12.05.2020
comment
Обновлен ответ на комментарий ответа - person Mike; 12.05.2020
comment
отлично, спасибо. Итак, исходя из моего понимания этого, я должен fit_transform X_train, затем преобразовать X_test и оставить y_train и проверить нетронутым? - person lanny kayz; 12.05.2020
comment
Вы можете сделать это или вы можете fit_transform X_train и y_train и преобразовать X_test и y_test. Либо это нормально. Просто не забывайте также трансформироваться, когда вы переходите к любым новым предсказаниям. - person Mike; 14.05.2020