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

标签 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: 'generator' 类型的对象没有 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)

关于python - 如何使用带有 GridSearchCV 对象的 TimeSeriesSplit 来调整 scikit-learn 中的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46732748/

相关文章:

python - 我将如何使用 XGBoost 构建自己的评估指标来最大限度地减少高度不平衡类的测试错误?

python - xgboost CV和树数

python - 列表中最小的 n 个数字

python - 使用来自 pandas DataFrame 的数据拟合 sklearn 的 SVM 分类器

r - XGBoost 是否区分 R 中稀疏矩阵中的缺失值和 0?

python - 多类逻辑分类中的 Predicted_proba

python - 使用 Sklearn 库的 StandardScaler 缩放目标变量在 Python 中出错

python - 如何在 Web 应用程序外部加载 Django 模板?

python混合单双unicode转义序列

python - pandas DataFrame 列中值的频率计数