我正在研究一个不平衡数据集的二元分类问题,其中 75% 的数据属于负类 (
0.0
),其余 (25%) 属于正类 (1.0
)。
我正在使用 PySpark Dataframe,其中每一行都有一个与之关联的标签(0.0 或 1.0)以指示类。由于班级的不平衡,我想使用适当的班级权重。
从here列出的文档和示例中,行中有一个名为
weightCol
的参数blor = LogisticRegression(weightCol="weight")
weightCol
的描述提到这里.
所以我可以继续创建一个名为
weight
的新列,每当标签为0.75
时分配值1.0
,当标签为0.25
时为每一行分配值0.0
并初始化模型以上?
我只是想检查一下这是否是为 Spark MLlib 中的不平衡数据集分配权重的正确方法,因为文档并没有说得很清楚
是的,这可以是一种方法。我们正在根据整个人口中每个类别的样本比例来计算权重。此外,权重总和为 1.
但是,如果您从这里提到的官方 sklearn 文档中查看公式 sklearn.utils.class_weight.compute_class_weight 他们使用的公式略有不同。每个班级的权重由
n_samples / (n_classes * np.bincount(y))
计算如果您正在寻找类似的东西,以下片段可能会有所帮助:
y_collect = df.select('label').groupBy('label').count().collect()
bin_counts = {y['label']: y['count'] for y in y_collect}
total = sum(bin_counts.values())
n_labels = len(bin_counts)
weights = {bin_: total/(n_labels*count) for bin_, count in bin_counts.items()}
df = df.withColumn('weight', F.when(F.col('label')==1.0, weights[1]).otherwise(weights[0])).show()