当前位置: 首页 > news >正文

Flink ML VectorAssembler 把多列特征“拼”成一个向量列(数值 + 向量都支持)

1. VectorAssembler 做什么?

给定一组输入列inputCols(每列类型必须是数值Vector),把它们按顺序组合成一个新向量列outputCol

  • 输入可以混合:

    • 单个数值列(Number)
    • DenseVector / SparseVector(Vector)
  • 输出是一个 Vector(通常是稠密或稀疏表示,取决于内部实现与输入组合)

典型用途:

  • StringIndexer -> OneHotEncoder -> VectorAssembler -> LogisticRegression
  • 数值特征 + one-hot 稀疏特征 + embedding 向量 -> VectorAssembler -> 模型

2. 输入列与输出列

输入列(Input Columns)

参数名类型默认值说明
inputColsNumber / Vectornull待拼接的列(可多列)

输出列(Output Columns)

参数名类型默认值说明
outputColVector"output"拼接后的向量列

3. 参数详解(Parameters)

Key默认值必填说明
inputColsnull输入列名数组(顺序很重要)
outputCol"output"输出列名
handleInvalidERROR_INVALID遇到非法值如何处理(如空值/类型不对等)

工程建议:

  • inputCols的顺序决定最终向量的维度排列,一旦上线最好固定,否则训练/预测会对不上。

4. Java 示例逐段解读

示例里把三列拼成一列:

  • vec:DenseVector(2.1, 3.1)(长度 2)
  • num:数值 1.0(长度 1)
  • sparseVec:SparseVector(size=5, …)(长度 5)

最终拼出来的向量长度应该是:2 + 1 + 5 = 8

4.1 输入数据

DataStream<Row>inputStream=env.fromElements(Row.of(Vectors.dense(2.1,3.1),1.0,Vectors.sparse(5,newint[]{3},newdouble[]{1.0})),Row.of(Vectors.dense(2.1,3.1),1.0,Vectors.sparse(5,newint[]{4,2,3,1},newdouble[]{4.0,2.0,3.0,1.0})));TableinputTable=tEnv.fromDataStream(inputStream).as("vec","num","sparseVec");

这里sparseVec的 size=5,意味着它代表长度为 5 的向量,只不过用稀疏方式存储非零位置。

4.2 创建 VectorAssembler

VectorAssemblervectorAssembler=newVectorAssembler().setInputCols("vec","num","sparseVec").setOutputCol("assembledVec");

拼接顺序就是:vec在前,num在中间,sparseVec在最后。
最终向量的 layout 可以理解为:

assembledVec = [ vec(2 dims) | num(1 dim) | sparseVec(5 dims) ]

4.3 transform 并读取输出

TableoutputTable=vectorAssembler.transform(inputTable)[0];VectoroutputValue=(Vector)row.getField(vectorAssembler.getOutputCol());System.out.printf("... Output Value: %s\n",outputValue);

输出 Value 会是一个 Vector(可能打印成 dense 或 sparse),内容会把三列的信息组合到同一个向量里。

5. 实战注意点(很关键)

1)OneHotEncoder 输出通常是 SparseVector,Assembler 非常适配

这也是最常见链路:

  • StringIndexer:city -> cityIndex
  • OneHotEncoder:cityIndex -> cityVec (SparseVector)
  • VectorAssembler:[数值列, cityVec, 其它Vec] -> features
  • LogisticRegression:features -> prediction

2)数值列不要忘记类型一致性

你的示例里num是 Double(1.0)。实际表里可能是 INT/LONG/FLOAT,建议统一成 Double 或确保能被识别为 Number。

3)维度稳定性是上线生命线

如果你在训练时inputCols=["age","cityVec","deviceVec"],上线推理千万不要换成["cityVec","age","deviceVec"],否则模型输入维度语义全错。

4)handleInvalid 的选择

  • 离线训练:可以ERROR_INVALID让问题暴露
  • 线上:更倾向“先做清洗”,或者用能跳过/替代的策略(如果支持),避免任务被脏数据打挂

6. 小结

VectorAssembler 是 Flink ML 里把“多列特征形态”统一成features向量列的关键组件:

  • 支持 Number + Vector 混合拼接
  • inputCols顺序决定最终向量维度布局
  • 常用于把 one-hot、embedding、数值特征拼成一个 features 列喂给模型
http://www.jsqmd.com/news/162183/

相关文章:

  • PyTorch-CUDA-v2.8镜像对LoRA微调的支持能力
  • XUnity自动翻译器:Unity游戏汉化的终极解决方案
  • 41、Linux 网络编程并发模型总结(select / epoll / fork / pthread)
  • 自定义Java命令行的编译运行脚本
  • PyTorch镜像能否用于生产环境?稳定性测试结果公布
  • PyTorch-CUDA-v2.8镜像环境变量配置说明
  • OceanBase 数据库 TPCH ACID 测试
  • Unity游戏翻译高效解决方案:XUnity.AutoTranslator完整使用指南
  • 利用OpenAMP提升工控系统响应速度:深度剖析
  • 2025年终四川用友公司推荐:聚焦本地化案例的5强口碑榜单深度解析。 - 十大品牌推荐
  • 基于S7-200 PLC和组态王软件设计的智能快件分拣系统:技术详解与实现图谱
  • DownKyi完整使用指南:从零开始掌握B站视频下载
  • PyTorch镜像中实现模型剪枝与稀疏化操作
  • 图解说明蜂鸣器驱动电路连接方式与原理
  • PyTorch镜像运行AutoML任务:自动化超参搜索实战
  • 会用 Grid 布局吗?面试官问我这个问题,我差点没答上来!
  • PyTorch-CUDA镜像能否用于边缘设备部署?
  • PyTorch镜像中运行SimCLR自监督学习任务
  • PyTorch-CUDA镜像能否用于自动驾驶感知模块开发?
  • PyTorch-CUDA-v2.8镜像SSH连接教程:远程开发全流程解析
  • 2025 搜索优化新革命:GEO 正在悄然取代 SEO?
  • PyTorch-CUDA镜像是否支持Windows系统?答案在这里
  • PyTorch镜像中运行Streamlit构建可视化界面
  • PyTorch镜像中如何安装额外包?pip与conda使用建议
  • PyTorch镜像中运行BERT文本分类全流程演示
  • PyTorch-CUDA-v2.8镜像支持哪些NVIDIA显卡型号?
  • PyTorch-CUDA-v2.8镜像是否预装ray?分布式计算支持
  • 电机控制器中的滑模观测器PMSM无感矢量控制仿真研究:PLL与arctan开关设置下的性能探讨...
  • PyTorch镜像中使用tensorboardX记录训练指标
  • COOFDM的Matlab仿真程序详解:从代码实现到理论解析的综合指南