PySpark使用sampleBy()分层采样时的样本占比偏差问题
PySpark分层采样结果偏差的核心原因
小类别样本量不足引发的随机波动
原数据中C类占比仅1%,若总体规模不是极大(比如10万条数据中C类仅1000条),抽取10%样本时,C类预期仅能抽到100条。随机采样本身带概率性,小样本量下的随机波动会被极度放大,甚至可能出现仅抽到个位数C类样本的情况,直接拉低其在最终样本中的占比,这是结果中C类占比极低的直接诱因。采样比例计算逻辑错误
如果参考的代码混淆了「采样比例」和「样本占比」,会完全偏离预期:- 正确逻辑:要保持原分布的10%采样,每个类别都应使用10%的采样比例(即
sampleBy的fractions参数设为{'A':0.1, 'B':0.1, 'C':0.1}),这样各类别样本占比会和原数据基本一致。 - 错误逻辑示例:若代码误将采样比例计算为「总体采样率 × 原类别占比」(比如A类用0.1×0.9=0.09,B类0.1×0.09=0.009,C类0.1×0.01=0.001),会导致大类采样比例接近预期,但小类采样比例被严重压低。最终样本中A类占比会因基数大被进一步拉高,B、C类占比骤降,和你给出的结果完全吻合。
- 正确逻辑:要保持原分布的10%采样,每个类别都应使用10%的采样比例(即
对
sampleBy参数的误解
PySpark的sampleBy方法中,fractions参数是每个类别自身的采样比例,而非该类别在最终样本中的目标占比。如果代码错误地将fractions设为各类别在样本中的目标占比(比如{'A':0.9, 'B':0.09, 'C':0.01}),会导致大类被过度采样,小类采样不足,最终样本分布完全偏离预期。
内容的提问来源于stack exchange,提问作者Sophia
相关产品推荐
相关产品推荐

