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

一、Logistic Regression(离线训练版)

1)算法定位

离线逻辑回归主要用于:

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

2)输入列(Input Columns)

参数名 类型 默认值 说明
featuresCol Vector "features" 特征向量
labelCol Integer "label" 标签(要预测的类别)
weightCol Double "weight" 样本权重(可选)

3)输出列(Output Columns)

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

工程理解建议:

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

4)核心参数(Parameters)

LogisticRegressionModel(预测侧)
Key 默认值 类型 说明
featuresCol "features" String 特征列名
predictionCol "prediction" String 输出预测列名
rawPredictionCol "rawPrediction" String 输出原始预测列名
LogisticRegression(训练侧)
Key 默认值 类型 说明
labelCol "label" String 标签列名
weightCol null String 权重列名
maxIter 20 Integer 最大迭代次数
reg 0.0 Double 正则化强度
elasticNet 0.0 Double ElasticNet:0=L2,1=L1,介于其中混合
learningRate 0.1 Double 学习率
globalBatchSize 32 Integer 全局 batch size
tol 1e-6 Double 收敛阈值
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)

参数名 类型 默认值 说明
featuresCol Vector "features" 特征向量
labelCol Integer "label" 标签
weightCol Double "weight" 样本权重(可选)

3)输出列(Output Columns)

参数名 类型 默认值 说明
predictionCol Integer "prediction" 预测标签
rawPredictionCol Vector "rawPrediction" 原始预测向量
modelVersionCol Long "modelVersion" 本次预测使用的模型版本号

modelVersionCol 是在线模型非常关键的字段:

它能让你追溯"这条预测结果是用哪个版本的模型算出来的",对排障和效果分析很重要。

4)核心参数(Parameters)

OnlineLogisticRegressionModel(预测侧)

| Key | 默认值 | 类型 | 说明 |

|---|---|---|

| featuresCol | "features" | String | 特征列名 |

| predictionCol | "prediction" | String | 预测列名 |

| rawPredictionCol | "rawPrediction" | String | 原始预测列名 |

| modelVersionCol | "modelVersion" | String | 模型版本列名 |

OnlineLogisticRegression(训练侧)
Key 默认值 类型 说明
labelCol "label" String 标签列名
weightCol null String 权重列名
batchStrategy COUNT_STRATEGY String mini-batch 策略
globalBatchSize 32 Integer 全局 batch size
reg 0.0 Double 正则
elasticNet 0.0 Double ElasticNet 参数

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

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

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

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

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

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

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

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

代码里:

java 复制代码
Table trainTable = tEnv.fromDataStream(trainStream).as("features");
Table predictTable = tEnv.fromDataStream(predictStream).as("features");

但注意:OnlineLogisticRegression 又设置了 .setLabelCol("label")

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

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

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

java 复制代码
Row initModelData = Row.of(Vectors.dense(...), 0L);
Table initModelDataTable = ...
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 的实时/离线链路中。

相关推荐
UR的出不克17 小时前
使用 Python 爬取 Bilibili 弹幕数据并导出 Excel
java·python·excel
Arms20618 小时前
python时区库学习
开发语言·python·学习
独自破碎E18 小时前
【回溯+剪枝】字符串的排列
算法·机器学习·剪枝
与光同尘 大道至简18 小时前
ESP32 小智 AI 机器人入门教程从原理到实现(自己云端部署)
人工智能·python·单片机·机器人·github·人机交互·visual studio
OJAC11118 小时前
当DeepSeek V4遇见近屿智能:一场AI进化的叙事正在展开
人工智能·深度学习·机器学习
清水白石00818 小时前
深入 Python 对象模型:PyObject 与 PyVarObject 全解析
开发语言·python
tjjucheng18 小时前
小程序定制开发服务商推荐
python
囊中之锥.18 小时前
《从零到实战:基于 PyTorch 的手写数字识别完整流程解析》
人工智能·pytorch·python
子云之风18 小时前
LSPosed 项目编译问题解决方案
java·开发语言·python·学习·android studio
小北方城市网18 小时前
SpringBoot 全局异常处理与接口规范实战:打造健壮可维护接口
java·spring boot·redis·后端·python·spring·缓存