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]

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

相关推荐
一点一木6 小时前
🚀 2026 年 4 月 GitHub 十大热门项目排行榜 🔥
人工智能·github
淡海水7 小时前
【AI模型】常见问题与解决方案
人工智能·深度学习·机器学习
HIT_Weston8 小时前
65、【Agent】【OpenCode】用户对话提示词(费米估算)
人工智能·agent·opencode
njsgcs8 小时前
我的知识是以图片保存的,我的任务状态可能也与图片有关,我把100张知识图片丢给vlm实时分析吗
人工智能
星爷AG I8 小时前
20-4 长时工作记忆(AGI基础理论)
人工智能·agi
#卢松松#8 小时前
用秒悟(meoo)制作了一个GEO查询小工具。
人工智能·创业创新
zandy10118 小时前
Agentic BI 架构实战:当AI Agent接管数据建模、指标计算与可视化全链路
人工智能·架构
数字供应链安全产品选型8 小时前
关键领域清单+SBOM:834号令下软件供应链的“精准治理“逻辑与技术落地路径
人工智能·安全
Flying pigs~~8 小时前
RAG智慧问答项目
数据库·人工智能·缓存·微调·知识库·rag
zuozewei9 小时前
从线下到等保二级生产平台:一次公有云新型电力系统 AI 部署复盘
人工智能