本文为您介绍PAI-Studio提供的特征生成算法,包括特征编码和one-hot编码。

特征编码

特征编码是由决策树和Ensemble算法挖掘新特征的一种策略,特征来自一个或多个特征组成的决策树叶子结点的one-hot结果。

例如,下图有三棵树,共有34个构成的叶子结点。根据树的顺序依次编码为0~11号特征,其中第0棵树的叶子结点占据0~3号特征,第二棵树占据4~7号特征,第三棵树占据8~11号特征。该编码策略可以有效转换GBDT非线性特征为线性特征。特征编码
您可以通过以下任意一种方式,配置特征编码组件参数:
  • 可视化方式
    页签 参数 描述
    字段设置 特征列 输入表中,用于训练的特征列。
    标签列 该参数为必选项。

    单击目录图标,在选择字段对话框中,输入关键字搜索列,选中后单击确定

    附加输出列 可选,保留原特征至输出结果表。
    参数设置 计算核心数 计算的核心数,格式为正整数。
    每个核心内存数 每个核心的内存数量,格式为正整数。
  • PAI命令格式
    PAI -name fe_encode_runner -project algo_public
        -DinputTable="pai_temp_2159_19087_1"
        -DencodeModel="xlab_m_GBDT_LR_1_19064"
        -DselectedCols="pdays,previous,emp_var_rate,cons_price_idx,cons_conf_idx,euribor3m,nr_employed,age,campaign"
        -DlabelCol="y"
        -DoutputTable="pai_temp_2159_19061_1";
       -DcoreNum=10
       -DmemSizePerCore=1024
    参数名称 是否必选 描述 默认值
    inputTable 输入表的名称。
    inputTablePartitions 输入表中指定参与训练的分区,格式为partition_name=value

    如果是多级,格式为name1=value1/name2=value2

    如果指定多个分区,使用英文逗号(,)分隔。

    输入表的所有分区
    encodeModel 编码的输入GBDT二分类的模型。
    outputTable 缩放尺度后的结果表。
    selectedCols 勾选GBDT参与编码的特征,通常是GBDT组件的训练特征。
    labelCol 标签字段。
    lifecycle 结果表的生命周期。 7
    coreNum 指定Instance的总数,支持BIGINT类型。 -1,会根据输入数据量计算需要的Instance的数量。
    memSizePerCore 指定memory大小。 -1,会根据输入数据量计算需要的内存大小。

特征编码示例

  1. 使用SQL语句,生成训练数据。
    CREATE TABLE IF NOT EXISTS tdl_pai_bank_test1
    (
        age            BIGINT COMMENT '',
        campaign       BIGINT COMMENT '',
        pdays          BIGINT COMMENT '',
        previous       BIGINT COMMENT '',
        emp_var_rate   DOUBLE COMMENT '',
        cons_price_idx DOUBLE COMMENT '',
        cons_conf_idx  DOUBLE COMMENT '',
        euribor3m      DOUBLE COMMENT '',
        nr_employed    DOUBLE COMMENT '',
        y              BIGINT COMMENT ''
    )
    LIFECYCLE 7;
    insert overwrite table tdl_pai_bank_test1
    select * from
    (select 53 as age,1 as campaign,999 as pdays,0 as previous,-0.1 as emp_var_rate,
           93.2 as cons_price_idx,-42.0 as cons_conf_idx, 4.021 as euribor3m,5195.8 as nr_employed,0 as y
    from dual
    union all
    select 28 as age,3 as campaign,6 as pdays,2 as previous,-1.7 as emp_var_rate,
           94.055 as cons_price_idx,-39.8 as cons_conf_idx, 0.729 as euribor3m,4991.6 as nr_employed,1 as y
    from dual
    union all
    select 39 as age,2 as campaign,999 as pdays,0 as previous,-1.8 as emp_var_rate,
           93.075 as cons_price_idx,-47.1 as cons_conf_idx, 1.405 as euribor3m,5099.8 as nr_employed,0 as y
    from dual
    union all
    select 55 as age,1 as campaign,3 as pdays,1 as previous,-2.9 as emp_var_rate,
           92.201 as cons_price_idx,-31.4 as cons_conf_idx, 0.869 as euribor3m,5076.2 as nr_employed,1 as y
    from dual
    union all
    select 30 as age,8 as campaign,999 as pdays,0 as previous,1.4 as emp_var_rate,
           93.918 as cons_price_idx,-42.7 as cons_conf_idx, 4.961 as euribor3m,5228.2 as nr_employed,0 as y
    from dual
    union all
    select 37 as age,1 as campaign,999 as pdays,0 as previous,-1.8 as emp_var_rate,
           92.893 as cons_price_idx,-46.2 as cons_conf_idx, 1.327 as euribor3m,5099.1 as nr_employed,0 as y
    from dual
    union all
    select 39 as age,1 as campaign,999 as pdays,0 as previous,-1.8 as emp_var_rate,
           92.893 as cons_price_idx,-46.2 as cons_conf_idx, 1.313 as euribor3m,5099.1 as nr_employed,0 as y
    from dual
    union all
    select 36 as age,1 as campaign,3 as pdays,1 as previous,-2.9 as emp_var_rate,
           92.963 as cons_price_idx,-40.8 as cons_conf_idx, 1.266 as euribor3m,5076.2 as nr_employed,1 as y
    from dual
    union all
    select 27 as age,2 as campaign,999 as pdays,1 as previous,-1.8 as emp_var_rate,
           93.075 as cons_price_idx,-47.1 as cons_conf_idx, 1.41 as euribor3m,5099.1 as nr_employed,0 as y
    from dual
    ) a
  2. 构建如下实验,通常与GBDT二分类组件配合使用。详情请参见算法建模
    设置GBDT二分类组件的参数,树的数目为5,树的最大深度为3,y为标签列,其它字段为特征列。建模
  3. 运行实验,查看预测结果。
    kv y
    2:1,5:1,8:1,12:1,15:1,18:1,28:1,34:1,41:1,50:1,53:1,63:1,72:1 0.0
    2:1,5:1,6:1,12:1,15:1,16:1,28:1,34:1,41:1,50:1,51:1,63:1,72:1 0.0
    2:1,3:1,12:1,13:1,28:1,34:1,36:1,39:1,55:1,61:1 1.0
    2:1,3:1,12:1,13:1,20:1,21:1,22:1,42:1,43:1,46:1,63:1,64:1,67:1,68:1 0.0
    0:1,10:1,28:1,29:1,32:1,36:1,37:1,55:1,56:1,59:1 1.0

    输出的效果可以直接输入至逻辑回归二分类或多分类组件,通常效果会比单独使用LR或GDBT的效果好,且不易拟合。

one-hot编码

one-hot编码组件包括训练和预测功能:
  • one-hot编码组件训练功能:
    • 输入节点:该组件第一个输入节点(左)是训练数据的输入,训练时无需设置输入节点(右)。
    • 输出节点:该组件有两个输出节点,一个是编码后的结果数据表(左),另一个是模型表(右),该模型表用于对同类型的新数据进行one-hot编码。
  • one-hot编码组件预测功能

    one-hot组件的第二个输入节点(右)是one-hot的模型输入,可以利用已有的one-hot模型对新数据进行one-hot编码。

您可以通过以下任意一种方式,配置one-hot组件参数:
  • 可视化方式
    页签 参数 描述
    字段设置 选择二值化列 选择二值化的字段,必选项。
    其他保留特征 勾选特征保留输出在KV对。勾选的字段当作特征(不进行one-hot编码)输出至KV字段中,保留的特征会从0开始编码,该字段必须为DOUBLE类型。
    附加列 附加在输出表的列,可选项。
    参数设置 生命周期 表的生命周期,默认值为7。
    输出表的类型 包括kvtable。当离散特征较多时,建议输出kv格式,table仅支持1024列,超出将报错。
    节点个数 节点的个数。
    单个结点内存大小 单个结点的内存大小,单位为MB。
    删除最后一个枚举量的编码 该参数为true时,可以保证编码后数据的线性无关性。
    忽略待编码数据中的空元素 该参数为true时,表示不对空元素编码。
  • PAI命令方式
    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编码的输入模型表。
    说明 inputModelTableoutputModelTable中必须有一个为非空字符串。
    空字符串
    outputModelTable one-hot编码的输出模型表。
    说明 inputModelTableoutputModelTable中必须有一个为非空字符串。
    空字符串
    lifecycle 输出表的生命周期 7
    dropLast 是否删除最后一个枚举量的编码。该参数为true时,可以保证编码后数据的线性无关性。 false
    outputTableType 输出表的类型,包括稀疏表和稠密表。当离散特征较多时,建议输出kv格式.table仅支持1024列,超出将报错。 kv
    ignoreNull 是否忽略待编码数据中的空元素。该参数为true时,表示不对空元素编码。 false
    coreNum 节点的个数。 自动计算
    memSizePerCore 单个结点的内存大小,单位为MB,范围为[2048, 64*1024]。 自动计算
    说明如下:
    • inputModelTableoutputModelTable至少一个参数非空。当inputModelTable非空时,其对应的表应该为非空的模型表。
    • 编码字段列中,离散值个数可以支持至千万量级。
    • 当训练的模型作为下次编码使用的模型时,由于dropLastignoreNullreserveCols编码参数的效果已封装到模型中,无法进行调整。如果您需要调整,则必须重新训练。
    • 建议输出表使用kv格式。当使用表时,列数最多为1024列。当超出该值则会报错,无法完成编码任务。
    • one-hot编码生成的kv表默认从0开始编号。
    • 当使用模型编码新数据时,如果在模型映射表中无法找到数据中的离散量,则忽略该离散量,即不对该离散量编码。如果需要对其进行编码,请重新训练模型映射表。

one-hot编码示例

  1. 使用SQL语句,生成训练数据。
    PAI -project projectxlib4
      -name one_hot
      -DinputTable=one_hot_yh
      -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;
  2. 测试输入表如下。
    f0 f1 f2 f3 f4
    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

    该输入表中,f0为BIGINT类型、f1为STRING类型、f2为DATATIME类型、f3为DOUBLE类型、f4为BOOL类型。

  3. 测试结果为映射模型表。
    col_name col_value mapping
    _reserve_ f3 0
    f0 12 1
    f0 3 2
    f0 34 3
    f0 null 4
    f2 22222222222 5
    f2 33333333333 6
    f2 4 7
    f4 0 8
    f4 1 9
    f4 null 10
    结果表中最上面一行为reserve行,列名值固定为reserve,保存reserve信息。其余行对应的是编码映射信息:
    • 编码后的表(table)
      f0 f1 f3 f4 _reserve__f3_0 f0_12_1 f0_3_2 f0_34_3 f0_null_4 f2_22222222_5 f2_33333333_6 f2_4_7 f4_0_8 f4_1_9 f4_null_10
      12 prefix1 0.1 true 0.1 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0
      12 prefix3 0.4 false 0.4 1.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0
      NULL prefix3 0.2 NULL 0.2 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0
      3 NULL 0.3 false 0.3 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0
      34 NULL 0.4 NULL 0.4 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0
      3 prefix1 0.2 true 0.2 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0
      3 prefix1 0.3 false 0.3 0.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0
      3 prefix3 0.2 true 0.2 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0
      3 prefix3 0.1 false 0.1 0.0 1.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0
      NULL prefix3 0.3 false 0.3 0.0 0.0 0.0 1.0 0.0 0.0 1.0 1.0 0.0 0.0
    • 编码后的表(kv)
      f0 f1 f3 f4 kv
      12 prefix1 0.1 true 0:0.1,1:1,5:1,9:1
      12 prefix3 0.4 false 0:0.4,1:1,6:1,8:1
      NULL prefix3 0.2 NULL 0:0.2,4:1,7:1,10:1
      3 NULL 0.3 false 0:0.3,2:1,7:1,8:1
      34 NULL 0.4 NULL 0:0.4,3:1,5:1,10:1
      3 prefix1 0.2 true 0:0.2,2:1,5:1,9:1
      3 prefix1 0.3 false 0:0.3,2:1,5:1,8:1
      3 prefix3 0.2 true 0:0.2,2:1,7:1,9:1
      3 prefix3 0.1 false 0:0.1,2:1,6:1,8:1
      NULL prefix3 0.3 false 0:0.3,4:1,7: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端的使用说明:
  • 直接使用该组件进行编码,实验流程如下。流程
  • 使用该组件的训练模型,再通过模型对数据进行编码,实验流程如下。实验