【发布时间】:2018-07-01 14:47:53
【问题描述】:
我对sklearn的GridSearchCV的cv参数有疑问。
我正在处理具有时间成分的数据,因此我认为 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 个。
- 训练集和验证集用于确定 Ridge 回归中的最佳
alpha参数。这里我测试了alphas (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,交叉验证生成器或可迭代的,可选的确定交叉验证拆分策略。可能的输入 简历是:
- 无,使用默认的三折交叉验证,
- 整数,用于指定(分层)KFold 中的折叠数,
- 用作交叉验证生成器的对象。
- 可迭代的屈服训练,测试拆分。
对于整数/无输入,如果估计器是分类器并且 y 是 使用二元或多类,StratifiedKFold。在所有其他 情况下,使用 KFold。
【问题讨论】:
标签: python scikit-learn grid-search