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

Posted

技术标签:

【中文标题】具有特定验证数据的网格搜索【英文标题】:Grid-search with specific validation data 【发布时间】:2016-09-27 07:46:34 【问题描述】:

我正在寻找一种方法来网格搜索 sklearn 中的超参数,而不使用 K 折验证。即我希望我的网格在特定数据集(下例中的 X1,y1)上进行训练,并在特定的保留数据集(下例中的 X2,y2)上验证自己。

X1,y2 = 训练数据 X2,y2 = 验证数据

clf_ = SVC(kernel='rbf',cache_size=1000)
Cs = [1,10.0,50,100.0,]
Gammas = [ 0.4,0.42,0.44,0.46,0.48,0.5,0.52,0.54,0.56]
clf = GridSearchCV(clf_,dict(C=Cs,gamma=Gammas),
                 cv=???, # validate on X2,y2
                 n_jobs=8,verbose=10)
clf.fit(X1, y1)

【问题讨论】:

【参考方案1】:

使用 hypopt Python 包 (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))

【讨论】:

【参考方案2】:
clf = GridSearchCV(clf_,dict(C=Cs,gamma=Gammas),cv=???, # validate on X2,y2,n_jobs=8,verbose=10)

    n_jobs>1 没有任何意义。如果 n_jobs=-1 这意味着处理将使用您机器上的所有内核。如果它是 1,则只使用一个核心。

    如果 cv =5,它将为每次迭代运行五次交叉验证。

    在您的情况下,迭代总数将为 9(Cs 的大小)*5(gamma 的大小)*5(CV 的值)

      如果您使用交叉验证,保留数据以重新检查您的模型没有任何意义。如果您对性能没有信心,您可以增加 cv 以获得更好的拟合度。

这将非常耗时,尤其是对于 SVM,我宁愿建议您使用 RandomSearchCV,它允许您提供您希望模型随机选择的迭代次数。

【讨论】:

以上是关于具有特定验证数据的网格搜索的主要内容,如果未能解决你的问题,请参考以下文章

交叉验证和网格搜索有啥区别?

机器学习交叉验证和网格搜索

机器学习交叉验证和网格搜索案例分析

K-近邻算法交叉验证,网格搜索

机器学习之交叉验证和网格搜索

我应该如何拆分我的数据以进行交叉验证和网格搜索?