【发布时间】:2021-11-28 19:34:05
【问题描述】:
问题:如果使用 PySpark 的 sampleBy 实现按比例分层抽样,是不是和随机抽样一样?
编辑:有 proportionate 和 disproportionate 分层抽样。这个问题是关于前者的。
这是我的想法:
假设您有 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
相关帖子:
-
Spark 中的分层采样(提及
sampleByKeyExact,Python 不支持) -
投资百科参考 https://www.investopedia.com/terms/stratified_random_sampling.asp
-
使用可能有效的附加列的创造性变通方法。 pyspark - how to select exact number of records per strata using (df.sampleByKey()) in stratified random sampling
【问题讨论】:
-
你到底想表达什么意思?
-
编辑了主题。这是问题。如果使用 PySpark 的 sampleBy 实现按比例分层抽样,不就是随机抽样吗?
-
不,不是。目前无法启动数据块集群。
-
@thebluephantom 你能解释一下吗?通过与随机样本相同的伯努利试验创建带有样本依据的分层样本。 (按比例随机抽样会将每个抽样分数设置为相同的常数 c。)谢谢! :)
-
我无法登录数据块进行验证。我会的。云资源也短缺。