news 2026/4/16 15:44:55

Flink ML 线性 SVM(Linear SVC)入门输入输出列、训练参数与 Java 示例解读

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink ML 线性 SVM(Linear SVC)入门输入输出列、训练参数与 Java 示例解读

1. 输入列(Input Columns)

参数名类型默认值说明
featuresColVector"features"特征向量列
labelColInteger"label"标签列(要预测的类别标签)
weightColDouble"weight"样本权重(可选,用于处理样本不均衡等)

说明:featuresCol必须是 Flink ML 的 Vector 类型(DenseVector/SparseVector)。

2. 输出列(Output Columns)

参数名类型默认值说明
predictionColInteger"prediction"预测标签(最终分类结果)
rawPredictionColVector"rawPrediction"每个 label 的“原始预测向量”(可理解为得分/概率相关向量)

注意:文档里把predictionCol描述成 “Label of the max probability”。从工程角度建议你这样理解:

  • rawPrediction:模型对各类别的打分向量(可能是 margin/score,也可能被映射为概率形式,具体依实现而定)
  • prediction:在rawPrediction基础上做阈值/最大值选择后的最终标签

3. 参数(Parameters)详解

3.1 LinearSVCModel 参数(预测侧)

Key默认值类型说明
featuresCol"features"String特征列名
predictionCol"prediction"String预测列名
rawPredictionCol"rawPrediction"String原始预测列名
threshold0.0Double二分类阈值:作用于 rawPrediction 来决定预测为 0 还是 1

threshold只在二分类时特别重要:

  • rawPrediction 代表某种“置信/得分”,阈值决定了分类边界偏向哪个类别
  • 你可以通过调节 threshold 来控制召回/精度的取舍

3.2 LinearSVC 训练参数(训练侧)

Key默认值类型说明
labelCol"label"String标签列名
weightColnullString权重列名(不设置就不用权重)
maxIter20Integer最大迭代次数
reg0.0Double正则化强度(防止过拟合)
elasticNet0.0DoubleElasticNet 参数(0=L2,1=L1,介于其中混合)
learningRate0.1Double学习率
globalBatchSize32Integer全局 batch size
tol1e-6Double收敛容差(迭代停止条件之一)

你可以把这些参数看作“线性模型 + 梯度优化”的通用训练配置:

  • maxIter + tol控制训练何时停止
  • learningRate + batchSize控制优化步伐
  • reg + elasticNet控制模型复杂度与稀疏性

4. Java 示例代码流程解读

你给的示例代码做了这几件事:

  1. 构造训练数据(features, label, weight)
  2. 设置weightCol,训练 LinearSVC
  3. 用训练后的模型对输入数据做 transform
  4. 打印 features / expected label / prediction / rawPrediction

示例代码的关键片段

4.1 构造输入表
DataStream<Row>inputStream=env.fromElements(Row.of(Vectors.dense(1,2,3,4),0.,1.),...Row.of(Vectors.dense(15,2,3,4),1.,5.));TableinputTable=tEnv.fromDataStream(inputStream).as("features","label","weight");

这份数据大致表达:

  • 第一类 label=0:features 的第一个维度在 1~5
  • 第二类 label=1:features 的第一个维度在 11~15
    因此线性可分,非常适合用线性 SVM 学到一个简单分割平面。
4.2 训练模型
LinearSVClinearSVC=newLinearSVC().setWeightCol("weight");LinearSVCModellinearSVCModel=linearSVC.fit(inputTable);

设置weightCol表示不同样本对损失函数贡献不同权重。
在样本不均衡、或者你希望某些样本更重要时很有用。

4.3 预测并输出 rawPrediction
TableoutputTable=linearSVCModel.transform(inputTable)[0];

模型输出一般会包含:

  • 原始列:features / label / weight
  • 新增列:prediction / rawPrediction

5. 一个很容易踩的坑:label 类型与示例的“不一致”

文档写的是:

  • labelCol类型:Integer
  • predictionCol类型:Integer

但示例里 label 使用的是0./1.(Double),打印时也 cast 成Double

doubleexpectedResult=(Double)row.getField(linearSVC.getLabelCol());doublepredictionResult=(Double)row.getField(linearSVC.getPredictionCol());

为了少踩坑,建议你自己的工程里做两件事:

  • 标签列label用 Integer(0/1)更规范
  • 输出 prediction 也按 Integer 读取

如果你沿用 Double,也要保证 train/predict/读取类型统一,否则容易出现类型转换异常或 schema 不匹配。

6. 实战建议:Linear SVC 在生产环境怎么用更稳

1)强烈建议做特征缩放(StandardScaler)

SVM 依赖 margin 和距离尺度,特征量纲差异会显著影响结果。典型做法:

  • VectorAssembler(拼特征)
  • StandardScaler(标准化)
  • LinearSVC(训练)

这能明显提升收敛速度与模型稳定性。

2)调 threshold 来平衡召回与精度

二分类任务里,你可以把 threshold 当成“偏向正类/负类”的旋钮:

  • threshold 调低:更容易预测为正类(召回↑,误报↑)
  • threshold 调高:更保守(精度↑,漏报↑)

3)样本不均衡优先用 weightCol

比如正样本远少于负样本时:

  • 给正样本更高权重
  • 或给负样本更低权重

一般比盲目调参更直接有效。

4)正则化 reg + elasticNet 控制过拟合与稀疏

  • 想要更稳定:提高reg(偏 L2)
  • 想要更稀疏特征选择:提高elasticNet(偏 L1)

7. 小结

Linear SVC 在 Flink ML 中的使用非常符合 Flink ML 的统一设计:

  • 用 Table API 输入特征向量features
  • fit()训练得到LinearSVCModel
  • transform()输出predictionrawPrediction

理解这三点,你就能把它顺利放进 Pipeline 或 Graph 里,和特征工程、数据清洗、结果下游输出串起来。

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

YOLOv8 vs YOLOv9:精度与速度的博弈,谁更适合工业部署?

YOLOv8 vs YOLOv9&#xff1a;精度与速度的博弈&#xff0c;谁更适合工业部署&#xff1f; 在现代智能制造产线中&#xff0c;一个微小划痕可能意味着整批产品被召回。如何让机器“看”得既快又准&#xff1f;这正是目标检测技术的核心挑战。YOLO系列自诞生以来&#xff0c;始终…

作者头像 李华
网站建设 2026/4/16 12:15:01

计算机毕业设计,基于springboot的学生宿舍信息管理系统,附源码+数据库+论文,包远程安装调试运行

1、项目介绍 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了学生宿舍信息管理系统的开发全过程。通过分析学生宿舍信息管理系统管理的不足&#xff0c;创建了一个计算机管理学生宿舍信息管理系统的方案。文章介绍了…

作者头像 李华
网站建设 2026/4/16 12:15:30

Python工程師年薪從80萬到300萬:我掌握的10個高階技能清單

Python工程師年薪從80萬到300萬&#xff1a;我掌握的10個高階技能清單引言&#xff1a;從代碼工匠到技術決策者還記得五年前&#xff0c;當我拿到第一個80萬年薪Python工程師offer時的興奮。那時我以為自己已經達到了職業生涯的頂峰——熟練掌握Django、Flask&#xff0c;能獨立…

作者头像 李华
网站建设 2026/4/16 12:28:58

YOLO目标检测Web Demo上线!后台由GPU实时驱动

YOLO目标检测Web Demo上线&#xff01;后台由GPU实时驱动 在智能视觉应用日益普及的今天&#xff0c;用户对“即时反馈”的期待正不断推高技术门槛。无论是上传一张图片想立刻知道里面有什么物体&#xff0c;还是希望在监控画面中实时识别异常行为&#xff0c;背后都离不开一个…

作者头像 李华
网站建设 2026/4/16 12:28:38

YOLOv7-E6E发布!更大颈部结构但GPU内存控制得当

YOLOv7-E6E&#xff1a;更大颈部结构&#xff0c;更强特征融合&#xff0c;更优显存控制 在智能制造产线高速运转的今天&#xff0c;一个微小焊点的漏检可能引发整批产品的召回&#xff1b;在城市级视频监控系统中&#xff0c;一次对远距离行人的误判可能导致安防响应滞后。这些…

作者头像 李华
网站建设 2026/4/16 12:28:14

健康的关系不是单方面索取:想要别人爱你,要先学会爱自己,让别人知道你并不是一个缺爱的人,他才会更爱你

健康的关系不是单方面索取:想要别人爱你,要先学会爱自己,让别人知道你并不是一个缺爱的人,他才会更爱你 下载链接: https://download.csdn.net/download/qq_38998213/92508853目录 健康的关系不是单方面索取:想要别人爱你,要先学会爱自己,让别人知道你并不是一个缺爱…

作者头像 李华