Mil*_*ros 2 python validation machine-learning scikit-learn grid-search
我正在处理一个不平衡的分类问题,我的否定类比我的肯定类多1000倍。我的策略是在平衡(50/50比率)训练集(我有足够的模拟样本)上训练深度神经网络,然后使用不平衡(1/1000比率)验证集选择最佳模型并优化超参数。
由于参数数量很大,因此我想使用scikit-learn RandomizedSearchCV,即随机网格搜索。
据我了解,sk-learn GridSearch在训练集上应用了一个指标,以选择最佳的超参数集。但是,在我的情况下,这意味着GridSearch将选择对均衡训练集而不是对更现实的不均衡数据表现最佳的模型。
我的问题是:有没有一种方法可以对在特定的,用户定义的验证集上估算的性能进行网格搜索?
如注释中所建议,您需要的是PredefinedSplit。问题在这里描述
关于工作,您可以查看文档中给出的示例:
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]
Run Code Online (Sandbox Code Playgroud)
如您在此处看到的,您需要分配test_fold一个索引列表,该列表将用于拆分数据。-1将用于样本索引,这些样本不包含在验证集中。
因此,在上面的代码中,test_fold = [0, 1, -1, 1]说在第一个验证集中(样本中的索引,其值= 0 in test_fold),索引为0。第二个是test_fold的值为= 1,因此索引为1和3。
但是当您说有X_train和时X_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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1900 次 |
| 最近记录: |