我正在处理一个不平衡的分类问题,我的消极类是积极类的1000倍。我的策略是在平衡(50/50比率)训练集(我有足够的模拟样本)上训练一个深层神经网络,然后使用非平衡(1/1000比率)验证集来选择最佳模型并优化超参数。
由于参数的数量是重要的,我想使用scikit-learn RandomizedSearchCV,即随机网格搜索。
据我所知,sk learn GridSearch对训练集应用一个度量来选择最佳的超参数集。然而,在我的例子中,这意味着GridSearch将选择对均衡训练集表现最好的模型,而不是对更实际的不均衡数据。
我的问题是:有没有一种方法可以在特定的、用户定义的验证集上使用性能评估来进行网格搜索?

最佳答案

正如评论中所建议的,您需要的是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。第二个是测试折叠的值为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))

08-24 21:36