news 2026/4/15 11:20:29

Flink ML 二分类评估器 BinaryClassificationEvaluator:AUC、PR-AUC、KS 一次搞懂

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink ML 二分类评估器 BinaryClassificationEvaluator:AUC、PR-AUC、KS 一次搞懂

1. 支持的输入形式

BinaryClassificationEvaluator 的输入表需要包含:

  • labelCol:真实标签(Number,默认列名"label"
  • rawPredictionCol:原始预测(Vector 或 Number,默认列名"rawPrediction"
  • weightCol:样本权重(Number,可选,默认 null)

rawPrediction 可以是两种类型

1)double
可以是:

  • 二分类硬预测(0/1)
  • 或者label=1 的概率(更推荐用概率)

2)vector(长度为 2)
表示两个类别的 raw predictions / scores / probabilities,例如:

  • [score0, score1]
  • [p(label=0), p(label=1)]

工程建议:如果你的模型能输出概率向量(比如[p0, p1]),尽量用 vector 输入,这样更通用也更符合评估器预期。

2. 输出指标说明

评估器输出表可能包含以下列(取决于你配置了哪些 metricsNames):

  • areaUnderROC:ROC 曲线下面积(ROC-AUC)
  • areaUnderPR:PR 曲线下面积(PR-AUC)
  • areaUnderLorenz:与 Lorenz 曲线相关的度量(文档描述里与 KS 有关联)
  • ks:与 KS / Lorenz 相关的度量(文档描述里与 areaUnderLorenz 有对应关系)

小提示:你贴的描述里areaUnderLorenzks的解释看起来有点“对调”的味道(一个写 KS,一个写 Lorenz 的面积)。在工程实践里你可以把它们都算出来,再结合你对 KS/Lorenz 的理解确认哪个列对应哪个含义,避免拿错指标去做阈值或准入判断。

指标怎么选

  • 业务更关注整体排序能力、对阈值不敏感:优先看ROC-AUC
  • 正负样本极度不均衡、关注正类识别质量:优先看PR-AUC
  • 风控、评分卡、强分离能力诉求:常用KS(越大通常分离越强)

3. 关键参数(Parameters)

Key默认值含义
labelCol"label"标签列名
weightColnull权重列名
rawPredictionCol"rawPrediction"原始预测列名
metricsNames[AREA_UNDER_ROC, AREA_UNDER_PR]需要输出的指标列表

你可以通过setMetricsNames(...)指定要算哪些指标。

4. Java 示例:计算 PR-AUC、ROC-AUC、KS

你贴的示例是最典型的用法:输入label + rawPrediction(vector),输出 1 行指标结果。

importorg.apache.flink.ml.evaluation.binaryclassification.BinaryClassificationEvaluator;importorg.apache.flink.ml.evaluation.binaryclassification.BinaryClassificationEvaluatorParams;importorg.apache.flink.ml.linalg.Vectors;importorg.apache.flink.streaming.api.datastream.DataStream;importorg.apache.flink.streaming.api.environment.StreamExecutionEnvironment;importorg.apache.flink.table.api.Table;importorg.apache.flink.table.api.bridge.java.StreamTableEnvironment;importorg.apache.flink.types.Row;publicclassBinaryClassificationEvaluatorExample{publicstaticvoidmain(String[]args){StreamExecutionEnvironmentenv=StreamExecutionEnvironment.getExecutionEnvironment();StreamTableEnvironmenttEnv=StreamTableEnvironment.create(env);DataStream<Row>inputStream=env.fromElements(Row.of(1.0,Vectors.dense(0.1,0.9)),Row.of(1.0,Vectors.dense(0.2,0.8)),Row.of(1.0,Vectors.dense(0.3,0.7)),Row.of(0.0,Vectors.dense(0.25,0.75)),Row.of(0.0,Vectors.dense(0.4,0.6)),Row.of(1.0,Vectors.dense(0.35,0.65)),Row.of(1.0,Vectors.dense(0.45,0.55)),Row.of(0.0,Vectors.dense(0.6,0.4)),Row.of(0.0,Vectors.dense(0.7,0.3)),Row.of(1.0,Vectors.dense(0.65,0.35)),Row.of(0.0,Vectors.dense(0.8,0.2)),Row.of(1.0,Vectors.dense(0.9,0.1)));TableinputTable=tEnv.fromDataStream(inputStream).as("label","rawPrediction");BinaryClassificationEvaluatorevaluator=newBinaryClassificationEvaluator().setMetricsNames(BinaryClassificationEvaluatorParams.AREA_UNDER_PR,BinaryClassificationEvaluatorParams.KS,BinaryClassificationEvaluatorParams.AREA_UNDER_ROC);TableoutputTable=evaluator.transform(inputTable)[0];RowevaluationResult=outputTable.execute().collect().next();System.out.printf("Area under PR: %s\n",evaluationResult.getField(BinaryClassificationEvaluatorParams.AREA_UNDER_PR));System.out.printf("Area under ROC: %s\n",evaluationResult.getField(BinaryClassificationEvaluatorParams.AREA_UNDER_ROC));System.out.printf("KS: %s\n",evaluationResult.getField(BinaryClassificationEvaluatorParams.KS));}}

输出表是什么样?

evaluator.transform(inputTable)[0]返回的 Table 通常只有一行,列名就是你请求的指标名,例如:

  • areaUnderPR
  • areaUnderROC
  • ks
  • areaUnderLorenz(如果你也加上)

你通过evaluationResult.getField("areaUnderROC")或常量 key 取值即可。

5. 带权重 weightCol 的用法(更贴近生产)

当你遇到样本不均衡、或者希望某些样本更重要时,可以加weightCol

  • 输入表:("label", "rawPrediction", "weight")
  • evaluator:.setWeightCol("weight")

示意(结构说明):

TableinputTable=tEnv.fromDataStream(stream).as("label","rawPrediction","weight");BinaryClassificationEvaluatorevaluator=newBinaryClassificationEvaluator().setWeightCol("weight").setMetricsNames(BinaryClassificationEvaluatorParams.AREA_UNDER_ROC,BinaryClassificationEvaluatorParams.AREA_UNDER_PR);

6. 实战注意点

1)rawPrediction 最好用“概率”而不是 0/1
AUC/PR-AUC/KS 本质上依赖排序与阈值扫描。你只给 0/1 会极大损失信息量,指标会变得不稳定或不敏感。

2)label 的取值要明确
通常用 0/1,且要确认“正类”是哪一类(一般 label=1 作为正类)。如果你用 -1/1 或其他编码,建议在进入评估器前统一映射到 0/1。

3)rawPrediction 向量的含义要一致
如果是[p0, p1],你要确保第二个位置确实对应 label=1 的概率或得分,避免把顺序写反。

4)指标用于“模型比较”比“绝对阈值”更靠谱
尤其是不同数据分布、不同采样策略下,绝对值会波动更大。工程上常见做法是:同分布下对比多模型或多版本的提升/下降趋势。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 0:18:24

YOLO目标检测在仓储管理中的应用:货物堆叠识别

YOLO目标检测在仓储管理中的应用&#xff1a;货物堆叠识别 在现代智能仓库的监控大屏上&#xff0c;一组组动态更新的数字正实时跳动——“货位A3-2当前堆叠5层&#xff0c;倾斜角度12&#xff0c;存在倾倒风险”。无需人工巡检&#xff0c;系统已自动识别异常并推送告警。这背…

作者头像 李华
网站建设 2026/4/16 10:17:25

基于SpringBoot + Vue的心理测试系统的设计与实现

文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 &#x1f49b;博主介绍&#…

作者头像 李华
网站建设 2026/4/15 19:33:06

YOLO目标检测全流程自动化:数据标注→训练→GPU部署

YOLO目标检测全流程自动化&#xff1a;从数据标注到GPU部署 在现代智能制造车间&#xff0c;一条高速运转的装配线上每分钟产出数十个产品&#xff0c;质检摄像头以每秒百帧的速度捕捉图像——传统人工或规则算法早已无法应对这样的节奏。此时&#xff0c;一个基于YOLO模型的视…

作者头像 李华
网站建设 2026/4/12 21:10:50

YOLO目标检测在畜牧养殖中的应用:牲畜数量清点方案

YOLO目标检测在畜牧养殖中的应用&#xff1a;牲畜数量清点方案 在现代牧场&#xff0c;清晨的圈舍里&#xff0c;上百头牛羊正缓慢移动。管理员站在监控屏幕前&#xff0c;轻点鼠标——不到一秒钟&#xff0c;系统便自动报出&#xff1a;“当前区域共检测到母牛87头、犊牛23头、…

作者头像 李华
网站建设 2026/4/14 21:39:55

解锁WebOS电视隐藏功能:终极第三方应用商店完整指南

解锁WebOS电视隐藏功能&#xff1a;终极第三方应用商店完整指南 【免费下载链接】webos-homebrew-channel Unofficial webOS TV homebrew store and root-related tooling 项目地址: https://gitcode.com/gh_mirrors/we/webos-homebrew-channel 还在为LG WebOS智能电视的…

作者头像 李华
网站建设 2026/4/14 4:23:56

Thinkphp_Laravel框架开发的vue在线借阅图书管理系统

目录具体实现截图项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;带文档1万字以上 同行可拿货,招校园代理 Thinkphp_Laravel框架开发的vue在线借阅图书管理系统 项…

作者头像 李华