python - 如何在 pyspark 2.3 中的二元问题(BinaryClassificationEvaluator)中为 CrossValidator 评估器使用 f1-score
问题描述
我的用例是一个常见用例:带有不平衡标签的二进制分类,因此我们决定使用 f1-score 通过交叉验证进行超参数选择,我们使用的是 pyspark 2.3 和 pyspark.ml,我们创建了一个 CrossValidator 对象,但对于评估者,问题如下:
- BinaryClassificationEvaluator 没有 f1 分数作为评估指标。
- MulticlassClassificationEvaluator 有 f1 分数,但返回错误的结果,我的猜测是它为每个类计算 f1(在这种情况下只有 2 个)并返回某种平均值,因为负类(y = 0)占主导地位它产生高f1 但模型真的很糟糕(正类的 f1 分数为 0)
- MulticlassClassificationEvaluator 在最近的版本中添加了参数 evaluator.metricLabel ,我认为它允许指定要使用的标签(在我的情况下,我会将其设置为 1),但它在 spark 2.3 上不可用
但问题是:我使用的是公司/企业 spark 集群,没有升级当前版本(2.3)的计划,所以问题是:考虑到我们仅限于 spark 2.3,我如何在 CrossValidator 评估器中使用 f1 分数来处理二进制情况
解决方案
如果您可以使用 Spark v3.0+,最简单的方法是使用F-measure by label
指标并指定标签(并将 beta 设置为 1):
evaluator = MulticlassClassificationEvaluator(metricName='fMeasureByLabel', metricLabel=1, beta=1.0)
但由于您仅限于 v2.3,您可以
推荐阅读
- javascript - 如何仅在全屏 API 模式下启用图像缩放?
- python - fastapi 自定义响应类作为默认响应类
- rust - 如何从自定义错误类型中冒出底层错误类型?
- html - 如何向上增加对象的大小并保持其形状?
- sql - 如何在 Access 中比较具有 Null 值的字段
- excel - 是否可以使用算术公式在 Excel 中用作单元格引用(没有 VBA)?
- oracle - 创建以下过程时不断出现编译错误
- java - 在 Eclipse RCP 中注入单例 OSGi 声明式服务
- java - 布局充气它在 onlick 功能中不起作用
- c# - OnPost() 没有达到 .NET Core 3.0