Использование GridSearchCV с TimeSeriesSplit - PullRequest
0 голосов
/ 11 июня 2019

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

Я понимаю, что GridSearchCV сделает для меня большую часть этой работы. Мне интересно, если я использую следующий код, где мои данные делятся на X_train, X_test, y_train и y_test? Будет ли использование GridSearchCV с TimeSeriesSplit обрабатывать это за кулисами, и если да, будет ли этот код выполнять то же самое, что и мой оригинальный код в нижней части этого поста? Кроме того, теперь я попробовал метод GridSearchCV, и это было почти 30 минут без завершения - у меня есть правильный синтаксис?

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

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

gsc = GridSearchCV(SVR(), param_grid=parameters, scoring='neg_mean_absolute_error', 
                   cv=TimeSeriesSplit(n_splits=2))
gsc.fit(X,y)
means = gsc.cv_results_['mean_test_score']
for mean in means:
    print(mean)
print('end')

Оригинальный код ниже:

# Create the time series split generator
tscv = TimeSeriesSplit(n_splits=3)

for train_index, test_index in tqdm(tscv.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]

# scale the data set
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)


# optimization area - set params
parameters = [
    {'kernel': ['rbf'],
     'gamma': [.01],
     'C': [ 1,10,100,500,1000]}]


regressor = SVR()
# loop through each of the parameters and find the best set
for e, g in enumerate(ParameterGrid(parameters)):
    regressor.set_params(**g)
    regressor.fit(X_train, y_train.ravel())
    score = metrics.mean_absolute_error(regressor.predict(X_train), y_train.ravel())
    if e == 0:
        best_score = score
        best_params = g
    elif score < best_score:
        best_score = score
        best_params = g


# refit the model with the best set of params

regressor.set_params(**best_params)
regressor.fit(X_train, y_train.ravel())

1 Ответ

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

Вам нужно немного изменить код.

gsc = GridSearchCV(SVR(), param_grid=parameters, scoring='neg_mean_absolute_error', 
                   cv=TimeSeriesSplit(n_splits=2).split(X))

И, вы можете рассмотреть возможность добавления параметра verbose, чтобы посмотреть текущие результаты.

...