如何使用带有GridSearchCV对象的TimeSeriesSplit来调整scikit-learn中的模型?

时间:2017-10-13 14:56:51

标签: python scikit-learn xgboost

我已经搜索了sklearn docs for TimeSeriesSplitdocs 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,交叉验证生成器或可迭代的可选

我尝试使用TimeSeriesSplit而不使用.split(X),但它仍然无效。

我确定我忽视了一些简单的事情,谢谢!!

1 个答案:

答案 0 :(得分:14)

事实证明问题是我使用了来自GridSearchCV的{​​{1}},这已被弃用。从sklearn.grid_search导入GridSearchCV解决了问题:

sklearn.model_selection

给出:

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])
tscv = TimeSeriesSplit(n_splits=2)

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)