使用预定义的验证集 Sklearn 执行网格搜索

Posted

技术标签:

【中文标题】使用预定义的验证集 Sklearn 执行网格搜索【英文标题】:Performing grid search with a predefined validation set Sklearn 【发布时间】:2018-01-22 11:49:39 【问题描述】:

这个问题已经被问过好几次了。但是当我按照答案时出现错误

首先我如下指定哪一部分是训练集和验证集。

my_test_fold = []


for i in range(len(train_x)):
    my_test_fold.append(-1)

 for i in range(len(test_x)):
    my_test_fold.append(0)

然后执行gridsearch。

from sklearn.model_selection import PredefinedSplit
param = 
 'n_estimators':[200],
 'max_depth':[5],
 'min_child_weight':[3],
 'reg_alpha':[6],
    'gamma':[0.6],
    'scale_neg_weight':[1],
    'learning_rate':[0.09]





gsearch1 = GridSearchCV(estimator = XGBClassifier( 
    objective= 'reg:linear', 
    seed=1), 
param_grid = param, 
scoring='roc_auc',
cv = PredefinedSplit(test_fold=my_test_fold),
verbose = 1)


gsearch1.fit(new_data_df, df_y)

但我收到以下错误

 object of type 'PredefinedSplit' has no len()

【问题讨论】:

【参考方案1】:

尝试替换

cv = PredefinedSplit(test_fold=my_test_fold)

cv = list(PredefinedSplit(test_fold=my_test_fold).split(new_data_df, df_y))

原因是您可能需要应用split method 才能真正拆分为训练和测试(然后将其从可迭代对象转换为列表对象)。

【讨论】:

【参考方案2】:

hypopt Python package (pip install hypopt),我是其作者,正是为此目的而创建的:使用验证集进行参数优化。它适用于 scikit-learn 模型,可与 Tensorflow、PyTorch、Caffe2 等一起使用。

# Code from https://github.com/cgnorthcutt/hypopt
# Assuming you already have train, test, val sets and a model.
from hypopt import GridSearch
param_grid = [
  'C': [1, 10, 100], 'kernel': ['linear'],
  'C': [1, 10, 100], 'gamma': [0.001, 0.0001], 'kernel': ['rbf'],
 ]
# Grid-search all parameter combinations using a validation set.
opt = GridSearch(model = SVR(), param_grid = param_grid)
opt.fit(X_train, y_train, X_val, y_val)
print('Test Score for Optimized Parameters:', opt.score(X_test, y_test))

编辑:hyopt 是否发生了一些变化,导致最近突然出现了否决票?一些反馈会有所帮助,因为 hypopt 解决了这个确切的问题,如果有问题,我们应该解决它。

【讨论】:

hyout 是否允许指定管道而不仅仅是分类器? 只要定义了.score().pred().pred_proba().fit() 终于想通了。谢谢:)

以上是关于使用预定义的验证集 Sklearn 执行网格搜索的主要内容,如果未能解决你的问题,请参考以下文章

Python,机器学习 - 对自定义验证集执行网格搜索

管道和网格搜索的 SKLearn 错误

具有特定验证数据的网格搜索

调参-网格搜索(Grid Search)

在 sklearn 中使用网格搜索和管道获得正确的交叉验证分数

我是不是需要同时执行网格搜索(使用交叉验证)和交叉验证方法?