对数据集样本进行超参数调整是个坏主意吗?

机器算法验证 机器学习 交叉验证 超参数
2022-02-05 09:15:13

我有一个包含 140000 个示例和 30 个特征的数据集,我正在为此训练几个分类器以进行二元分类(SVM、Logistic 回归、随机森林等)

在许多情况下,使用网格或随机搜索对整个数据集进行超参数调整的时间成本太高。

我开始使用以下技术

  • 子样本我的数据集
  • 使用获得的分数来调整超参数
  • 使用获得的参数使用整个数据集训练模型

为了评估第二步中的每组参数,我使用sklearn'sGridSearchCV和 cv=10。为了评估我在第三步中创建的最终模型,我使用sklearn's cross_val_predict从这个意义上说,我评估我的模型,留下 10% 的数据,我对其余的数据进行训练并测量 10% 的预测准确性,迭代 10 次,然后取分数的平均值。

让我担心的是,我从整个数据集的训练中获得的预测准确度非常接近我在为最佳参数集调整参数时得到的评估(每个测试的参数集输出从平均 10- 获得的分数)折叠交叉验证结果)。

大多数情况下,cross_val_predict使用所有训练示例(整个数据集)测量的准确度略高于对最佳参数的评估返回的准确度。

为了说明这一点,这里是对一组参数的评估(在比我上面描述的更小的数据集上,但效果是一样的)

Best parameters set found on development set:
{'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
Scores for all sets of parameters
0.851 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.5}
0.852 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.1}
0.829 (+/-0.006) for {'kernel': 'rbf', 'C': 3, 'gamma': 0.001}
0.853 (+/-0.006) for {'kernel': 'rbf', 'C': 9, 'gamma': 0.1}
...

这是cross_val_predict我使用最佳参数对整个数据集进行训练时得到的平均分数(来自 )

precision    recall  f1-score   support

      0       0.86      0.85      0.86     15417
      1       0.86      0.87      0.87     16561

avg / total       0.86      0.86      0.86     31978

acc score: 0.863750078179
roc au score: 0.863370490059
[[13147  2270]
 [ 2087 14474]]

如您所见,对整个数据集的训练可以改善结果。我还验证了调整不当的模型(例如,使用 和 的默认值或随机值Cgamma会导致更差的预测准确性。

总的来说,我认为在子集上调整超参数并不理想,但可能会导致相对较好的结果,而不必等待太久。例如,在使用该方法之前,我使用optunity包来调整整个数据集的超参数。这个过程需要 3-5 天才能完成,并且会产生具有非常好的精确度或非常好的召回率但不是两者兼而有之的结果,因此尽管对于每个班级,准确率或召回率都非常高(高于我的任何其他班级)分类器已经达到)f1 测量值非常低。相反,使用后一种方法会导致几个小时的训练和更好的 f1 测量。

我的担忧是:

我会限制我的分类准确性吗?我是否可以通过仅调整子集来避免使用我的数据集可以提供的所有预测能力?如果发生这样的性能损害,它是否受到某种因素的限制?

4个回答

对数据集样本进行超参数调整是个坏主意吗?

答:是的,因为您可能会在您选择的训练测试拆分导致的特定测试集上过度拟合(超参数)。

我会限制我的分类准确性吗?

答:是的,但常见的机器学习智慧是:使用您的最佳超参数,例如,在整个数据集上重新调整您的模型,并使该模型成为您未来新案例的最终模型。λ

我是否可以通过仅调整子集来避免使用我的数据集可以提供的所有预测能力?

答:见上一个答案。

如果发生这样的性能损害,它是否受到某种因素的限制?

答:同上。

我使用 10 倍交叉来衡量我的准确性,因为我也使用它来评估参数

A:请注意,这与标题中的要求不同。10 倍 CV 迭代 10 次测试训练拆分,以达到对泛化性的“无偏”(偏少)估计(在这种情况下通过准确性来衡量)。10-fold CV 正好解决了我在第一个答案中谈到的问题。

我从整个数据集的训练中获得的预测准确性

答:这是一个“样本内”度量,可能存在乐观偏差。但不要忘记,您有很多案例和相对较少的功能,因此这种乐观偏见可能不是问题。机器学习金块:“最好的正则化器是更多的数据。”

[续],总是非常接近我在调整参数以获得最佳参数集时得到的评估。

答:见上一个答案。查看超参数图:调整是否会减少误差以及减少多少?从你说的情况来看,调整并没有多大作用。

您可以按如下方式进行测试。进行 70%-30% 的训练测试拆分。比较以下预测性能:

  1. 在训练集上训练的未调整模型,
  2. 在训练集上训练的 10 倍 CV 调谐模型。

让两个模型都预测测试集。如果性能非常接近,则调整不会做太多。如果性能不同有利于调整模型,则继续调整方法。

除了 Jim 的 (+1) 答案:对于某些分类器,超参数值取决于训练示例的数量,例如对于线性 SVM,原始优化问题是

min12w2+Ci=1ξi

受制于

yi(xiwb)1ξi,andξi0i

请注意,优化问题基本上是数据失配项(对的总和)和正则化项的度量,但通常的正则化参数与数据失配项放在一起。显然,我们拥有的训练模式数量越多,总和就越大,而应该越小,以保持与权重大小相同的平衡。ξiC

SVM 的一些实现重新参数化为

min12w2+Ci=1ξi

为了补偿,但有些没有。因此,需要考虑的另一点是最佳超参数是否取决于训练示例的数量。

我同意 Jim 的观点,即过度拟合模型选择标准可能会成为一个更大的问题,但如果即使在子样本中也有足够的数据,那么这可能不是一个实质性问题。

我将回答人工神经网络 (ANN)。

ANN 的超参数可以定义其学习过程(例如,学习率或小批量大小)或其架构(例如,隐藏单元或层的数量)。

在训练集的一个子集上调整架构超参数可能不是一个好主意(除非你的训练集确实缺乏多样性,即增加训练集大小不会提高 ANN 性能),因为架构超参数会改变 ANN 的容量。

我不太关心在训练集的子集上调整定义学习过程的超参数,但我想应该凭经验验证它。

本文是关于采用其他/较小数据集来调整较大数据集的主题: https ://papers.nips.cc/paper/5086-multi-task-bayesian-optimization.pdf

与吉姆所说的相反,我认为这不是一个坏主意