我的用例是一个常见的用例:带有不平衡标签的二进制分类,因此我们决定通过交叉验证使用f1分数进行超参数选择,我们使用pyspark 2.3和pyspark.ml,我们创建了一个CrossValidator对象,但对于evaluator,问题如下:
- BinaryClassificationEvaluator没有f1分数作为评估指标李>
- MultiClassificationEvaluator有f1分数,但返回了错误的结果,我猜它为每个类计算f1(在本例中仅为2),并返回它们之间的某种平均值,因为负类(y=0)占主导地位,它生成高f1,但模型非常糟糕(正类的f1分数为0)
- MultiClassificationEvaluator在最新版本中添加了参数evaluator.metricLabel,我认为该参数允许指定要使用的标签(在我的情况下,我会将其设置为1),但在spark 2.3上不可用
但问题是:我使用的公司/企业spark群集没有升级当前版本(2.3)的计划,因此问题是:考虑到我们仅限于spark 2.3,如何在二进制情况下的CrossValidator计算器中使用f1分数
Tags:
如果可以使用Spark v3.0+,最简单的方法是使用
F-measure by label
度量并指定标签(并将beta设置为1):但由于您仅限于v2.3,因此您可以
重新实现交叉验证程序功能
pyspark.mllib.evaluation.MulticlassMetrics
通过label方法具有fMeasure
。请参阅example以获取参考将度量从
BinaryClassificationEvaluator
更改为areaUnderPR
,这是一种“模型的优点”度量,应该可以为您完成这项工作(重新平衡标签)。这个blogpost比较F1和AUC-PR您可以为此创建一个类。我公司的spark 2.4也有同样的问题,所以我试着为二元分类制作一个F1分数评估器。我必须为新类指定
.evaluate
和.isLargerBetter
方法。以下是我尝试使用this数据集时的示例代码:简历过程运行没有问题,尽管我不知道性能如何。我还尝试将evaluator与
sklearn.metrics.f1_score
进行比较,结果接近相关问题 更多 >
编程相关推荐