2017-10-13 499 views
3

我已经搜索了sklearn docs for TimeSeriesSplitdocs for cross-validation,但我一直未能找到一个工作示例。如何使用TimeSeriesSplit和GridSearchCV对象在scikit-learn中调整模型?

我正在使用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

尝试使用'my_cv = [(火车,测试),用于火车,测试在TimeSeriesSplit(n_splits = 2).split(X) ]' –

+0

这工作,谢谢!但是,该函数不应该与迭代器一起工作吗?当观察次数很多时(如果折叠次数较多,我会更糟糕),我宁愿不要在内存中保存那些大阵列 – cd98

+1

是的。你应该在scikit-learn github页面上发布一个问题。 –

回答

4

事实证明,问题是我使用sklearn.grid_searchGridSearchCV,这已被弃用。从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]) 
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) 

给出:

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) 
相关问题