Как правильно использовать Scaler при использовании GridSearchCV с TimeSeriesSplit - PullRequest
0 голосов
/ 21 июня 2019

В настоящее время я использую GridSearchCV и TimeSeriesSplit, например, так, чтобы мои данные были разделены на 5 разделений CV.

X = data.iloc[:, 0:8]
y = data.iloc[:, 8:9]

SVR_parameters = [{'kernel': ['rbf'],
               'gamma': [.01,.001,1],
               'C': [1,100]}]

gsc = GridSearchCV(SVR(), param_grid=SVR_parameters, scoring='neg_mean_squared_error',
                cv=TimeSeriesSplit(n_splits=5).split(X), verbose=10, n_jobs=-1, refit=True)
gsc.fit(X, y)
gsc_dataframe = pd.DataFrame(gsc.cv_results_)

Насколько я понимаю, когда вы используете скалер, вы хотитеустановите ваш инструмент для масштабирования только на тренировочном наборе и преобразуйте набор тестов с этим объектом для масштабирования, чтобы предотвратить утечку данных, в общем, что-то вроде этого:

            scaler_X = StandardScalar()
            scaler_y = StandardScalar()
            scaler_X.fit(X_train)
            scaler_y.fit(y_train)
            X_train, X_test = scaler_X.transform(X_train), scaler_X.transform(X_test)
            y_train, y_test = scaler_y.transform(y_train), scaler_y.transform(y_test)

Мой вопрос: если я выполняю этот тип операции масштабированияКак бы я мог получить GridSearchCV, чтобы разделить на весь мой набор данных?Если бы я просто заменил переменную X в объекте gsc на X_train - это исключило бы X_test, верно?

Мне интересно, есть ли правильный способ масштабирования данных при использовании всего этого в GridSearchCV

Надеюсь, я объяснил это достаточно ясно.Пожалуйста, дайте мне знать, если вам нужно что-то прояснить.


Обновление:

добавление полного кода, чтобы помочь объяснить лучше

X = data.iloc[:, 0:8]
y = data.iloc[:, 8:9]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.25, shuffle=False)

test_index = X_test.index.values.tolist()

scaler_x = StandardScaler()
scaler_y = StandardScaler()
scaler_x.fit(X_train)
scaler_y.fit(y_train)

X_train, X_test = scaler_x.transform(X_train), scaler_x.transform(X_test)
y_train, y_test = scaler_y.transform(y_train), scaler_y.transform(y_test)




SVR_parameters = [{'kernel': ['rbf'],
               'gamma': [.1, .01, .001],
               'C': [100,500,1000]}]

gsc = GridSearchCV(SVR(), param_grid=SVR_parameters, scoring='neg_mean_squared_error',
   cv=TimeSeriesSplit(n_splits=5).split(X_train),verbose=10, n_jobs=-1, refit=True)

gsc.fit(X_train, y_train)
gsc_dataframe = pd.DataFrame(gsc.cv_results_)
y_pred = gsc.predict(X_test)
y_pred = scaler_y.inverse_transform(y_pred)
y_test = scaler_y.inverse_transform(y_test)
mae = round(metrics.mean_absolute_error(y_test,y_pred),2)
mse = round(metrics.mean_squared_error(y_test, y_pred),2)
y_df = pd.DataFrame(index=pd.to_datetime(test_index))
y_pred = y_pred.reshape(len(y_pred), )
y_test = y_test.reshape(len(y_test), )
y_df['Model'] = y_pred
y_df['Actual'] = y_test
y_df.plot(title='{}'.format(gsc.cv_results_['params'][gsc.best_index_]))

1 Ответ

1 голос
/ 22 июня 2019

Использовать конвейер (https://scikit -learn.org / stable / modules / generate / sklearn.pipeline.Pipeline.html ):

pipe = Pipeline([
        ('scale', StandardScaler()),
        ('clf', SVR())])

param_grid = dict(clf__gamma = [.01,.001,1],
                  clf__C = [1,100],
                  clf__kernel = ['rbf','linear'])

gsc = GridSearchCV(pipe, param_grid = param_grid, scoring='neg_mean_squared_error',
            cv=TimeSeriesSplit(n_splits=5).split(X), verbose=10, n_jobs=-1, refit=True)

gsc.fit(X,y)
print(gsc.best_estimator_)

См. Также этот пост для шагов за кулисами: Применение StandardScaler в конвейере в Scikit-Learn (Sklearn)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...