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

Posted

技术标签:

【中文标题】Python,机器学习 - 对自定义验证集执行网格搜索【英文标题】:Python, machine learning - Perform a grid search on custom validation set 【发布时间】:2017-10-01 13:51:43 【问题描述】:

我正在处理一个不平衡的分类问题,我的负类比我的正类多 1000 倍。我的策略是在平衡(50/50 比率)训练集(我有足够的模拟样本)上训练深度神经网络,然后使用不平衡(1/1000 比率)验证集来选择最佳模型并优化超参数.

由于参数数量很大,我想使用scikit-learn RandomizedSearchCV,即随机网格搜索。

据我了解,sk-learn GridSearch 在训练集上应用一个指标来选择最佳的超参数集。然而,在我的例子中,这意味着 GridSearch 将选择对 平衡 训练集表现最佳的模型,而不是对更现实的不平衡数据。

我的问题是:有没有办法在特定的、用户定义的验证集上使用估计的性能进行网格搜索?

【问题讨论】:

也许 PredefinedSplit 是您需要的 - 阅读更多 here。将此传递给 RandomizedSearchCV 或 GridSearchCV 的 cv 参数。 看起来是这样。万分感谢!顺便说一句,使用“PredefinedSplit”关键字我可以找到a similar *** question。我可以选择您的评论作为接受的答案吗? Using explict (predefined) validation set for grid search with sklearn的可能重复 不需要。如果对您有帮助,请在此处投票赞成该答案。如果在实施过程中有任何疑问或困难,请在此处评论更新问题。 确实是重复的,我会这样标记的。但在那之前:我在使用 PredefinedSplit 方法时遇到了麻烦,我真的不明白它是如何工作的。如果我有例如numpy 数组:X_train、Y_train、X_test、Y_test,我该如何使用该方法? 【参考方案1】:

根据 cmets 的建议,您需要的是 PredefinedSplit。在question here中有描述

关于工作,您可以查看文档中给出的示例:

from sklearn.model_selection import PredefinedSplit
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([0, 0, 1, 1])

#This is what you need
test_fold = [0, 1, -1, 1]

ps = PredefinedSplit(test_fold)
ps.get_n_splits()
#OUTPUT
2

for train_index, test_index in ps.split():
   print("TRAIN:", train_index, "TEST:", test_index)
   X_train, X_test = X[train_index], X[test_index]
   y_train, y_test = y[train_index], y[test_index]

#OUTPUT
TRAIN: [1 2 3] TEST: [0]
TRAIN: [0 2] TEST: [1 3]

正如您在此处看到的,您需要为test_fold 分配一个索引列表,用于拆分数据。 -1 将用于不包含在验证集中的样本索引。

所以在上面的代码中,test_fold = [0, 1, -1, 1] 表示在第一个验证集中(样本中的索引,test_fold 中的值 =0),索引 0。第二个是 test_fold 的值 =1,所以索引 1 和3.

但是当你说你有X_trainX_test时,如果你想要你的验证集只来自X_test,那么你需要做以下事情:

my_test_fold = []

# put -1 here, so they will be in training set
for i in range(len(X_train)):
    my_test_fold.append(-1)

# for all greater indices, assign 0, so they will be put in test set
for i in range(len(X_test)):
    my_test_fold.append(0)

#Combine the X_train and X_test into one array:
import numpy as np

clf = RandomizedSearchCV( ...    cv = PredefinedSplit(test_fold=my_test_fold))
clf.fit(np.concatenate((X_train, X_test), axis=0), np.concatenate((y_train, y_test), axis=0))

【讨论】:

以上是关于Python,机器学习 - 对自定义验证集执行网格搜索的主要内容,如果未能解决你的问题,请参考以下文章

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

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

机器学习:交叉验证,网络搜索

对自定义属性执行客户端验证

机器学习基础:(Python)训练集测试集分割与交叉验证

使用 PyTorch 和 TorchVision 对自定义数据集进行训练-有效-测试拆分