我有一个关于sklearn的
我正在处理具有时间组件的数据,因此我认为在KFold交叉验证中进行随机洗牌似乎不明智。
相反,我想在
为了更好地阐明这个问题,这是我手动执行的方法。
这里的流程如下:
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个。
- 使用训练集和验证集来确定岭回归中最优的alpha参数。在这里,我测试了alphas的值为(0.0,0.1,...,0.9,1.0)。
- 测试集被保留为“实际”测试数据,作为未看到的数据。
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(Ridge(random_state=444), param_grid, cv= ???)
grid_search.fit(...?)
我遇到了解释困难的文档,其中规定:
cv
: 整数,交叉验证生成器或可迭代对象,可选参数确定交叉验证分割策略。cv 的可能输入为:
- None,使用默认的3折交叉验证,
- 整数,指定(Stratified)KFold中的折数,
- 用作交叉验证生成器的对象,
- 产生训练集和测试集分割的可迭代对象。
对于整数/None输入,如果评估器是分类器且 y 是二元或多元分类,则使用 StratifiedKFold。在所有其他情况下,使用 KFold。