Итак, я изначально пытался работать с временным рядом и предварительно выполнить поиск по сетке. Я заметил, что GridSearchCV
использует перекрестную проверку в k-кратном размере, которая выбирает случайные тесты / цепочки, которые не имеют большого смысла для данных временных рядов. В результате я попытался кодировать его сам, используя TimeSeriesSplit
и внутри каждого разбиения, просматривая параметры в ParameterGrid
.
Код здесь:
def find_optimal_paramters(self, X, y, regressor, parameters, scoring_metric='MAE', greater_is_better=False):
score_methods = {'MAE': metrics.mean_absolute_error,
'MSE': metrics.mean_squared_error,
'MSLE': metrics.mean_squared_log_error,
'r_qsuqred': metrics.r2_score}
scoring_metric = score_methods[scoring_metric]
# check if parameter list is empty and run return default params if so
if not parameters:
best_params = regressor.get_params()
best_score = 0
for e, p in enumerate(ParameterGrid(parameters)):
regressor.set_params(**p)
regressor.fit(X, y.ravel())
score = scoring_metric(regressor.predict(X), y)
if e == 0:
best_score = score
best_params = p
if greater_is_better:
if score > best_score:
best_score = score
best_params = p
elif score < best_score:
best_score = score
best_params = p
return best_score, best_params
Я недавно узнал, что могу передать TimeSeriesSplit
параметру cv
GridSearchCV
, поэтому я пытаюсь использовать его, поскольку он более проверен, чем моя ручная версия, и, вероятно, будет работать быстрее.
gsc = GridSearchCV(RandomForestRegressor(), param_grid=RF_params, scoring=scorers,
cv=TimeSeriesSplit(n_splits=5).split(X), verbose=10, n_jobs=-1, refit='mse')
Одна вещь, которую я смог добавить вручную, - это график каждого из моих разделений, чтобы увидеть, как наилучший параметр предварительно формировался на каждом из тестовых разделений, чтобы я мог визуально увидеть производительность. Мне интересно, есть ли способ сделать это, используя GridSearchCV
. Похоже, вы можете построить график результатов, но я не нашел ничего, что позволило бы мне повторить этот тип вывода: