我有一个包含 16 个样本和 250 个预测变量的集合。我被要求在片场执行 CV。在我看过的示例中,您创建了训练和测试子集。样本量对我来说似乎很小,可以分成更小的子集。我的问题是,CV 是否对小样本有意义。
用小样本进行交叉验证有意义吗?
当您有 16 个样本时,我担心涉及 250 个预测变量。但是,让我们暂时把它放在一边,专注于交叉验证。
您没有太多数据,因此从完整集到训练和验证集的任何拆分都将导致您可以训练的观察结果非常少。但是,有一种称为留空交叉验证 (LOOCV) 的方法可能对您有用。您有 16 个观察值。在 15 上训练并在另一个上进行验证。重复此操作,直到您已经对每组 15 个样本进行了训练,而第 16 个样本被排除在外。您使用的软件应该具有为您执行此操作的功能。例如,Python 的 sklearn 包具有用于 LOOCV 的实用程序。我将包含一些来自 sklearn 网站的代码。
# https://scikit-learn.org/stable/modules/generated/
# sklearn.model_selection.LeaveOneOut.html
#
>>> import numpy as np
>>> from sklearn.model_selection import LeaveOneOut
>>> X = np.array([[1, 2], [3, 4]])
>>> y = np.array([1, 2])
>>> loo = LeaveOneOut()
>>> loo.get_n_splits(X)
2
>>> print(loo)
LeaveOneOut()
>>> for train_index, test_index in loo.split(X):
... print("TRAIN:", train_index, "TEST:", test_index)
... X_train, X_test = X[train_index], X[test_index]
... y_train, y_test = y[train_index], y[test_index]
... print(X_train, X_test, y_train, y_test)
TRAIN: [1] TEST: [0]
[[3 4]] [[1 2]] [2] [1]
TRAIN: [0] TEST: [1]
[[1 2]] [[3 4]] [1] [2]
你有没有机会从事遗传学工作?
我被要求在片场执行 CV。
我将假设此交叉验证将用于您从 16 x 250 数据集中获得的模型性能的内部验证(验证的一部分)。
也就是说,您不会进行任何数据驱动的超参数优化(也可以使用交叉验证结果)。
是的,交叉验证在这里确实有意义。由于只有 16 个样本有助于验证结果,因此结果将非常不确定。但是:给定您的小数据集,重复 k 折(8 折可能是最佳选择)或类似的重采样验证(out-of-bootstrap,重复集验证)是您在这种情况下可以做的最好的选择。
顺便说一句,这种大的不确定性也意味着数据驱动的优化对于如此小的数据集基本上是不可能的:由于测试用例数量有限而导致的这种不确定性取决于测试用例的绝对数量——在验证中没有办法减轻小样本量(与训练不同,甚至没有更少的特征也有帮助)。
由于训练中的少数案例和许多特征都有过拟合的风险,因此检查建模的稳定性很重要。这可以通过重复(也称为迭代)交叉验证以非常简单的方式完成:运行(重复/迭代)之间相同案例的预测中的任何差异都不能归因于测试案例,而必须是由于差异模型(即训练不会产生稳定的模型)。
请查看我们的论文以了解更多详细信息: Beleites, C. & Salzer, R.:Assessing and Improvement the stability ofchemometric models in small sample size situation, Anal Bioanal Chem, 390, 1261-1271 (2008)。DOI: 10.1007/s00216-007-1818-6
16 个案例中只有 2 个案例的 120 个组合,您是否可能要考虑运行所有这些组合而不是随机分配的折叠。
与@Dave 和@oloney 相比,我不推荐留一式简历,原因有二:
- LOO 不允许上述稳定性测量(每个代理模型仅使用一个案例进行测试:我们无法区分变化是由于案例还是由于模型)。但是在如此小的情况下检查稳定性确实至关重要:特征比率。
- 第二个原因仅涉及分类:分类任务上的 LOO 将始终测试属于在相应训练拆分中代表性不足的类别的案例。对于非常小的样本量,这可能会导致巨大的悲观偏差。如果您是这种情况,您最好进行不(或几乎不)干扰相对频率的分层重采样验证。
交叉验证背后的理论一直有效,这称为留一法交叉验证。LOOCV 是最佳选择是小。使用交叉验证的好处是您对泛化误差的估计将是无偏的,并且您将能够为估计的参数形成非参数置信区间。缺点是它不会神奇地从无到有地创建样本。泛化误差可能会很大,置信区间会很宽。
如果您打算使用 CV 进行模型选择或特征选择,那么 16 个观察值和 250 个特征可能不会太幸运。假设您使用 BIC 进行模型选择,并考虑所有 250 个模型,每个模型都有一个预测变量。您可以使用 CV 估计并围绕每个模型的 BIC 绘制置信区间,但您可能会发现置信区间有很大重叠。BIC 可能有一个“最佳”模型(越低越好),但如果其他 249 型号有 BIC,那么“最佳”模型实际上是最好的是极不可能的。好处是 CV 可以让你估计置信区间,所以你会知道是否是这种情况。不利的一面是,它没有必要让您以任何程度的信心选择一个最佳模型。