Press "Enter" to skip to content

实践采样技术和比较,使用Python

这是一个关于如何使用Python高效采样数据集的逐步教程

作者图像

我和妻子一起搭圣诞树,我们走到地下室,拿起树木,将其搬到楼上,然后从底部开始组装。这总是一个神奇的时刻🎄

然后是给树上装饰球的时候。我立刻想到:有至少三种方法可以把球放在树上。

  • 均匀分布:均匀地把球放在树上,就像这样
作者图像,使用Freepik制作
  • 随机放置:随机地把球放在树上,闭上眼睛,放在感觉对的地方(我开始这么做,结果妻子发狂了)
作者图像,使用Freepik制作
  • 拉丁超立方体:将树分成N个部分,在每个部分中进行随机提取。不运行任何代码很难绘制,但可能的拉丁超立方体如下:
作者图像,使用Freepik制作

我尝试向妻子展示这个。她微笑着说:“随你便”,于是我去了我的电脑,希望你的反应会更加满意 😤

开玩笑的,处理机器学习问题时有两种不同的情况:

  1. 您对数据集没有任何控制。您有一个客户或公司交给您一个数据集。这就是您需要处理的,直到必要的(可能的)重新训练安排。

例如,在纽约市,您想根据一些给定的特征预测房屋的价格。他们只是给您提供数据集,并希望您构建模型,以便当有新客户到来时,您拥有一个可以根据感兴趣房屋的特征预测价格的AI软件。

2. 您可以构建您的实验设计。当您拥有一个前向模型或实际实验时,您可以随时设置运行它。

例如,在实验室中,您想根据实验设置预测物理信号。您可以随时去实验室生成新数据。

您在这两种情况下做出的考虑是完全不同的。

在第一种情况下,您可以预期数据集在其特征上不平衡,可能存在缺失的输入值和目标值的偏斜分布。对于数据科学家来说,处理这些问题是喜悦和苦恼。您可以进行数据增强、数据过滤、填充缺失值、进行ANOVA测试等操作。在第二种情况下,您完全控制数据集中的输入方面。这意味着如果有一个NaN值,您可以重复实验;如果您有多个NaN值,您可以调查数据集中的奇怪区域;如果某些给定特征的值异常大,您可以重复实验以确保这不是实验设置的幻觉。

由于我们拥有如此多的控制能力,我们希望确保高效地覆盖输入参数空间。例如,如果你有3个参数,并且你知道边界

作者提供的图片

其中i从1到3(或者如果你非常喜欢Python,可以从0到2)。在这种情况下,x_i是第i个变量,它永远大于x_i^L(下边界),但永远小于x_i^U(上边界)。

我们有了我们的三维立方体。

作者提供的图片

现在,请记住我们对数据集有完全控制。我们如何采样?换句话说,我们如何确定x的值?我们要选择哪些点来运行正向模型(实验或模拟)并获得目标值?

正如你可以预料到的,有多种方法可以做到这一点。每种方法都有其优点和缺点。在这个研究中,我们将讨论它们,展示其背后的理论,并展示代码供大家使用和了解有关采样的美丽世界更多的知识。🙂

让我们从均匀采样开始:

1. 均匀采样

均匀采样方法可以说是最简单和最著名的方法。

它只是将每个参数(或维度)分成步骤。假设我们每个维度有3个步骤,对于2个维度,每个维度从0到1(我们将在一分钟内扩展这个范围)。这将是采样结果:

  • (0,0)
  • (0,0.5)
  • (0,1)
  • (0.5,0)
  • (0.5,0.5)
  • (0.5,1)
  • (1,0)
  • (1,0.5)
  • (1,1)

这意味着我们逐个固定一个变量,并按步骤递增。相当简单。让我们来编写代码:

1.1 均匀采样代码

我们应该如何做到这一点?让我们避免这种结构:

  • 对于第一个维度的a
  • 对于第二个维度的b
  • ….
  • 对于字母表中的最后一个字母在维度中的字母数量:X.append([a, b, …, 字母表中的最后一个字母])

我们不想这样做,因为它不太高效,你需要为每个维度定义一个变量,而且这很麻烦。我们来使用神奇的numpy

问题np.meshgrid(*points)以优化的方式完成了你将使用for循环完成的任务。你的参数字典的目的是告诉你每个参数的最小和最大值。

使用以下代码片段,您将生成一个0/1立方体和一个具有三个不同维度的立方体(例如,第一维度为-5到1,第二维度为0到10,第三维度为-1到1):

我们有三个维度,让我们绘制前两个:

实践采样技术和比较,使用Python 四海 第7张

1.2 优点和缺点

优点:这种方法因为两个原因而非常有名。第一,它非常容易实现。它实际上只是在变量之间进行的一个for循环。第二,当然,您正在均匀地覆盖参数空间,这在您想要确保不丢失参数空间的重要部分时是理想的。

缺点:这种方法的巨大问题当然是指数依赖性。假设维度数量是固定的(假设为6),对于一个步骤=10的设计,你已经面对一个百万点的实际问题。再次提醒,问题在于指数级的复杂性。所以,如果你想将步骤数量增加一倍(20步而不是10步),那么你将面对一个6400万点的问题。

2. 随机抽样

随机抽样是均匀抽样的一种替代方法。它是如何工作的呢?非常简单:在感兴趣的立方体中,在边界上随机选择点。

2.1 随机抽样代码

随机抽样方法非常简单,无论是对于0-1立方体还是自定义边界的立方体都是如此。代码如下:

让我们来绘制一下:

2.2 优缺点

优点:即使在这种情况下,随机抽样也非常容易理解和编码(如你所见)。另一个优点是,相对于均匀抽样,这种方法可以更好地捕捉输出空间的复杂性,尤其是在大维度的情况下。

缺点:问题在于抽样的固有随机性,这可能导致聚类和稀疏探索区域的存在。

稍微深入一点,Pedergnana等人(非常好的论文)比较了这两种方法和其他方法之间的差异,尤其是对于高维情况。

3. 拉丁超立方抽样

拉丁超立方抽样通常被定义为“均匀随机抽样”。我认为这是一个非常美妙的定义。让我解释一下这个想法。

LHS的关键思想是将参数空间分成等概率的区间,并确保在每个区间内只取一个样本。这样就得到了一个分层和分布均匀的样本,涵盖了整个参数空间。

拉丁超立方的有趣之处在于,你可以使用优化方法,例如,最大化点之间的最小距离并将点放置在其区间内的随机位置。

3.1 拉丁超立方代码

这种方法需要进行自定义安装,即Surrogate Modelling Toolbox(smt)

pip install smt

非常容易执行:

3.2 优缺点

拉丁超立方在视觉上与随机抽样类似,但在多维情况下,它有助于保持随机抽样的一种规则性,而没有均匀抽样的限制。在维度较大且样本较少的情况下,此方法(在其变化中)是首选的,但它需要领域知识和一点实践经验。

4. 结论

在本博客文章中,我们看到了三个实验设计或抽样技术,适用于机器学习中可以控制输入参数的情况。具体而言,我们看到了:

  • 均匀(网格)抽样:这是构建N维网格的方法,其中N是维度数量。使用起来很简单,但对于大维度来说不够详细。
  • 随机抽样是定义N维立方体并在立方体中提取随机值的方法。在大维度情况下,使用起来简单且功能更好,但仍不够优化,可能会创建聚类和过于密集的区域
  • 拉丁超立方抽样是一种通过在N维超立方体的不同部分采样至少一个点来规范化随机抽样的方法。在维度较大且样本较少的情况下,该方法是最优的,但需要领域知识和优化过程

我们为单位立方体(每个变量从0到1)和每个变量的自定义限制提供了编码示例。

没有哪种方法是完美的,选择采用哪种方法取决于您的最终目标。希望本文能给您提供一些框架,帮助您决定采用哪种试验设计最好。

5. 结论

如果您喜欢这篇文章并想了解更多关于机器学习的知识,或者您有任何问题想要问我,您可以:

A. 关注我的Linkedin,我会在那里发布我的所有故事。
B. 订阅我的新闻通讯。它将使您始终了解最新故事,并有机会给我发送短信以获得所有可能的更正或疑问。
C. 成为转介绍会员,这样您就不会有“每月最大故事数量”的限制,可以阅读我(以及成千上万其他机器学习和数据科学顶级作家)撰写的有关最新技术的内容。

Leave a Reply

Your email address will not be published. Required fields are marked *