Py学习  »  机器学习算法

用小样本数据集进行机器学习建模的一些建议

生信菜鸟团 • 3 年前 • 440 次点击  

在实际研究中我们很多时候会碰到小数据集,特征数量远远大于样本量,比如我们希望预测患者对某种新疗法的反应。每个患者都包含了许多电子病历中的特征,但由于参加临床试验的患者数量有限,弄清楚哪些预测因素与对治疗真正相关就变得颇具挑战。在大样本的研究中,我们可以留出足够多的患者来测试模型的结果。但是对于一项小样本研究就会存在一些缺陷,比如为了留出验证集,用于训练模型的数据点就会进一步被压缩,导致信息丢失等等。

为了应对这些挑战,本文提供了一些建议,可供大家参考。在讨论如何解决数据量小的问题之前,我们需要先了解样本量的大小是如何提高机器学习模型的。

样本量的大小是如何提高机器学习模型的?

基本概念

偏差:以上图中的数据集为例,它的因变量和自变量之间是二次方关系。但我们不知道他们真实的关系,只能将它们近似为线性关系。在这种情况下,我们的预测与实际数据之间的存在着明显的差异。观测值和预测值之间的这种差异称为偏差。这种模型,我们会说它 power 不够,欠拟合。 

方差:在同一个例子中,如果我们将关系近似为三次方或任何更高阶的关系,就会出现一个高方差的情况。方差能够反映训练集与测试集的性能差异。高方差的主要问题是:模型能很好地拟合训练数据,但在训练外数据集上表现得不好。

我们通常希望将偏差和方差最小化。即建立一个模型,它不仅能很好地适用训练数据,而且能很好地描述验证数据集。实现这一点有很多方法,但使用更多数据进行训练是实现这一点的最佳途径之一。我们可以通过下图了解这一点:

假设我们有一个类似于正弦分布的数据。在最极端的情况下如图 a ,我们只有一个样本,可以看到许多模型都可以很好地拟合这个数据点,但绝大多数模型都是过拟合,且在整个数据集上效果不是很好。当我们增加数据时,从图 b 可以看出可以拟合这些数据的模型逐渐减少。随着我们进一步增加数据点,我们最终会成功获得数据的真实分布。这个例子可以使我们很直观地了解数据量是如何帮助模型揭示数据的真实关系。接下来,我们将通过举例几个算法,看看模型的参数是如何受到数据量大小影响的。

线性回归

在线性回归中,我们假设 X 和 y 之间存在线性关系:

其中 y 是因变量,x(i) 是自变量。β(i) 为真实系数,ϵ 为模型未解释的误差。在单变量情况下,基于观测值的预测系数如下:

上述公式给出了斜率和截距的预测点,但这些估值总是存在一些不确定性,这些不确定性可由方差方程量化:

由公式可得随着数据量的增加,分母会变大,就是我们预测点的方差变小。因此,我们的模型会更稳健。

k-NN

k-NN 是一种用于回归和分类里最简单但功能强大的算法。k-NN 不需要任何特定的训练阶段,其原理就是给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻近的 k 个实例,如果这 k 个实例的多数属于某个类别,那么新数据就属于这个类别。即由那些离新数据最近的 k 个实例来投票决定新数据归为哪一类。

在下面的例子中,我们将用到 iris 数据集来了解数据量是如何影响 k-NN 的表现的。为了更好表现结果,我们只考虑了这组数据的两个特性:萼片长度和萼片宽度。

后面的实验中我们随机从分类 1 中选取一个点作为试验数据(用红色星星表示),同时假设 k=3 并用多数投票方式来预测试验数据的分类。a 图中我们用较少的数据进行建模,结果显示这个模型把试验点错误分为了分类 2。当数据点越来越多,模型会把数据点正确预测到分类 1 中。从上面图中我们可以知道,k-NN 与数据质量成正相关,数据越多可以让模型更一致、更精确。

决策树

与线性回归和 k-NN 类似,决策树模型的效果也受数据量的影响。

决策树也是一种非参数模型,它试图最优拟合数据的底层分布。根据不同的特征值对数据进行拆分,在子级中创建不同的类。由于模型试图对训练数据进行最优拟合,因此数据量的大小就直接决定了分割的级别和最终的份类。从上图中我们可以清楚的看到,数据集的大小对分割点和最终的类预测有很大的影响。更多的数据有助于找到最佳分割点,避免过拟合。

如何解决数据量少的问题?

从上面的这些例子我们知道数据量的大小可能会种种问题:

过拟合变得更加难以避免模型不仅会过拟合的训练数据,而且有时也会过拟合验证集离群值变得更加危险噪声的问题

1. 使用相对简单的模型

使用更简单的模型,是因为它们不太容易过拟合,比如正则化线性模型,弹性网络分类器,支持向量机,Eureqa 模型等等。另外,强制模型使用较少的特征也可降低模型拟合到噪声或虚假相关性的风险。

2. 交叉验证

交叉验证是一种增加可用样本外验证数据量的方法,这对使用小数据集建模非常有用。在调整模型超参数时,我们的建议是可以使用更复杂的交叉验证方法,比如嵌套交叉验证 (nested cross validation) 。嵌套交叉验证选择算法即是,外循环通过 k 折等进行参数优化,内循环使用交叉验证,从而对特定数据集进行模型选择。

下图演示了一个 5 折外层交叉沿则和 2 折内部交叉验证组成的嵌套交叉验证,也被称为 5*2 交叉验证:

嵌套交叉验证的每个 fold 中都包含训练,验证和测试数据。在内循环中,我们将模型拟合到每个训练集来最大化模型得分,然后通过在外循环的验证集上选择超参数来得到最高分值。我们可以通过对不同交叉验证折叠中的测试得分求平均来估计样本外误差。Varma 和 Simon 在论文 Bias in Error Estimation When Using Cross-validation for Model Selection 中指出使用嵌套交叉验证得到的测试集误差几乎就是真实误差。

3. 特征选择

特征选择对于建立模型尤为重要。尽管正则化之类的方法有助于减少特征,但是如果特征数远远大于样本数,那么过拟合的问题仍然会持续存在。作为一项额外措施,我们建议用不同的种子进行多次交叉验证。

这样,我们可以知道哪些特征在数据集中始终保持不变。同时基于多次交叉验证的结果我们也可估计数据集上模型的稳健性。如果特征的效应量会根据种子的变化而变得完全不同,那就表明这些模型可能不太靠谱。如果发生这种情况,我们需要结合这些结果进行建模,例如整合用不同随机种子得到的特征效应量,以迭代方式减少噪音。

回到临床试验的例子中,我们无法增加研究中的患者人数,但为了使我们的模型更可靠,我们可以反复用多个种子进行交叉验证。通过反复将数据的不同组合放入训练和验证数据中,我们可以检查模型的预测结果和用于建模的特征是否一致。如果无论我们如何对患者数据进行分组,都可以得到相同的预测变量,那我们就可以相信我们的模型已经找到了真实的模式,而不是一种偶然的相关性。

引用链接

[1] https://towardsdatascience.com/breaking-the-curse-of-small-datasets-in-machine-learning-part-1-36f28b0c044d
[2] https://www.datarobot.com/blog/using-small-datasets-to-build-models/
[3] Machine Learning-模型评估与调参 ——嵌套交叉验证




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/70894
 
440 次点击