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]

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

相关推荐
IVVi0jToe几秒前
2026年是“多智能体元年”——从单Agent到Agent军团
人工智能
TTBIGDATA几秒前
【Ambari Plus】11.Kafka 安装
大数据·hadoop·分布式·kafka·ambari·hdp·ambari plus
2zcode2 分钟前
基于MATLAB图像处理的苹果质量智能分级系统设计与实现
图像处理·人工智能·matlab
星空5 分钟前
git指令
大数据·elasticsearch·搜索引擎
AI-好学者6 分钟前
MCP企业运用全面知识点-基础篇
服务器·开发语言·网络·人工智能·python·架构
李昊哲小课10 分钟前
Ubuntu26.04 搭建 Hadoop3.5.0 完全分布式
大数据·hadoop·分布式·ubuntu·hdfs·mapreduce
私人珍藏库14 分钟前
[Android] 多开空间-一机多账号+应用一键克隆双开
android·人工智能·智能手机·软件
Sam092714 分钟前
【AI 算法精讲 13】朴素贝叶斯:文本分类的基石
人工智能·python·算法·ai
SilentSamsara18 分钟前
模型可解释性业务化:SHAP/LIME 的业务汇报与合规审查
人工智能·算法·机器学习·自动化
STLearner19 分钟前
ICML 2026 | 时间序列(Time Series)论文总结【基础模型,生成,分类,异常检测,插补,表示学习和分析等】
论文阅读·人工智能·python·深度学习·神经网络·机器学习·数据挖掘