首页 > 解决方案 > pyspark 通过每个目标变量对类进行过采样

问题描述

我想知道是否有任何方法可以使用 pyspark 对数据进行过采样。

我有目标变量为 10 个类的数据集。截至目前,我正在参加每个班级并像下面这样进行过采样以匹配

transformed_04=transformed.where(F.col('nps_score')==4)
transformed_03=transformed.where(F.col('nps_score')==3)
transformed_02=transformed.where(F.col('nps_score')==2)
transformed_01=transformed.where(F.col('nps_score')==1)
transformed_00=transformed.where(F.col('nps_score')==0)

transformed_04_more_rows=transformed_04.sample(True,11.3,9)
transformed_03_more_rows=transformed_03.sample(True,16.3,9)
transformed_02_more_rows=transformed_03.sample(True,12,9)

最后用 union all 加入所有数据帧

transformed_04_more_rows.unionAll(transformed_03_more_rows).unionAll(transformed_02_more_rows)

我正在手动检查的采样值。例如,如果第 4 类有 2000 行,而第 2 类有 10 行,则手动检查并相应地提供值 16,12,如上面代码中提供的那样

请原谅我提到的代码不完整。只是为了给出我提出的观点。我想知道 pyspark 中是否有像 SMOTE 这样的自动化方式。

我在 Pyspark 中看到了以下链接,过 采样或 SMOTE

它说我的目标班级必须只有两个。如果我删除条件,它会给我一些数据类型问题

任何人都可以帮助我在 pyspark 检查每个类并提供采样值的实现非常痛苦,请帮助

标签: pythonpysparksamplingapache-spark-mloversampling

解决方案


查看 spark 的 sampleBy 函数,这使我们能够分层采样。https://spark.apache.org/docs/2.4.0/api/python/pyspark.sql.html?highlight=sampleby#pyspark.sql.DataFrame.sampleBy

在您的每个班级的情况下,您可以在字典中提供您想要的样本分数并在 sampleBy 中使用它,试一试。要确定分数,您可以根据目标列进行聚合计数,标准化为 (0,1) 并对其进行调整。


推荐阅读