15
$\开始组$

我有一个大约100行的数据集,每行有大约400个功能。其中93人是0级,7人是1级。

我希望能够将我的100个示例拆分为一个训练集、一个验证集和一个测试集,以便优化超参数并选择一个好的模型。

然而,我的类1行数太少,以至于它们被混入验证或测试集的方式会导致性能指标的巨大波动。

为了选择好的超参数并报告有意义的性能指标,分割数据集的最佳方法是什么?

$\端组$
1

4个答案4

重置为默认值
11
$\开始组$

除了Stephan Kolassa和Christian Henning的回答之外,还有一些想法:

  • 正如Christian所说,在小样本量的情况下,嵌套交叉验证是唯一明智的拆分方案。这有助于充分利用你的样本,但它不能创造奇迹:你仍然只有93个和7个病例。

    具体来说,我建议:使用两个嵌套分割的分层重复k倍CV(或离职)并明确建议不休假--out:在LOO中,模型不稳定性和个案方差(小的有限样本)是共线的。

    CV的重复允许您测量(分离)模型不稳定性方差和方差,因为测试样本大小有限,参见我们的论文Beleites,C.&Salzer,R.《在小样本情况下评估和提高化学计量学模型的稳定性》,《Anal Bioanal Chem》,2008,390,1261-1271

  • 考虑是否一类分类器(又名阶级模型)对于多数阶级来说是一个明智的选择。这将允许您对更知名的类进行建模,而不会因为其他类的案例很少而使其边界受到极端不确定性的影响。

    然后,您仍然可以使用不属于该类的案例来评估生成的类模型。

    一般来说:如果分类问题是真正的二元问题,则二元模型将更有效,即与单类分类器相比,建立类边界所需的情况更少。
    OTOH,如果一个类定义错误或可用的情况太少,二进制分类器的边界可能变得非常不确定。

    它对你的情况是否有帮助需要确定,但我想值得一试。

    更新:由于一些评论说这是一个医学问题,二进制分类(或多个互斥类)对应于鉴别诊断也就是说,在这种情况下,您知道只有所考虑的类才能发生,并且它们是互斥的。一类分类对应的诊断可能不是所有其他可能性都已知或建模,和/或类不是相互排斥的。(肝炎患者也可能有其他感染。或者肿瘤等)

  • 虽然我完全同意Stephan的观点,即你确实需要使用适当的评分规则,但这里有1-2点硬评估指标是有用的:你可以做到事后计算事先和他们在一起。因此,让我们考虑这两类的敏感性,并查看95%置信区间宽度。对于观察到的100%(或0%)灵敏度而言,这是最窄的,而对于50%的灵敏度而言,则是最宽的。

    • 对于大多数人来说,
      观察到100%->c.i.≈96-100%
      观察到的50%->c.i.为40-60%
    • 对于少数民族来说,
      观察到的100%->c.i.为60-100%
      观察到的50%->c.i.为20-80%(是的,这不会发生,但关键是:基于7个测试案例,你无法区分50:50的猜测和明显的“完美”预测.)

    结论如下:

    • 如果置信区间宽度约为少数类可能值范围的一半是不可接受的=>您可以立即停止工作。

    • 你将无法进行任何有意义的优化,包括少数类评估。一类分类器的优化可能也会提前停止,因为也存在很大的方差不确定性。

    • 虽然适当的评分规则通常比硬比例具有更好的方差特性(除其他优点外),但过拟合可能是n:p<1/4的一个严重问题。过拟合通常伴随着模型预测变得“过拟合”的症状,即比它们应该的更难:过拟合模型通常预测0或100%的类成员,而不是介于两者之间的任何东西。在这种情况下,适当的评分规则与(“人为”)强化的比例一样有不好的差异。

    所以,使用(严格地)适当的评分规则,但不要期望它们受到较少的方差不确定性的影响。

  • 从统计数据的角度来看,数据驱动的模型优化通常是大规模多重比较情况。这里,用不可忽略的噪声对目标函数进行评价。

    即使是在大多数类上,您也很难负担太多数据驱动的模型优化。因此,在建模中包含尽可能多的外部知识,并减少(或避免)模型优化。

    在我的领域中,光谱数据的化学计量学建模就是一个例子,我们可以通过检查相邻变量之间的噪声线性模型的系数模式来发现一些过拟合的情况,并且我们知道,由于物理和化学的原因,(双)线性模型通常应该是合适的。因此,如果我在第一(少数)个主成分中发现了这样的噪声模式,就没有必要考虑具有给定数据的任何更复杂的模型,我可以相应地限制超参数的搜索空间。(该模型可能仍然过盈,我可以通过重复CV进行测量。)


更新:简历术语

  • 分层(这里)指以尽可能保持类的相对频率的方式进行拆分。

  • 嵌套意味着为了评估/验证/“验证”最终模型,将一个子集案例进行分割,然后将剩余数据(广义训练集,即包括超参数优化)第二次分割为狭义训练集(在该训练集上,使用不同的超参数集拟合暂定模型)以及用于预测性能“中间”估计的数据集。这些性能估计值用作超参数优化/选择的目标。

    这两种分割都需要产生统计上独立的数据子集,而不是可以在许多合适的“分割程序”(k倍CV、单次分割、自举)中进行选择。

因此,为了进行数据驱动的超参数优化,需要嵌套。如果事先修复所有超参数,则不需要优化,因此只需要一级拆分(对应于嵌套设置的外部拆分)。

  • 交叉验证是一个拆分过程,可生成指定数量的子集拆分,千美元$。原始数据中的每个案例在所有千美元$测试子集(在所有其他这些分割中都是训练用例),并且测试子集的大小应尽可能相似。

    代理模型由千美元$假设训练子集是等价的,并且是在整个数据集上训练的模型的适当近似。因此结果可以是集合的并作为近似值来估计在整个数据集上训练的模型的预测性能。这种池在小样本情况下至关重要,因为它可以产生尽可能多的测试案例。

  • 千美元$-折叠CV是CV的变体,直接指定所需的子集数量。
    (与离开相反-n美元$-out,其中测试子集的大小为直接指定,以及千美元$是总数量的结果可用案例除以所需子集大小)

  • 重复CV重复CV程序以评估更多替代模型。对于各种CV来说,这是可能的,其中用例->测试子集的精确分配具有随机成分,即每个测试子集具有超过1个用例的k折或leave-nout。
    由于同一案例是用多个不同的替代模型进行测试的,因此我们可以更容易地将结果分为方差,这是由于模型(训练)不稳定性与个案差异造成的。

所以我做了一个k折(例如,5折),然后在包含80个样本的火车组中,我再做一个k折叠,将其分成64个和16个样本?

然后在构成我的训练集的64个样本中,我尝试了超参数集(即GridSearchCV),

然后对16个样本进行评估,以找到最佳的超参数,

否:根据5x16=64个样本进行评估,选择最佳超参数

然后使用该超参数集对80个案例进行模型训练。让我们把结果称为自动调整模型。

然后根据我的20个样本测试集进行评估?

再次否定:您评估了5个自动调优的模型(在80个培训案例中),每个模型对应20个案例,从而得到100个测试案例的结果。

您可以使用自动调整过程在100个训练案例中训练一个自动调整的模型,并使用100个案例测试结果作为该模型性能的近似值。

同样,一类分类器主要应该只识别离群值吗?就我而言,我的班级有93个样本,是“健康的”,所以这对我没有多大帮助。

更准确地说,它应该识别属于该类的案例。

对于其他情况,health(normal!?)类模型应该告诉您它们不属于health类。

重要的一点是,从93个健康案例中,可以比从7个“非健康”案例中更好地估计(不太确定)类边界,即使它们来自定义良好的类(非健康甚至不需要)。

您可以尝试为其他7个案例设置一个额外的whatever-disease-it-is类(如果它们可以合理地计算为属于同一类),但这将在类边界上产生巨大的不确定性。

由于只有少数类的7种情况,一个类中最多只有7种情况的判别/二元分类器在类边界中也将具有巨大的不确定性。

$\端组$
2
  • $\开始组$ 我不知道分层重复k折CV是什么意思。所以我做了一个k折(例如,5折),然后在包含80个样本的火车组中,我再做一个k折叠,将其分成64个和16个样本?然后在构成我的训练集的64个样本中,我尝试了超参数集(即GridSearchCV),然后根据16个样本进行评估,以找到最佳的超参数,然后根据我的20个样本测试集进行评估?同样,一类分类器主要应该只识别离群值吗?就我而言,我的班级有93个样本是“健康的”,所以这对我没有多大帮助。 $\端组$ 评论 5月29日4:01
  • 1
    $\开始组$ @ThaoNguyen:请查看更新 $\端组$ 评论 6月6日12:01
22
$\开始组$

然而,我的类1行数太少,以至于它们被混入验证或测试集的方式会导致性能指标的巨大波动。

这里是另一种看待事物的方式:您的目标类非常罕见,以至于您可能在中等规模的示例中也看不到它。考虑一下一位医生,他可能在一年或整个职业生涯中都没有看到过一种半罕见的疾病。这并不意味着他们不应该知道这种特定的疾病,而是他们的先兆应该与之对抗。

不幸的是,你在这里做不了什么。你只有很少的数据。而一个非常复杂的模型——仅100个观测值就有400个预测因子——太多了。无论你做了多少正规化和“模型选择”,你会飞过去的(我在这里使用了恐吓引语,因为在这种情况下,你不会选择模型,你会的追逐噪声.)在没有信息的情况下,你无法魔术般地产生信息。要建立一个像样的模型,你唯一的出路就是收集更多的观察结果。

在那之前,我建议你将400个预测因素缩减到理论上与你的结果联系最紧密的预测因素。或者可能使用主成分分析或类似方法组合您的预测因素。

最后,当然要使用良好的评估指标,而不是准确度、精确度、召回率、F1或其他使用硬0-1分类的指标。这些都存在“不平衡”数据(以及其他方面)的主要问题。另请参见不平衡数据集有问题吗?过采样(据称)有何帮助?相反,使用概率预测,并使用适当的评分规则进行评估。由于数据稀少,您的模型可能会倾向于输出零预测,请使用对数分数而不是Brier分数来避免这种情况:为什么LogLoss优先于其他适当的评分规则?最后,一旦你有了预测,仔细考虑任何比较阈值,并根据实际成本结构设置它们:降低分类概率阈值

$\端组$
6
  • $\开始组$ 我正在使用主成分分析将特征数量大幅减少到20个左右,我计划报告敏感性和特异性,因为这是针对医学应用的。但是,我是否仍应该使用70-10-20的训练-测试分割,是否应该生成1000个这样的分割来选择超参数? $\端组$ 评论 5月26日23:52
  • 4
    $\开始组$ 主成分分析原则上是好的,但20个预测因子仍然太多,参见弗兰克·哈雷尔的回答.敏感性和特异性仍然坏的尤其是对于“不平衡”数据。为了医学而这样做应该是使用好的工具,而不仅仅是因为它们在医学文献中普遍存在(不幸的是,通常统计数据都是无知的)。我个人会去的肖恩对LOOCV的建议,但我认为弗兰克的观点和良好的KPI比你的拆分策略更重要。 $\端组$ 评论 5月27日6:22
  • 2
    $\开始组$ 这是一个很好的论据,可以引出好的概率分类,然后使用一个考虑行动成本的阈值。看看我答案中的最后一个链接。 $\端组$ 评论 5月27日19:59
  • 1
    $\开始组$ @ThaoNguyen:将10个测试案例分割开来,你将无法进行任何合理的优化——它只能从噪音中挑选。聚合1000次这样的仅含噪优化运行也不会让你意识到它不起作用。嵌套CV的关键点在于,它允许你将测试用例的测试结果汇集到多个代理模型中,从而减少方差不确定性。(嵌套重复的单个拆分也可以,或者嵌套的out-of-bootstrap) $\端组$ 评论 5月28日5:42
  • 1
    $\开始组$ 报告除其他优点外,敏感性和特异性也很好。但一定要考虑置信区间。如果您保留20%的数据用于验证优化模型,则相当于1或2个罕见类的情况。即使两者都被正确预测,这意味着“100%”灵敏度的95%置信区间将一直向下延伸到大约35-15%。那有什么用?此外,计算应用条件下类的实际流行率的特异性-大小为20的分裂不能很好地代表这一点。 $\端组$ 评论 5月28日5:53
12
$\开始组$

量化任务难度的一个有用方法是计算有效样本数如所讨论在这里。ESS在这里$3np(1-p)$哪里$p=0.07$; ESS=19.5。有了这么多信息,您可能有能力分析单个预置预测器.

$\端组$
2
  • $\开始组$ 我对什么是“单一预置预测因子”感到困惑。所以ESS意味着我实际上只有19.5个样本,而不是100个样本。有了19.5个样本,我可以买得起一个预先指定的预测值。但这意味着什么? $\端组$ 评论 5月27日18:40
  • $\开始组$ 你有大约20个观察结果的信息,结果变量良好(即连续)。你无法从多个分析中获得可靠的分析预先指定的预测因子(例如,所有候选预测因子的第一个主成分)。请注意,估计单一的相关系数约为300。 $\端组$ 评论 5月27日19:13
10
$\开始组$

我大体上同意斯蒂芬·科拉萨的观点。如果一个类中只有7个观察值,则超参数选择和性能评估的基础将受到严重限制。你的数据只携带一定数量的信息,没有任何方法可以超越这一点。

在任何情况下,一种方法都是双重的(或嵌套的)留一个交叉验证(LOO-CV),即运行一个外部LOO CV进行性能测量,其中您通过一个内部LOO-CV进行超参数和模型选择,对于外部CV生成的每个数据集,每次只保留一个观测值。因此,在每次运行中,只剩下两个观察值。(最后,您可以使用单个LOO-CV来选择超参数并选择模型,但可以使用双LOO CV来评估性能。)

顺便说一句,还有双重引导,其工作方式类似,但在这种情况下,由于缺乏平衡,可能会有更多问题。

$\端组$

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.