Flink ML StandardScaler 标准化(去均值 + 除以标准差)让特征“同量纲”更好学

1. StandardScaler 做什么?

对向量特征的每个维度 (x) 做标准化:

  • 先减去均值:(x - \mu)(可选)
  • 再除以标准差:((x - \mu) / \sigma)(可选)

在 Flink ML 里,通过两个开关控制:

  • withMean:是否减均值(默认 false)
  • withStd:是否除以标准差(默认 true)

2. 输入列与输出列

输入列(Input Columns)

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

输出列(Output Columns)

参数名 类型 默认值 说明
outputCol Vector "output" 标准化后的向量

3. 参数详解(Parameters)

Key 默认值 类型 说明
inputCol "input" String 输入列名
outputCol "output" String 输出列名
withMean false Boolean 是否先减去均值(中心化)
withStd true Boolean 是否按标准差缩放到单位方差

withMean 什么时候开?

  • 你希望特征以 0 为中心、并且数据不是稀疏 one-hot/高维稀疏向量:可以开
  • 如果你的特征是稀疏向量(例如 OneHotEncoder 输出),一般不建议开(中心化会破坏稀疏性、带来不必要开销)

4. Java 示例解读(fit + transform)

标准用法永远是两步:

1)在训练数据上 fit() 学到每个维度的统计量(均值、方差/标准差)

2)用同一个 StandardScalerModel 对训练/预测数据 transform(),保证线上线下一致

你给的示例在同一份 inputTable 上 fit + transform,演示效果更直观。

java 复制代码
import org.apache.flink.ml.feature.standardscaler.StandardScaler;
import org.apache.flink.ml.feature.standardscaler.StandardScalerModel;
import org.apache.flink.ml.linalg.DenseVector;
import org.apache.flink.ml.linalg.Vectors;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.types.Row;
import org.apache.flink.util.CloseableIterator;

public class StandardScalerExample {
    public static void main(String[] args) {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        StreamTableEnvironment tEnv = StreamTableEnvironment.create(env);

        DataStream<Row> inputStream =
                env.fromElements(
                        Row.of(Vectors.dense(-2.5, 9, 1)),
                        Row.of(Vectors.dense(1.4, -5, 1)),
                        Row.of(Vectors.dense(2, -1, -2)));
        Table inputTable = tEnv.fromDataStream(inputStream).as("input");

        StandardScaler standardScaler = new StandardScaler(); // 默认 withMean=false, withStd=true

        StandardScalerModel model = standardScaler.fit(inputTable);

        Table outputTable = model.transform(inputTable)[0];

        for (CloseableIterator<Row> it = outputTable.execute().collect(); it.hasNext(); ) {
            Row row = it.next();
            DenseVector inputValue = (DenseVector) row.getField(standardScaler.getInputCol());
            DenseVector outputValue = (DenseVector) row.getField(standardScaler.getOutputCol());
            System.out.printf("Input Value: %s\tOutput Value: %s\n", inputValue, outputValue);
        }
    }
}

这段代码做了什么:

  • fit():扫描 inputTable,计算每个维度的标准差(以及如果 withMean=true 则计算均值)
  • transform():对每条向量逐维标准化,新增输出列 output

5. 实战建议

1)StandardScaler 比 MinMaxScaler 更抗异常值一点,但也不是"免疫"

StandardScaler用均值/方差,极端值仍会影响统计量,只是通常比 min/max 更稳定。

如果异常值特别多,建议先做截断/清洗,再标准化。

2)不要在预测数据上重新 fit

必须做到:

  • 训练阶段:fit(train)
  • 预测阶段:transform(predict) 用同一个 model
    否则线上每批数据的缩放尺度都变,模型输出会漂。

3)常见组合

  • VectorAssembler → StandardScaler → KMeans/KNN/LinearSVC/LogisticRegression
  • Bucketizer/OneHotEncoder 这种离散稀疏特征链路,一般不需要 withMean
相关推荐
冻柠檬飞冰走茶11 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
leobertlan12 小时前
【好玩系列】训练一个神经网络指导小孩玩游戏
android·机器学习·程序员
恣逍信点13 小时前
《凌微经》静态自悖——变化之自因
人工智能·科技·算法·机器学习·业界资讯·拓扑学·哲学
一次旅行15 小时前
AI前沿技术日报|2026-08-15|GLM-5.3、Qwen3.8开源、英伟达CPO交换机量产、SpaceX完成Cursor收购
人工智能·机器学习·开源
菜冻鱼15 小时前
Python-sklearn-降维
开发语言·人工智能·python·机器学习·支持向量机·sklearn
小马过河R15 小时前
不只是又一个 Agent 框架:DeepSeek Harness 如何重新定义“可组合”
人工智能·机器学习·系统架构·agent·ai编程·harness
watersink16 小时前
机器学习PCA
人工智能·机器学习
逻辑君16 小时前
科技逆向外语|20260808
人工智能·科技·机器学习
ShallWeL17 小时前
【机器学习】(40)—— 流水线监控
人工智能·机器学习·流水线监控
安逸Ai18 小时前
Batch Normalization 和 Layer Normalization 有什么用?
人工智能·机器学习·程序员