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])

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

相关推荐
不会是要长脑子了吧2 小时前
ChatGPT 网页端报 “Model not found“
人工智能·chatgpt
史努比的蓝色皮肤2 小时前
从 ChatGPT 到 Agent :AI 发展脉络
人工智能·chatgpt
kyriewen2 小时前
我扒了 npm 三年数据:AI 没把依赖变胖,是把包变多了
前端·人工智能·程序员
面包狗AI4S2 小时前
ChatGPT/Codex Windows:本地桌面端应用离线包安装与免安装启动方法(无需管理员权限)
人工智能·windows·ai·chatgpt
龙粤GEO2 小时前
RAG检索机制如何影响AI引用?一次SaaS品牌GEO优化实战复盘
人工智能
编码小哥2 小时前
YOLO26深度解析:为边缘计算而生的新一代实时视觉模型
人工智能·边缘计算
2401_865261632 小时前
亦唐科技:大数据如何驱动精准商业决策
大数据·科技
前端.火鸡2 小时前
Embedding:机器是怎么“理解“语义的
人工智能·embedding
AI语宙漫游指南2 小时前
Opus 5.5 那种代码动画,国产模型加个 Skill 也能做?
人工智能·agent
Moono1452 小时前
一文搞懂API网关和Ingress区别:MAI Gateway vs 主流方案横评
人工智能