У меня есть вопрос о параметре cv
в GridSearchCV
sklearn. .
Я работаю с данными, в которых есть временной компонент, поэтому я не думаю, что случайное перемешивание в рамках перекрестной проверки KFold кажется разумным.
Вместо этого я хочу явно указать ограничения для данных обучения, проверки и тестирования в GridSearchCV
. Я могу это сделать?
Чтобы лучше прояснить вопрос, вот как я бы сделал это вручную.
import numpy as np
import pandas as pd
from sklearn.linear_model import Ridge
np.random.seed(444)
index = pd.date_range('2014', periods=60, freq='M')
X, y = make_regression(n_samples=60, n_features=3, random_state=444, noise=90.)
X = pd.DataFrame(X, index=index, columns=list('abc'))
y = pd.Series(y, index=index, name='y')
# Train on the first 30 samples, validate on the next 10, test on
# the final 10.
X_train, X_val, X_test = np.array_split(X, [35, 50])
y_train, y_val, y_test = np.array_split(y, [35, 50])
param_grid = {'alpha': np.linspace(0, 1, 11)}
model = None
best_param_ = None
best_score_ = -np.inf
# Manual implementation
for alpha in param_grid['alpha']:
ridge = Ridge(random_state=444, alpha=alpha).fit(X_train, y_train)
score = ridge.score(X_val, y_val)
if score > best_score_:
best_score_ = score
best_param_ = alpha
model = ridge
print('Optimal alpha parameter: {:0.2f}'.format(best_param_))
print('Best score (on validation data): {:0.2f}'.format(best_score_))
print('Test set score: {:.2f}'.format(model.score(X_test, y_test)))
# Optimal alpha parameter: 1.00
# Best score (on validation data): 0.64
# Test set score: 0.22
Процесс здесь следующий:
- И для X, и для Y мне нужен набор для обучения, набор для проверки и набор для тестирования. Обучающая выборка - это первые 35 выборок во временном ряду. Набор для валидации - это следующие 15 образцов. Набор тестов - финальный 10.
- Наборы для обучения и проверки используются для определения оптимального параметра
alpha
в рамках регрессии Риджа. Здесь я тестируюalpha
s из (0,0, 0,1, ..., 0,9, 1,0). - Набор тестов предназначен для «фактического» тестирования в виде невидимых данных.
В любом случае ... Похоже, я хочу сделать что-то подобное, но я не уверен, что передать cv
здесь:
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(Ridge(random_state=444), param_grid, cv= ???)
grid_search.fit(...?)
В документах, которые у меня возникают проблемы с интерпретацией, указывается:
cv
: int, генератор перекрестной проверки или итерируемый, необязательныйОпределяет стратегию разделения перекрестной проверки. Возможные исходные данные для cv:
- Нет, чтобы использовать трехкратную перекрестную проверку по умолчанию,
- целое число, чтобы указать количество складок в (стратифицированной) KFold,
- Объект, который будет использоваться в качестве генератора перекрестной проверки.
- Итерируемый доходный поезд, тестовые расщепления.
Для входных значений типа integer / None, если оценщик является классификатором, а y является двоичным или многоклассовым, используется StratifiedKFold. Во всех остальных случаях используется KFold.