news 2026/4/15 10:42:43

Flink ML Logistic Regression 离线训练 + 在线增量训练(FTRL-Proximal)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink ML Logistic Regression 离线训练 + 在线增量训练(FTRL-Proximal)

一、Logistic Regression(离线训练版)

1)算法定位

离线逻辑回归主要用于:

  • 训练数据是有限集(批数据/有界流)
  • 训练过程跑若干轮迭代直到收敛(或达到 maxIter)
  • 输出一个稳定模型,用于批预测或在线推理

2)输入列(Input Columns)

参数名类型默认值说明
featuresColVector"features"特征向量
labelColInteger"label"标签(要预测的类别)
weightColDouble"weight"样本权重(可选)

3)输出列(Output Columns)

参数名类型默认值说明
predictionColInteger"prediction"预测标签(最大概率对应的类别)
rawPredictionColVector"rawPrediction"各类别的概率/得分向量(实现里通常可视为概率向量)

工程理解建议:

  • rawPrediction用于你想做阈值/排序/AB 实验对比的场景
  • prediction用于直接落库打标签、下游业务消费

4)核心参数(Parameters)

LogisticRegressionModel(预测侧)
Key默认值类型说明
featuresCol"features"String特征列名
predictionCol"prediction"String输出预测列名
rawPredictionCol"rawPrediction"String输出原始预测列名
LogisticRegression(训练侧)
Key默认值类型说明
labelCol"label"String标签列名
weightColnullString权重列名
maxIter20Integer最大迭代次数
reg0.0Double正则化强度
elasticNet0.0DoubleElasticNet:0=L2,1=L1,介于其中混合
learningRate0.1Double学习率
globalBatchSize32Integer全局 batch size
tol1e-6Double收敛阈值
multiClass"auto"String分类类型:auto/binomial/multinomial

5)Java 示例代码解读(离线 LR)

你贴的示例核心流程:

  1. 造数据features + label + weight
  2. lr.fit(inputTable)得到lrModel
  3. lrModel.transform(inputTable)得到prediction/rawPrediction
  4. collect 打印结果
小坑提醒:label 类型

文档写labelColInteger,但示例里 label 用0./1.(Double),并且 prediction 也按 Double 取。

工程建议:统一 label 为 Integer(0/1)更稳,避免 schema 与类型转换踩坑。

二、OnlineLogisticRegression:在线增量训练(FTRL-Proximal)

1)为什么需要 Online Logistic Regression?

离线 LR 的问题是:模型训练一次就固定了。
如果你的数据是持续到来的(比如广告点击、风控交易、推荐曝光),你希望模型能“边来数据边更新”,这就需要在线学习能力。

OnlineLogisticRegression 的特点:

  • 训练数据是无界流
  • 按 mini-batch 策略聚合训练样本
  • 持续更新内部模型参数
  • 同一份预测数据在不同时间点预测结果可能会变化(因为模型在变)

官方说明里提到:在线优化器使用FTRL-Proximal(常用于广告 CTR 预估等大规模稀疏特征场景)。

2)输入列(Input Columns)

参数名类型默认值说明
featuresColVector"features"特征向量
labelColInteger"label"标签
weightColDouble"weight"样本权重(可选)

3)输出列(Output Columns)

参数名类型默认值说明
predictionColInteger"prediction"预测标签
rawPredictionColVector"rawPrediction"原始预测向量
modelVersionColLong"modelVersion"本次预测使用的模型版本号

modelVersionCol是在线模型非常关键的字段:
它能让你追溯“这条预测结果是用哪个版本的模型算出来的”,对排障和效果分析很重要。

4)核心参数(Parameters)

OnlineLogisticRegressionModel(预测侧)

| Key | 默认值 | 类型 | 说明 |
|—|—|—|
|featuresCol|"features"| String | 特征列名 |
|predictionCol|"prediction"| String | 预测列名 |
|rawPredictionCol|"rawPrediction"| String | 原始预测列名 |
|modelVersionCol|"modelVersion"| String | 模型版本列名 |

OnlineLogisticRegression(训练侧)
Key默认值类型说明
labelCol"label"String标签列名
weightColnullString权重列名
batchStrategyCOUNT_STRATEGYStringmini-batch 策略
globalBatchSize32Integer全局 batch size
reg0.0Double正则
elasticNet0.0DoubleElasticNet 参数

在线版参数相对离线版少一些,核心是 batch 策略 + 正则化。

5)Java 示例代码解读(在线 OLR)

你贴的在线示例非常典型,关键点有三个:

(1)训练流与预测流都是“周期性无限流”

示例用PeriodicSourceFunction每隔一段时间吐一批数据,目的是持续触发:

  • 训练数据 → 模型更新
  • 预测数据 → 输出预测结果

这在本地 demo 中非常方便观察效果变化。

(2)训练表和预测表都只用 features 列

代码里:

TabletrainTable=tEnv.fromDataStream(trainStream).as("features");TablepredictTable=tEnv.fromDataStream(predictStream).as("features");

但注意:OnlineLogisticRegression又设置了.setLabelCol("label")
这意味着:真实训练时你通常需要把 label 列也放进表里(示例中可能依赖内部实现/或是简化展示)。工程实践里建议你显式包含 label 字段,避免歧义:

  • 训练表:features + label (+ weight)
  • 预测表:features (+ label 作为对照可选)
(3)初始模型数据 initialModelData

在线模型需要一个初始参数,否则一开始没法预测/更新。示例里:

RowinitModelData=Row.of(Vectors.dense(...),0L);TableinitModelDataTable=...olr.setInitialModelData(initModelDataTable);

这就相当于给在线 LR 一个初始权重向量 + 初始版本号。

三、离线 LR vs 在线 OLR:怎么选?

选离线 LogisticRegression 的典型场景

  • 训练数据每天/每小时批量汇总一次
  • 你希望模型相对稳定,便于发布与回滚
  • 线上推理只做 transform,不希望训练逻辑影响业务延迟

选 OnlineLogisticRegression 的典型场景

  • 数据持续流入,分布变化快(概念漂移)
  • 你希望模型持续学习最新数据
  • 你需要模型版本字段做线上分析/回溯(modelVersion)

四、实战建议(非常重要)

1)特征缩放与稀疏特征

  • 如果特征尺度差异大,离线 LR 建议加 StandardScaler
  • 在线 OLR(FTRL)更适合稀疏特征,但也要注意特征工程一致性

2)样本不均衡优先用 weightCol

尤其是点击率、欺诈等任务,正负样本极不均衡时,权重往往比盲目调参更有效。

3)关注 rawPrediction 与阈值策略

离线/在线都会输出 rawPrediction。生产里很多业务不是直接用prediction,而是:

  • 按概率阈值做策略(如 p>0.7 才算命中)
  • 或把 rawPrediction 作为排序分(用于推荐/广告排序)

4)在线模型一定要保留 modelVersion

这对排障、回溯、效果分析非常关键。建议把modelVersion一起落库或写 Kafka/ES。

五、小结

Flink ML 的 Logistic Regression 体系可以覆盖两类最常见的工业场景:

  • LogisticRegression(离线):可控、稳定、适合定期训练发布
  • OnlineLogisticRegression(在线,FTRL):持续学习、适合数据流实时变化的业务

掌握输入输出列、参数含义、以及模型版本与 rawPrediction 的用法,你就能把 LR 很自然地接进 Flink 的实时/离线链路中。

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

如何免费将CAJ转PDF?本地安全转换解决方案

如何免费将CAJ转PDF?本地安全转换解决方案 【免费下载链接】caj2pdf 项目地址: https://gitcode.com/gh_mirrors/caj/caj2pdf 还在为CAJ格式的学术文献无法在常用设备上阅读而困扰吗?caj2pdf这款开源工具为你提供完美的CAJ转PDF解决方案&#xf…

作者头像 李华
网站建设 2026/4/13 23:07:22

java计算机毕业设计校园社团活动推荐系统 高校社团智能活动推送平台 基于兴趣图谱的校园社团活动发现系统

计算机毕业设计校园社团活动推荐系统qb4h89(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。进入大学后,社团成为学生拓展兴趣、积累人脉的核心场景,但“活…

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

自动驾驶中的YOLO应用:如何利用GPU集群实现实时处理?

自动驾驶中的YOLO应用:如何利用GPU集群实现实时处理? 在城市交通日益复杂的今天,一辆自动驾驶汽车每秒要“看”到成百上千个动态目标——疾驰的车辆、突然出现的行人、闪烁的信号灯。这些信息必须在毫秒级内被准确识别并转化为决策指令&#…

作者头像 李华
网站建设 2026/4/12 12:09:47

YOLO目标检测冷启动时间低于500ms,GPU常驻进程实现

YOLO目标检测冷启动时间低于500ms,GPU常驻进程实现 在一条高速运转的智能质检产线上,每秒需要处理数十帧工业摄像头传来的图像。一旦某个环节响应延迟超过半秒,整条流水线就可能被迫停摆——这样的场景在智能制造中并不罕见。而在这背后&…

作者头像 李华
网站建设 2026/4/13 13:35:06

YOLOv7-Tiny-VOC部署记录:在MX150上流畅运行

YOLOv7-Tiny-VOC部署记录:在MX150上流畅运行 在如今智能监控、工业检测和边缘计算日益普及的背景下,如何在有限硬件资源下实现高效的目标检测,成了许多开发者面临的真实挑战。尤其对于预算有限的中小企业或个人项目而言,动辄配备R…

作者头像 李华
网站建设 2026/4/10 15:28:23

Linux内核进程管理子系统有什么第九十回 —— 进程调度(17)

接前一篇文章:Linux内核进程管理子系统有什么第八十九回 —— 进程调度(16) 本文内容参考: Linux内核进程管理专题报告_linux rseq-CSDN博客 《趣谈Linux操作系统 核心原理篇:第三部分 进程管理》—— 刘超 《图解Linux内核 基于6.x》 —— 姜亚华 机械工业出版社 (68…

作者头像 李华