问题:如果使用PySpark的sampleBy实现比例分层抽样,它不就是随机抽样吗?
编辑:有比例和不成比例分层抽样。这个问题是关于前者的。
这是我的想法:
假设总规模N = 1000的总体中有4个群体。组的比例为:
A: 25%, B: 50%, C: 13%, D: 12%
那么选择一个大小为100的比例分层样本意味着选择一个恰好由25个来自a的元素,50个来自B的元素,13个来自C的元素和12个来自d的元素组成的样本(注意:如果你的抽样比例与总体的抽样比例不同,则会出现不成比例分层样本。)
这与随机抽样相反,其中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分层采样(提到Python不支持的
sampleByKeyExact
)Investopedia参考https://www.investopedia.com/terms/stratified_random_sampling.asp
使用可能有效的附加列的创造性解决方案。pyspark -如何在分层随机抽样中使用(df.sampleByKey())选择每层的准确记录数量
我认为这里有一些与标准定义相关的混淆。通常当有人说"分层抽样"时,他们的意思是不同的类别应该得到不同的概率。在上面的例子中
: 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。
sample
或sampleByKey
都无法提供这一点。看一下文档,似乎sampleByKeyExact
确实可以解决这个问题。
编辑sample
和sampleByKey
的行为:对于sample
,映射操作基本上遍历每个元素,并基于一个随机变量决定是否保留该元素(以及withReplacement == True
的副本数量)。这个随机变量是所有元素的i.i.d。在sampleByKey
中,随机变量是独立的,但根据键值,或者更准确地说,根据fractions
参数中对应的值,具有不同的分布。如果fractions
中的值相同,则该随机变量对所有键值具有相同的分布-这就是为什么sample
和sampleByKey
的行为相同的原因。