【问题标题】:PySpark Proportionate Stratified Sampling "sampleBy"PySpark 比例分层抽样“sampleBy”
【发布时间】:2021-11-28 19:34:05
【问题描述】:

问题:如果使用 PySpark 的 sampleBy 实现按比例分层抽样,是不是和随机抽样一样?

编辑:有 proportionatedisproportionate 分层抽样。这个问题是关于前者的。

这是我的想法:

假设您有 4 个群体,总人数为 N = 1000。这些群体具有比例:

A:25%,B:50%,C:13%,D:12%

然后选择大小为 100 的成比例分层样本意味着选择一个由 A 中的 25 个元素、B 中的 50 个元素、C 中的 13 个元素和 D 中的 12 个元素组成的样本。(注意:如果您与总体的采样率不同。)

这与随机抽样不同,其中 A、B、C 和 D 中的预期元素数量分别为 25、50、13 和 12。

在 PySpark 中通过 sampleBy 方法和分数实现按比例分层抽样是很自然的

fractions = {'A': .1, 'B': .1, 'C': .1, 'D': .1}

如果此方法精确采样,您将分别有 25、50、13 和 12 个元素。但是,此方法是通过伯努利试验(硬币翻转)实现的。对于分层抽样,由于所有的分数都是相同的,所以每个元素的选择概率为 10%。

在这种情况下,按层然后按元素进行伯努利试验与对整个数据集进行此操作相同。后者只是随机抽样。

结论:在这种范式中,分层抽样是“不可能的”。 这是正确的理解吗?

我看过一些关于使用特殊技巧进行精确采样的帖子。我会看看我是否可以使用下面的这些方法(3)来回答我自己的帖子。

注意:有一个sampleByKeyExact 方法,但在 Python 中不受支持,如果支持,则性能和扩展损失并不理想。

https://spark.apache.org/docs/2.2.0/mllib-statistics.html

相关帖子:

  1. Spark 中的分层采样(提及sampleByKeyExact,Python 不支持)

  2. 投资百科参考 https://www.investopedia.com/terms/stratified_random_sampling.asp

  3. 使用可能有效的附加列的创造性变通方法。 pyspark - how to select exact number of records per strata using (df.sampleByKey()) in stratified random sampling

【问题讨论】:

  • 你到底想表达什么意思?
  • 编辑了主题。这是问题。如果使用 PySpark 的 sampleBy 实现按比例分层抽样,不就是随机抽样吗?
  • 不,不是。目前无法启动数据块集群。
  • @thebluephantom 你能解释一下吗?通过与随机样本相同的伯努利试验创建带有样本依据的分层样本。 (按比例随机抽样会将每个抽样分数设置为相同的常数 c。)谢谢! :)
  • 我无法登录数据块进行验证。我会的。云资源也短缺。

标签: pyspark sampling


【解决方案1】:

我认为这里有一些与标准定义相关的混淆。通常当有人说“分层抽样”时,他们的意思是不同的类应该得到不同的概率。在上面发布的示例中

A:25%,B:50%,C:13%,D:12%

标准分层样本将提供分数,以确保在预期中样本将具有相同数量的 A、B、C、D。例如

fractions = {'A': .2, 'B': .1, 'C': 0.1*50/13, 'D': 0.1*50/12}

应该给出每个类的 5 个元素。

在上面给出的例子中

fractions = {'A': .1, 'B': .1, 'C': 0.1, 'D': 0.1}

行为确实与简单的sample相同,比例为0.1。

真正的问题是,你的目标是什么?如果您希望您的样本具有与原始样本精确相同比例的类,那么 samplesampleByKey 都不会提供。查看文档,似乎sampleByKeyExact 确实可以解决问题。

编辑详细说明samplesampleByKey 的行为: 对于sample,map 操作基本上会遍历每个元素,并根据随机变量决定是否保留该项目(以及在withReplacement == True 的情况下保留多少副本)。这个随机变量在所有元素上都是独立同分布的。在sampleByKey 中,随机变量是独立的,但基于键值具有不同的分布,或者更准确地说,基于fractions 参数中的对应值。如果fractions 中的值相同,则此随机变量将具有所有键值的相同分布——这就是samplesampleByKey 的行为相同的原因。

【讨论】:

  • 很难跟上。根据文档,所有 .1 对我来说似乎都可以。自从我查看统计数据以来已经有一段时间了。
  • en.wikipedia.org/wiki/Stratified_sampling 从这个看起来很明显,他们使用 .x 方法。
  • 感谢您的回复。请注意,有成比例和不成比例的分层抽样。前者是分数都相等(我的问题),而后者不是。我同意你的帖子。我发布这个问题的原因和我的推理是,我已经看过几篇关于使用“sampleBy”实施分层抽样的帖子,我认为这是多余的,甚至可能效率更低。 sampleByKeyExact 有效,但在 Python 中不受支持。 approxQuantile 可用于确定性解决方案,但涉及边缘情况。我有一个将 SQL 用于精确示例的解决方案。
  • 我应该提到不成比例的分层抽样,我不认为 sampleBy 的概率性质是一个大问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
相关资源
最近更新 更多