0

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

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

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

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

那是正确的方法吗?

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

谢谢你的帮助!约安

4

1 回答 1

0

我不确定我的代码在这里是否会有所帮助,因为我的问题相当笼统。

这是我通过 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%)。

我更喜欢在我的估计器的 fit 函数中访问它,这样我就可以使用它来绘制训练步骤的验证准确性并提前停止(我将为此保留一个单独的验证集)。

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

如果这是某人已经做过的事情,我很想听听!

于 2018-02-13T15:25:39.650 回答