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]

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

相关推荐
测试员周周1 分钟前
【Appium 系列】第18节-重试与容错 — 移动端测试的稳定性保障
人工智能·python·功能测试·ui·单元测试·appium·测试用例
l1t23 分钟前
Hy-MT2-1.8B总结的pgvector 0.8.2解决了并行HNSW索引构建漏洞
数据库·人工智能·postgresql
太华23 分钟前
学习AI Agent编程-第二天-LangGraph ReAct模式实现
人工智能
dayuOK630726 分钟前
从“爆款复刻”到“个性化创作”:AI辅助写作的技术挑战与演进方向
人工智能·职场和发展·自动化·新媒体运营·媒体
Raink老师35 分钟前
【AI面试临阵磨枪-58】AI 生成内容合规、版权、审核机制设计
人工智能·面试·职场和发展
lizhihai_9935 分钟前
股市学习心得-与英伟达核心 PCB 相关的八家关联企业
大数据·人工智能·学习
嗝o゚42 分钟前
昇腾CANN ops-nn 仓的 Activation 算子:不只是 ReLU
人工智能·cann·ops-nn
thubier(段新建)44 分钟前
从需求到上线:需求→业务→架构→功能→实现 全链路落地方法论
人工智能·架构
北辰alk1 小时前
claude code安装教程,一文读懂。
人工智能
AskHarries1 小时前
Product Hunt 挖项目方法:如何从榜单里找到真正值得做的产品
人工智能