戴尔G15终极散热控制神器:开源免费替代AWCC的完整指南
2026/7/28 15:44:32
One-hot 编码把一个类别索引(例如 2)映射成一个向量:
举个例子:假设类别数 3(0/1/2)
如果dropLast=true(默认):
这叫“去掉冗余维度”,常用于线性模型防止共线性(dummy variable trap)。
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
inputCols | Integer | null | 类别索引列(可多列) |
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
outputCols | Vector | null | one-hot 后的向量列(可多列) |
| Key | 默认值 | 必填 | 说明 |
|---|---|---|---|
inputCols | null | ✅ | 输入列名数组 |
outputCols | null | ✅ | 输出列名数组 |
handleInvalid | ERROR_INVALID | 否 | 遇到非法值如何处理:ERROR_INVALID/SKIP_INVALID |
dropLast | true | 否 | 是否丢弃最后一类(输出维度减少 1) |
dropLast=true(默认):dropLast=false:ERROR_INVALID:脏数据直接失败(更严格)SKIP_INVALID:跳过包含非法类别索引的行(更稳,线上更常见)你贴的示例非常标准:先用训练数据拟合出类别空间(决定 one-hot 维度),再对预测数据输出 one-hot 向量。
DataStream<Row>trainStream=env.fromElements(Row.of(0.0),Row.of(1.0),Row.of(2.0),Row.of(0.0));TabletrainTable=tEnv.fromDataStream(trainStream).as("input");训练集出现了 0/1/2 三个类别,所以类别数 N=3。
若 dropLast=true,输出维度 = 2;若 dropLast=false,输出维度 = 3。
DataStream<Row>predictStream=env.fromElements(Row.of(0.0),Row.of(1.0),Row.of(2.0));TablepredictTable=tEnv.fromDataStream(predictStream).as("input");OneHotEncoderoneHotEncoder=newOneHotEncoder().setInputCols("input").setOutputCols("output");OneHotEncoderModelmodel=oneHotEncoder.fit(trainTable);TableoutputTable=model.transform(predictTable)[0];DoubleinputValue=(Double)row.getField(oneHotEncoder.getInputCols()[0]);SparseVectoroutputValue=(SparseVector)row.getField(oneHotEncoder.getOutputCols()[0]);System.out.printf("Input Value: %s\tOutput Value: %s\n",inputValue,outputValue);输出是 SparseVector,典型打印可能类似:
连续特征先分桶再 one-hot,是 CTR/风控等场景的经典套路:
如果原始是字符串类别(比如 “Beijing”/“Shanghai”),通常流程是:
1)训练集类别空间决定输出维度
预测时出现训练集中没见过的类别,如果 handleInvalid=ERROR_INVALID 可能会直接失败。线上更建议:
2)输入列类型要统一
文档说 inputCols 是 Integer,但示例用 Double(0.0/1.0/2.0)。
工程里建议你用 Integer/Long 更清晰,减少类型转换风险。
3)dropLast 的影响要明确
dropLast=true 时,最后一类会被编码成全 0 向量,这在调试/可解释性上容易误解(看起来像“缺失”),所以如果你更强调解释,可考虑 dropLast=false。
OneHotEncoder 是 Flink ML 特征工程里最常用的离散特征转换器之一:
dropLast控制是否减少一个维度(默认 true)handleInvalid控制脏数据处理策略(线上建议更稳的策略)