如何使用带有 GridSearchCV 对象的 TimeSeriesSplit 来调整 scikit-learn 中的模型?
How do I use a TimeSeriesSplit with a GridSearchCV object to tune a model in scikit-learn?
我已经搜索了 sklearn docs for TimeSeriesSplit
and the docs for cross-validation,但没能找到有效的示例。
我正在使用 sklearn 版本 0.19。
这是我的设置
import xgboost as xgb
from sklearn.model_selection import TimeSeriesSplit
from sklearn.grid_search import GridSearchCV
import numpy as np
X = np.array([[4, 5, 6, 1, 0, 2], [3.1, 3.5, 1.0, 2.1, 8.3, 1.1]]).T
y = np.array([1, 6, 7, 1, 2, 3])
tscv = TimeSeriesSplit(n_splits=2)
for train, test in tscv.split(X):
print(train, test)
给出:
[0 1] [2 3]
[0 1 2 3] [4 5]
如果我尝试:
model = xgb.XGBRegressor()
param_search = {'max_depth' : [3, 5]}
my_cv = TimeSeriesSplit(n_splits=2).split(X)
gsearch = GridSearchCV(estimator=model, cv=my_cv,
param_grid=param_search)
gsearch.fit(X, y)
它给出:TypeError: object of type 'generator' has no len()
我遇到了问题:GridSearchCV
正在尝试调用 len(cv)
但 my_cv
是一个没有长度的迭代器。但是, docs for GridSearchCV
状态我可以使用
int, cross-validation generator or an iterable, optional
我试过在没有 .split(X)
的情况下使用 TimeSeriesSplit
,但它仍然不起作用。
我确定我忽略了一些简单的事情,谢谢!!
原来问题是我使用的是 sklearn.grid_search
中的 GridSearchCV
,它已被弃用。从 sklearn.model_selection
导入 GridSearchCV
解决了问题:
import xgboost as xgb
from sklearn.model_selection import TimeSeriesSplit, GridSearchCV
import numpy as np
X = np.array([[4, 5, 6, 1, 0, 2], [3.1, 3.5, 1.0, 2.1, 8.3, 1.1]]).T
y = np.array([1, 6, 7, 1, 2, 3])
model = xgb.XGBRegressor()
param_search = {'max_depth' : [3, 5]}
tscv = TimeSeriesSplit(n_splits=2)
gsearch = GridSearchCV(estimator=model, cv=tscv,
param_grid=param_search)
gsearch.fit(X, y)
给出:
GridSearchCV(cv=<generator object TimeSeriesSplit.split at 0x11ab4abf8>,
error_score='raise',
estimator=XGBRegressor(base_score=0.5, colsample_bylevel=1, colsample_bytree=1, gamma=0,
learning_rate=0.1, max_delta_step=0, max_depth=3,
min_child_weight=1, missing=None, n_estimators=100, nthread=-1,
objective='reg:linear', reg_alpha=0, reg_lambda=1,
scale_pos_weight=1, seed=0, silent=True, subsample=1),
fit_params=None, iid=True, n_jobs=1,
param_grid={'max_depth': [3, 5]}, pre_dispatch='2*n_jobs',
refit=True, return_train_score=True, scoring=None, verbose=0)
我已经搜索了 sklearn docs for TimeSeriesSplit
and the docs for cross-validation,但没能找到有效的示例。
我正在使用 sklearn 版本 0.19。
这是我的设置
import xgboost as xgb
from sklearn.model_selection import TimeSeriesSplit
from sklearn.grid_search import GridSearchCV
import numpy as np
X = np.array([[4, 5, 6, 1, 0, 2], [3.1, 3.5, 1.0, 2.1, 8.3, 1.1]]).T
y = np.array([1, 6, 7, 1, 2, 3])
tscv = TimeSeriesSplit(n_splits=2)
for train, test in tscv.split(X):
print(train, test)
给出:
[0 1] [2 3]
[0 1 2 3] [4 5]
如果我尝试:
model = xgb.XGBRegressor()
param_search = {'max_depth' : [3, 5]}
my_cv = TimeSeriesSplit(n_splits=2).split(X)
gsearch = GridSearchCV(estimator=model, cv=my_cv,
param_grid=param_search)
gsearch.fit(X, y)
它给出:TypeError: object of type 'generator' has no len()
我遇到了问题:GridSearchCV
正在尝试调用 len(cv)
但 my_cv
是一个没有长度的迭代器。但是, docs for GridSearchCV
状态我可以使用
int, cross-validation generator or an iterable, optional
我试过在没有 .split(X)
的情况下使用 TimeSeriesSplit
,但它仍然不起作用。
我确定我忽略了一些简单的事情,谢谢!!
原来问题是我使用的是 sklearn.grid_search
中的 GridSearchCV
,它已被弃用。从 sklearn.model_selection
导入 GridSearchCV
解决了问题:
import xgboost as xgb
from sklearn.model_selection import TimeSeriesSplit, GridSearchCV
import numpy as np
X = np.array([[4, 5, 6, 1, 0, 2], [3.1, 3.5, 1.0, 2.1, 8.3, 1.1]]).T
y = np.array([1, 6, 7, 1, 2, 3])
model = xgb.XGBRegressor()
param_search = {'max_depth' : [3, 5]}
tscv = TimeSeriesSplit(n_splits=2)
gsearch = GridSearchCV(estimator=model, cv=tscv,
param_grid=param_search)
gsearch.fit(X, y)
给出:
GridSearchCV(cv=<generator object TimeSeriesSplit.split at 0x11ab4abf8>,
error_score='raise',
estimator=XGBRegressor(base_score=0.5, colsample_bylevel=1, colsample_bytree=1, gamma=0,
learning_rate=0.1, max_delta_step=0, max_depth=3,
min_child_weight=1, missing=None, n_estimators=100, nthread=-1,
objective='reg:linear', reg_alpha=0, reg_lambda=1,
scale_pos_weight=1, seed=0, silent=True, subsample=1),
fit_params=None, iid=True, n_jobs=1,
param_grid={'max_depth': [3, 5]}, pre_dispatch='2*n_jobs',
refit=True, return_train_score=True, scoring=None, verbose=0)