Python 使用sklearn为网格搜索使用显式(预定义)验证集

Python 使用sklearn为网格搜索使用显式(预定义)验证集,python,validation,scikit-learn,cross-validation,Python,Validation,Scikit Learn,Cross Validation,我有一个数据集,它以前被分为3组:训练、验证和测试。为了比较不同算法的性能,必须使用这些集合 现在我想使用验证集优化我的SVM的参数。但是,我找不到如何将验证集显式输入到sklearn.grid\u search.GridSearchCV()。下面是我以前用于在训练集上进行K-fold交叉验证的一些代码。但是,对于这个问题,我需要使用给定的验证集。我该怎么做 从sklearn导入svm,交叉验证 从sklearn.grid\u搜索导入GridSearchCV #(一些代码被省略以简化事情) sk

我有一个数据集,它以前被分为3组:训练、验证和测试。为了比较不同算法的性能,必须使用这些集合

现在我想使用验证集优化我的SVM的参数。但是,我找不到如何将验证集显式输入到
sklearn.grid\u search.GridSearchCV()
。下面是我以前用于在训练集上进行K-fold交叉验证的一些代码。但是,对于这个问题,我需要使用给定的验证集。我该怎么做

从sklearn导入svm,交叉验证
从sklearn.grid\u搜索导入GridSearchCV
#(一些代码被省略以简化事情)
skf=交叉验证。分层折叠(y\U序列,n\U折叠=5,随机播放=True)
clf=GridSearchCV(svm.SVC(tol=0.005,缓存大小=6000,
等级重量=惩罚重量),
param_grid=调整的_参数,
n_jobs=2,
pre_dispatch=“n_jobs”,
cv=skf,
得分=记分员)
clf.fit(X_系列、y_系列)
使用

然后在
GridSearchCV

测试折叠:“阵列状,形状(n个样本,)

test_fold[i]给出了样本i的测试集fold。值-1表示相应样本不是任何测试集fold的一部分,而是始终放在训练fold中

也看到

使用验证集时,对于属于验证集的所有样本,将测试倍数设置为0,对于所有其他样本,将测试倍数设置为-1


考虑使用我自己编写的
hypopt
Python包(
pip install hypopt
)。这是一个专门为参数优化创建的专业包,带有验证集。它可以与任何scikit现成的学习模型一起使用,也可以与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))

编辑:我(想我)收到此响应中的-1,因为我建议使用我编写的包。这是不幸的,因为该包是专门为解决此类问题而创建的。

hypopt是超参数搜索的一个很好的模块。问题:如何在超参数搜索中指定度量?我将“auc”、“f1”等放在哪里?我发布了d这里的问题@cgnostcutt在帖子中得到了回答,但简而言之,将hypopt包升级到最新版本1.0.7,只需使用如下评分参数“optimizer.fit”(X_train,y_train,params,X_val,y_val,scoring='f1'). @zesla@cgnorthcuttfit函数的计分参数不起作用。我无法指定计分='f1'。这是不正常的。如果需要,请提交拉取请求。@CGNorthCut我得到“ValueError:没有足够的值来解包(预期为2,得到0)”错误。GitHub问题列表中也存在相同的错误,但尚未解决。如果我们这样做,则应将
clf.fit(X\u-train,y\u-train)
替换为
clf.fit(X,y)
@edesz:如果
GridSearchCV
中的
refit=True
,那么OP应该知道他以后不能使用
GridSearchCV
实例进行预测,因为在搜索完最佳参数后,该实例将做的最后一件事是将最佳选项重新设置为
(X,y)
,但其目的实际上是在
(X\U列车,y\U列车)
上重新安装。请参阅我在接受的答案中的评论。您需要小心不要在以后使用
clf
进行预测。
# Import Libraries
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.model_selection import PredefinedSplit

# Split Data to Train and Validation
X_train, X_val, y_train, y_val = train_test_split(X, y, train_size = 0.8, stratify = y,random_state = 2020)

# Create a list where train data indices are -1 and validation data indices are 0
split_index = [-1 if x in X_train.index else 0 for x in X.index]

# Use the list to create PredefinedSplit
pds = PredefinedSplit(test_fold = split_index)

# Use PredefinedSplit in GridSearchCV
clf = GridSearchCV(estimator = estimator,
                   cv=pds,
                   param_grid=param_grid)

# Fit with all data
clf.fit(X, y)
# Import Libraries
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.model_selection import PredefinedSplit

# Split Data to Train and Validation
X_train, X_val, y_train, y_val = train_test_split(X, y, train_size = 0.8, stratify = y,random_state = 2020)

# Create a list where train data indices are -1 and validation data indices are 0
split_index = [-1 if x in X_train.index else 0 for x in X.index]

# Use the list to create PredefinedSplit
pds = PredefinedSplit(test_fold = split_index)

# Use PredefinedSplit in GridSearchCV
clf = GridSearchCV(estimator = estimator,
                   cv=pds,
                   param_grid=param_grid)

# Fit with all data
clf.fit(X, y)