如何在 Apache Spark 的 MLlib (Python) 中为逻辑回归模型分配类别权重

问题描述 投票:0回答:1

我正在研究一个不平衡数据集的二元分类问题,其中 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 中的不平衡数据集分配权重的正确方法,因为文档并没有说得很清楚

apache-spark machine-learning pyspark apache-spark-mllib apache-spark-ml
1个回答
0
投票

是的,这可以是一种方法。我们正在根据整个人口中每个类别的样本比例来计算权重。此外,权重总和为 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()
© www.soinside.com 2019 - 2024. All rights reserved.