使用单独的预定义验证集和 sklearn GridSearchCV

Posted

技术标签:

【中文标题】使用单独的预定义验证集和 sklearn GridSearchCV【英文标题】:Using separate predefined Validation Set with sklearn GridSearchCV 【发布时间】:2018-11-24 07:42:39 【问题描述】:

我正在 RandomForestClassifier 上运行 Sklearn 库中的 GridSearchCV(网格搜索交叉验证)。 我想使用我已经获得并先前保存在磁盘上的单独 numpy 数组上的训练/验证/测试拆分(即,为了某些测试的兼容性,我将不得不与同一拆分上的其他算法做)。

我找不到将我的单独验证集与 GridSearchCV 一起使用的方法。我发现的唯一解决方法是在一个新的 numpy 数组上使用 PredefinedSplit,在该数组中连接从保存的文件加载的原始火车和验证数组。

ts_train = extractPlainTable(np.load('TimeSeries/train_x%d_30.npy' % i),s)
ts_val = extractPlainTable(np.load('TimeSeries/validation_x%d_20.npy' % i),s)
ts_test = extractPlainTable(np.load('TimeSeries/test_x%d_30.npy' % i),s)


labels_train = np.load('ground_truth/train_y%d_30.npy' % i)
labels_val = np.load('ground_truth/validation_y%d_20.npy' % i)
labels_test = np.load('ground_truth/test_y%d_30.npy' % i)

clf =  RandomForestClassifier()

merged_ts = np.concatenate((ts_train,ts_val),axis=0)
merged_labels = np.concatenate((labels_train,labels_val),axis=0)
mytestfold = []
for i in range(len(ts_train)):
    mytestfold.append(-1)
for i in range(len(ts_val)):
    mytestfold.append(0)


ps = PredefinedSplit(test_fold=mytestfold)

grid_search = GridSearchCV(estimator=clf, param_grid=param_grid,cv=ps)
grid_search.fit(merged_ts, merged_labels)

有没有更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

您可以传递带有一对 train/val 索引的可迭代对象。

split = [(range(len(ts_train)), range(len(ts_train), len(ts_train) + len(ts_val)))]
grid_search = GridSearchCV(estimator=clf, param_grid=param_grid, cv=split)
grid_search.fit(merged_ts, merged_labels)

【讨论】:

是的,但这并不能避免创建合并版本(这就是我想要做的:))

以上是关于使用单独的预定义验证集和 sklearn GridSearchCV的主要内容,如果未能解决你的问题,请参考以下文章

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

sklearn:绘制跨训练+测试集组合的混淆矩阵

Python 中的逻辑回归和交叉验证(使用 sklearn)

基于sklearn和keras的数据切分与交叉验证

Sklearn-CrossValidation 交叉验证

是否需要将数据一分为三;训练、验证和测试?