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
相关推荐
OpenBayes贝式计算1 天前
解决视频模型痛点,TurboDiffusion 高效视频扩散生成系统;Google Streetview 涵盖多个国家的街景图像数据集
人工智能·深度学习·机器学习
OpenBayes贝式计算1 天前
OCR教程汇总丨DeepSeek/百度飞桨/华中科大等开源创新技术,实现OCR高精度、本地化部署
人工智能·深度学习·机器学习
够快云库2 天前
能源行业非结构化数据治理实战:从数据沼泽到智能资产
大数据·人工智能·机器学习·企业文件安全
B站_计算机毕业设计之家2 天前
电影知识图谱推荐问答系统 | Python Django系统 Neo4j MySQL Echarts 协同过滤 大数据 人工智能 毕业设计源码(建议收藏)✅
人工智能·python·机器学习·django·毕业设计·echarts·知识图谱
Flying pigs~~2 天前
机器学习之逻辑回归
人工智能·机器学习·数据挖掘·数据分析·逻辑回归
Evand J2 天前
通过matlab实现机器学习的小项目示例(鸢尾花分类)
机器学习·支持向量机·matlab
_Li.2 天前
Simulink - 6DOF (Euler Angles)
人工智能·算法·机器学习·游戏引擎·cocos2d
Project_Observer2 天前
工时日志在项目进度管理中扮演着怎样的角色?
数据库·深度学习·机器学习
scott1985122 天前
Improving Classifier-Free Guidance of Flow Matching via Manifold Projection
人工智能·python·机器学习