Flink ML MinMaxScaler 把特征缩放到统一区间 [min, max]

1. MinMaxScaler 做什么?

对每个特征维度 (x) 做缩放:

x′=x−xminxmax−xmin⋅(max−min)+min\]\[ x' = \\frac{x - x_{min}}{x_{max} - x_{min}} \\cdot (max - min) + min \]\[x′=xmax−xminx−xmin⋅(max−min)+min

其中 (xmin,xmax)(x_{min}, x_{max})(xmin,xmax)是从训练数据中统计得到的"该维度的最小值/最大值"。

2. 输入列与输出列

输入列(Input Columns)

参数名 类型 默认值 说明
inputCol Vector "input" 待缩放的特征向量

输出列(Output Columns)

参数名 类型 默认值 说明
outputCol Vector "output" 缩放后的特征向量

3. 参数(Parameters)

Key 默认值 类型 说明
inputCol "input" String 输入列名
outputCol "output" String 输出列名
min 0.0 Double 输出区间下界
max 1.0 Double 输出区间上界

你可以把特征缩放到:

  • [0, 1](默认)
  • [-1, 1](有时更适合某些模型)
  • 任意你需要的区间

4. Java 示例代码解读(训练 + 预测)

你贴的例子非常典型:先用训练集 fit 出缩放参数(每个维度的 min/max),再对预测集 transform。

4.1 训练数据(用于统计每一维的 min/max)

java 复制代码
DataStream<Row> trainStream =
        env.fromElements(
                Row.of(Vectors.dense(0.0, 3.0)),
                Row.of(Vectors.dense(2.1, 0.0)),
                Row.of(Vectors.dense(4.1, 5.1)),
                Row.of(Vectors.dense(6.1, 8.1)),
                Row.of(Vectors.dense(200, 400)));
Table trainTable = tEnv.fromDataStream(trainStream).as("input");

这组训练数据明显包含极端值 (200, 400),它会把两维的 max 拉得很大(这点在实战里要特别注意,后面会讲)。

4.2 预测数据(要做缩放)

java 复制代码
DataStream<Row> predictStream =
        env.fromElements(
                Row.of(Vectors.dense(150.0, 90.0)),
                Row.of(Vectors.dense(50.0, 40.0)),
                Row.of(Vectors.dense(100.0, 50.0)));
Table predictTable = tEnv.fromDataStream(predictStream).as("input");

4.3 训练 MinMaxScaler 并 transform

java 复制代码
MinMaxScaler minMaxScaler = new MinMaxScaler();
MinMaxScalerModel minMaxScalerModel = minMaxScaler.fit(trainTable);
Table outputTable = minMaxScalerModel.transform(predictTable)[0];

4.4 打印输入与输出

java 复制代码
DenseVector inputValue = (DenseVector) row.getField(minMaxScaler.getInputCol());
DenseVector outputValue = (DenseVector) row.getField(minMaxScaler.getOutputCol());
System.out.printf("Input Value: %-15s\tOutput Value: %s\n", inputValue, outputValue);

输出表会包含:

  • 原始列:input
  • 新增列:output(缩放后的向量)

5. 实战建议(很关键)

1)MinMaxScaler 对异常值非常敏感

因为它直接用训练集的 min/max,当训练集中出现极端值时:

  • 大部分正常样本会被压缩到非常接近 0 的小范围
  • 模型对细微差异不敏感(尤其对距离类算法影响明显)

常见解决方案:

  • 先做异常值处理(winsorize/clip)
  • 使用分位数范围做近似 min/max(工程上常见)
  • 或改用 StandardScaler(标准化)更稳

2)训练/预测必须用同一套 scaler 参数

正确姿势永远是:

  • fit(train) 只在训练集上统计 min/max
  • transform(train/predict) 都用同一个 model

不要在预测数据上重新 fit,否则线上会出现"同一个样本在不同批次缩放结果不同"的问题。

3)缩放区间如何选?

  • 默认 [0, 1]:通用且好理解
  • [-1, 1]:如果后续模型/特征更希望以 0 为中心,可能更合适

例如:

java 复制代码
MinMaxScaler scaler = new MinMaxScaler().setMin(-1.0).setMax(1.0);

4)通常会放进 Pipeline

MinMaxScaler 常见组合:

  • VectorAssembler → MinMaxScaler → KMeans/KNN/SVM/LR
  • Bucketizer → OneHot → LR(这里 MinMaxScaler 不一定必需)

6. 小结

MinMaxScaler 是 Flink ML 特征工程中最常用的"缩放器"之一:

  • 输入:inputCol(Vector)
  • 输出:outputCol(Vector)
  • fit() 在训练集上学习每一维的 min/max
  • transform() 把新数据线性映射到 [min, max](默认 [0,1]

它简单高效,但要特别注意异常值带来的"压缩效应"。

相关推荐
武子康4 分钟前
旧对话为什么没有恢复代码:Pi Session Tree 与上下文投影
人工智能
武子康5 分钟前
DeepSeek 把 Agent Core 也插件化了:Harness 的真正赌注
人工智能·llm·agent
wu_jing_sheng015 分钟前
哨兵卫星数据下载工具:基于CDSE的PySide6桌面应用开发实践
人工智能
小唔w16 分钟前
2026年AI培训行业观察:主流学习渠道一览
人工智能·学习
美狐美颜sdk18 分钟前
直播APP开发技术架构解析:从音视频流到第三方美颜SDK接入的完整方案
大数据·人工智能·音视频·美颜sdk·美颜api
CIO_Alliance26 分钟前
AI认知系列(3)| 数据、算法、算力、场景四要素协同
人工智能·算法·ipaas·系统集成·企业cio联盟·企业级ai化转型
技术传感器34 分钟前
让 Hermes 自动完成一个软件需求:从 Issue 到 PR 的 AI 开发流水线
人工智能·架构·aigc·需求分析·issue
啥都想学点的研究生35 分钟前
一篇文章讲清楚:机器学习的相关概念
人工智能·机器学习
Capricorn198842 分钟前
知芽研究问题看板无法推进?从孵化区到笔记的机制排查指南
大数据·论文阅读·人工智能·笔记·学习方法·论文笔记
Wang's Blog1 小时前
AI Agent白手起家76:使用 CrewAI 搭建多智能体营销策略生成器
人工智能