one-hot编码(独热编码)将每个具有m个可能值的特征转换为m个二元特征。这些特征互斥,每次只有一个被激活,使得经过独热编码后的数据变稀疏,输出结果也是KV的稀疏结构。
功能介绍
one-hot编码组件包括训练和预测功能:
one-hot编码组件训练功能:
输入节点:该组件左输入节点(输入表的表名)是训练数据的输入,训练时无需设置输入节点(右)。
输出节点:该组件有两个输出节点,一个是编码后的结果表(左),另一个是输出模型表(右),该模型表用于对同类型的新数据进行one-hot编码。
one-hot编码组件预测功能
one-hot组件的右输入节点(输入模型表)是one-hot的模型输入,可以利用已有的one-hot模型对新数据进行one-hot编码。
组件配置
您可以使用以下任意一种方式,配置one-hot编码组件参数。
方式一:可视化方式
在Designer工作流页面配置组件参数。
页签 | 参数 | 描述 |
字段设置 | 选择二值化列 | 选择二值化的字段,必选项。 |
其他保留特征 | 勾选的字段当作保留特征(不进行one-hot编码)输出至KV字段中,从0开始编码,字段必须为DOUBLE类型。 | |
附加列 | 附加在输出表的列,可选项。 | |
参数设置 | 生命周期 | 表的生命周期,默认值为7。 |
输出表的类型 | 包括kv和table。当离散特征较多时,建议输出kv格式,table仅支持1024列。 | |
节点个数 | 节点的个数。 | |
单个结点内存大小 | 单个结点的内存大小,单位为MB。 | |
删除最后一个枚举量的编码 | 该参数为true时,可以保证编码后数据的线性无关性。 | |
忽略待编码数据中的空元素 | 该参数为true时,表示不对空元素编码。 |
方式二:PAI命令方式
使用PAI命令方式,配置该组件参数。您可以使用SQL脚本组件进行PAI命令调用,详情请参见SQL脚本。
PAI -name one_hot
-project algo_public
-DinputTable=one_hot_test
-DbinaryCols=f0,f1,f2
-DmodelTable=one_hot_model
-DoutputTable=one_hot_output
-Dlifecycle=28;
参数名称 | 是否必选 | 描述 | 默认值 |
inputTable | 是 | 输入表的名称。 | 无 |
inputTablePartitions | 否 | 输入表选择的分区名称。 | 输入表的所有分区 |
binaryCols | 是 | one-hot编码字段,必须是枚举类特征,字段可以是任意类型。 | 无 |
reserveCols | 否 | 选择的字段当作保留特征(不进行one-hot编码)输出至KV字段中,从0开始编码,该字段必须为DOUBLE类型。 | 空字符串 |
appendCols | 否 | 选择的字段原封不动地输出至输出表中。 | 无 |
outputTable | 是 | one-hot后的结果表,编码结果保存在KV字段中。 | 无 |
inputModelTable | 否 | one-hot编码的输入模型表。 说明 inputModelTable和outputModelTable中必须有一个为非空字符串。inputModelTable非空时,对应表为非空的模型表。 | 空字符串 |
outputModelTable | 否 | one-hot编码的输出模型表。 说明 inputModelTable和outputModelTable中必须有一个为非空字符串。 | 空字符串 |
lifecycle | 否 | 输出表的生命周期。 | 7 |
dropLast | 是 | 是否删除最后一个枚举量的编码。该参数为true时,可以保证编码后数据的线性无关性。 | false |
outputTableType | 是 | 输出表的类型,包括kv(稀疏表)和table(稠密表)。 当离散特征较多时,建议输出kv格式。table仅支持1024列,超出将报错。 | kv |
ignoreNull | 是 | 是否忽略待编码数据中的空元素。该参数为true时,表示不对空元素编码。 | false |
coreNum | 否 | 节点的个数。 | 自动计算 |
memSizePerCore | 否 | 单个结点的内存大小,单位为MB,范围为[2048, 64*1024]。 | 自动计算 |
编码字段列中,离散值个数可以支持至千万量级。
当训练的模型作为下次编码使用的模型时,由于dropLast、ignoreNull和reserveCols编码参数的效果已封装到模型中,无法进行调整。如果您需要调整,则必须重新训练。
one-hot编码生成的kv表默认从0开始编号。
当使用模型编码新数据时,如果在模型映射表中无法找到数据中的离散量,则忽略该离散量,即不对该离散量编码。如果需要对其进行编码,请重新训练模型映射表。
示例
输入表的数据如下。
f0(BIGINT)
f1(STRING)
f2(DATETIME)
f3(DOUBLE)
f4(BOOLEAN)
12
prefix1
1970-09-15 12:50:22
0.1
true
12
prefix3
1971-01-22 03:15:33
0.4
false
NULL
prefix3
1970-01-01 08:00:00
0.2
NULL
3
NULL
1970-01-01 08:00:00
0.3
false
34
NULL
1970-09-15 12:50:22
0.4
NULL
3
prefix1
1970-09-15 12:50:22
0.2
true
3
prefix1
1970-09-15 12:50:22
0.3
false
3
prefix3
1970-01-01 08:00:00
0.2
true
3
prefix3
1971-01-22 03:15:33
0.1
false
NULL
prefix3
1970-01-01 08:00:00
0.3
false
在SQL脚本组件中配置one-hot编码参数如下。
PAI -project algo_public -name one_hot --组件默认参数,无需修改 -DinputTable=one_hot -DbinaryCols=f0,f2,f4 -DoutputModelTable=one_hot_model_8 -DoutputTable=one_hot_in_table_1_output_8 -DdropLast=false -DappendCols=f0,f2,f4 -DignoreNull=false -DoutputTableType=table -DreserveCols=f3 -DcoreNum=4 -DmemSizePerCore=2048;
运行成功后查看输出结果。
one-hot编码的输出模型表。
第一行为reserve行,列名值固定为_reserve_,保存reserve信息。
col_name
col_value
mapping
_reserve_
f3
0
f0
12
1
f0
3
2
f0
34
3
f0
null
4
f2
0
5
f2
22222222000
6
f2
33333333000
7
f4
0
8
f4
1
9
f4
null
10
结果表中最上面一行为reserve行,列名值固定为reserve,保存reserve信息;其余行对应的是编码映射信息。
编码后的结果表
table
f0
f2
f4
_reserve__f3_0
f0_12_1
f0_3_2
f0_34_3
f0_null_4
f2_0_5
f2_22222222_6
f2_33333333_7
f4_0_8
f4_1_9
f4_null_10
12
1970-09-15 12:50:22
true
0.1
1.0
0.0
0.0
0.0
0.0
1.0
0.0
0.0
1.0
0.0
12
1971-01-22 03:15:33
false
0.4
1.0
0.0
0.0
0.0
0.0
0.0
1.0
1.0
0.0
0.0
NULL
1970-01-01 08:00:00
NULL
0.2
0.0
0.0
0.0
1.0
1.0
0.0
0.0
0.0
0.0
1.0
3
1970-01-01 08:00:00
false
0.3
0.0
1.0
0.0
0.0
1.0
0.0
0.0
1.0
0.0
0.0
34
1970-09-15 12:50:22
NULL
0.4
0.0
0.0
1.0
0.0
0.0
1.0
0.0
0.0
0.0
1.0
3
1970-09-15 12:50:22
true
0.2
0.0
1.0
0.0
0.0
0.0
1.0
0.0
0.0
1.0
0.0
3
1970-09-15 12:50:22
false
0.3
0.0
1.0
0.0
0.0
0.0
1.0
0.0
1.0
0.0
0.0
3
1970-01-01 08:00:00
true
0.2
0.0
1.0
0.0
0.0
1.0
0.0
0.0
0.0
1.0
0.0
3
1971-01-22 03:15:33
false
0.1
0.0
1.0
0.0
0.0
0.0
0.0
1.0
1.0
0.0
0.0
NULL
1970-01-01 08:00:00
false
0.3
0.0
0.0
0.0
1.0
1.0
0.0
0.0
1.0
0.0
0.0
kv
f0
f2
f4
kv
12
1970-09-15 12:50:22
true
0:0.1,1:1,6:1,9:1
12
1971-01-22 03:15:33
false
0:0.4,1:1,7:1,8:1
NULL
1970-01-01 08:00:00
NULL
0:0.2,4:1,5:1,10:1
3
1970-01-01 08:00:00
false
0:0.3,2:1,5:1,8:1
34
1970-09-15 12:50:22
NULL
0:0.4,3:1,6:1,10:1
3
1970-09-15 12:50:22
true
0:0.2,2:1,6:1,9:1
3
1970-09-15 12:50:22
false
0:0.3,2:1,6:1,8:1
3
1970-01-01 08:00:00
true
0:0.2,2:1,5:1,9:1
3
1971-01-22 03:15:33
false
0:0.1,2:1,7:1,8:1
NULL
1970-01-01 08:00:00
false
0:0.3,4:1,5:1,8:1
扩展性测试
测试数据:样本数为2亿,枚举量为10万,测试数据表示例如下。
f0 | f1 |
94 | prefix3689 |
9664 | prefix5682 |
2062 | prefix5530 |
9075 | prefix9854 |
9836 | prefix1764 |
5140 | prefix1149 |
3455 | prefix7272 |
2508 | prefix7139 |
7993 | prefix1551 |
5602 | prefix4606 |
3132 | prefix5767 |
测试结果如下。
core num | train time | predict time | 加速比 |
5 | 84s | 181s | 1/1 |
10 | 60s | 93s | 1.4/1.95 |
20 | 46s | 56s | 1.8/3.23 |
Web端的使用说明:
直接使用该组件进行编码,流程如下。
使用该组件的训练模型,再通过模型对数据进行编码,流程如下。