一、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)
你贴的示例核心流程:
- 造数据
features + label + weight lr.fit(inputTable)得到lrModellrModel.transform(inputTable)得到prediction/rawPrediction- collect 打印结果
小坑提醒:label 类型
文档写 labelCol 是 Integer ,但示例里 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 的实时/离线链路中。