news 2026/5/1 10:56:04

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/15 6:46:24

斐波那契数列完全解析:从数学原理到算法实现

斐波那契数列完全解析:从数学原理到算法实现一、什么是斐波那契数列?1.1 历史背景1.2 数学定义1.3 数列示例二、斐波那契数列的生成过程(动图演示)2.1 可视化生成过程2.2 几何表示(黄金螺旋)三、递归算法实…

作者头像 李华
网站建设 2026/5/1 7:05:59

YOLO模型镜像集成Airflow,GPU任务编排自动化

YOLO模型镜像集成Airflow,GPU任务编排自动化 在智能制造、智慧交通和智能安防等场景中,每天都有成千上万小时的视频流需要分析。传统的人工监控方式早已不堪重负,而AI驱动的目标检测技术正成为破局关键。但问题也随之而来:如何让…

作者头像 李华
网站建设 2026/4/30 9:48:30

什么才是真正的:不会花钱就不会赚钱 ,你怎么理解的

什么才是真正的:不会花钱就不会赚钱 ,你怎么理解的 下载链接: https://download.csdn.net/download/qq_38998213/92508853目录 什么才是真正的:不会花钱就不会赚钱 ,你怎么理解的 不会花钱的人财运不会太好:赚钱体现的是能力,花钱体现的是认知,花钱不是单纯的消费,花…

作者头像 李华
网站建设 2026/5/1 8:34:49

【参数估计】基于扩展卡尔曼滤波器(EKF)和无香味卡尔曼滤波器(UKF)确估计定数据集的模型的状态和参数附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 🍊个人信条:格物致知,完整Matlab代码获取及仿…

作者头像 李华
网站建设 2026/5/1 7:32:03

YOLO开源但算力昂贵?我们提供一站式GPU+Token解决方案

YOLO开源但算力昂贵?我们提供一站式GPUToken解决方案 在智能制造车间里,一条视觉检测流水线正以每分钟200帧的速度扫描产品表面缺陷;城市交通指挥中心的大屏上,数十路摄像头实时识别违章车辆;无人机在电力巡检中自主定…

作者头像 李华