如何使用RandomizedSearchCV交叉验证拆分数据

时间:2018-02-09 19:27:26

标签: scikit-learn cross-validation hyperparameters

我正在尝试使用RandomizedSearchCV将我的模型从单次运行转移到超参数调整。

在我的单一运行案例中,我的数据被分成训练/验证/测试数据。

当我在train_data上使用默认的3倍CV运行RandomizedSearchCV时,我注意到我的train_input的长度减少到train_data的66%(这在3倍CV中是有意义的......)。

所以我猜我应该将我的初始训练和验证集合并到一个更大的训练集中,让RandomizedSearchCV将它分成训练集和验证集。

这是正确的方法吗?

我的问题是:如何访问我的train_input的剩余33%以将其提供给我的验证准确度测试功能(请注意我的分数功能是在测试集上运行的)?

感谢您的帮助! 约恩

1 个答案:

答案 0 :(得分:-1)

我不确定我的代码会对此有所帮助,因为我的问题非常通用。

这是我通过浏览sklearn的代码找到的答案:RandomizedSearchCV不会以简单的方式返回分裂的验证数据,我绝对应该将我的初始列车和验证集合并到更大的列车集中,并让RandomizedSearchCV拆分它进入训练和验证集。

使用交叉验证器将train_data拆分为CV用于列车/验证集(在我的情况下,分层K-Folds http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html

我的估算器定义如下:

class DNNClassifier(BaseEstimator, ClassifierMixin):

需要评分函数才能评估验证集上的CV性能。在ClassifierMixin类中定义了一个默认评分函数(返回平均准确度,需要在Estimator类中实现预测函数)。

就我而言,我在估算器类中实现了自定义分数功能。

超参数搜索和CV拟合完成调用RandomizedSearchCV的拟合函数。

RandomizedSearchCV(DNNClassifier(), param_distribs).fit(train_data)

此拟合函数在火车组上运行估算器的自定义拟合函数,然后在验证集上运行评分函数。

这是使用._validation库中的_fit_and_score函数完成的。

所以我可以在估算器拟合函数的末尾访问自动分割的验证集(我的train_data输入的33%)。

我更愿意在我的估算器的拟合函数中访问它,以便我可以使用它来绘制验证准确性而不是训练步骤和早期停止(我会为此保留一个单独的验证集)。

我想我可以通过从我的初始train_data中查找缺失的索引来重建自动生成的验证集(估算器的拟合函数中使用的train_data具有初始train_data的66%的索引)。

如果这是某人已经做过的事情,我很乐意听到它!