模型特征配置

在配置特征之前,建议阅读一下这篇文章:《在生产环境的推荐系统中部署Contextual bandit (LinUCB)算法的经验和陷阱》,文章介绍了哑变量陷阱,以及超参数调参经验。

在以下所有类型的特征中,expression 是必选项(除lookup feature外),描述该feature所依赖的字段来源;使用前缀 user:arm: 表示字段来源自用户特征或Item特征,如 user:is_member 表示从服务输入的user_feature参数中获取特征is_member的值;arm:author_id表示从加载的Item特征中获取author_id的值。缺省的前缀为user:expression 配置项的含义在所有类型的特征间保持一致。

share_weight是可选项,在使用hybrid的linucb算法时,标记为share_weight的特征表示在Arm间共享参数的特征。share_weight的缺省值为false。使用hybrid类型的算法,一般需要把交叉特征的share_weight设置为true。

Id Feature

id feature是一个sparse feature,是一种最简单的离散特征,以 Multi-Hot 的方式生成特征向量。

目前支持:vocab_list、num_buckets、hash_bucket_size、boundaries 四种配置方法。

配置示例:

{
  "FeatureConf": [
    {
      "feature_type": "id_feature",
      "expression": "gender",
      "vocab_list": ["M", "F"]
    },
    {
      "feature_type": "id_feature",
      "expression": "level",
      "num_buckets": 51
    },
    {
      "feature_type": "id_feature",
      "expression": "familyid",
      "hash_bucket_size": 200
    },
    {
      "feature_type": "id_feature",
      "expression": "is_member",
      "num_buckets": 2
    },
    {
      "feature_type": "id_feature",
      "expression": "fans_num",
      "boundaries": [1, 2, 3, 4, 7, 15, 30, 50, 120]
    }
  ]
}

例子(备注:^] 表示多值分隔符,注意这是一个符号,其ASCII编码是"\x1D",而不是两个符号,也可以通过 seperator 配置项修改默认分隔符 )

类型

特征的取值

输出的中间结果

int64_t

100

100

double

5.2

5(小数部分会被截取)

string

abc

abc

多值string

abc^]bcd

(abc, bcd)

多值int

123^]456

(123, 456)

最终,输出的feature会被转换为 multi-hot 的实数向量,转换的方式由vocab_list、num_buckets、hash_bucket_size、boundaries 配置项决定。

Raw Feature

raw feature是一种dense的feature,是直接引用原始feature的字段值作为feature的value。raw feature仅支持数值int、float、double等数值类型,对非数值类型的feature需使用id feature。

字段名

含义

expression

必选项,expression描述该feature所依赖的字段来源

separator

多值分隔符

value_dimension

可选项,默认值为1,表示输出的字段的维度。

normalizer

可选项,归一化方法,详见后文

配置示例:

{
  "FeatureConf": [
    {
      "feature_type": "raw_feature",
      "expression": "userid_avg_hot_15",
      "normalizer": "method=minmax,min=0,max=60"
    },
    {
      "feature_type": "raw_feature",
      "expression": "userid_avg_duration_15",
      "normalizer": "method=log10"
    } 
  ]
}

Normalizer

raw_feature 和 lookup_feature 支持 normalizer,共三种,minmax,zscore,log10。配置和计算方法如下:

  1. log10

说明

配置例子:method=log10,threshold=1e-10,default=1e-10 计算公式:x = x > threshold ? log10(x) : default;

  1. zscore

说明

配置例子:method=zscore,mean=0.0,standard_deviation=10.0 计算公式:x = (x - mean) / standard_deviation

  1. minmax

说明

配置例子:method=minmax,min=2.1,max=2.2 计算公式:x = (x - min) / (max - min)

Combo Feature

combo feature是多个字段(或表达式)的组合(即笛卡尔积),id feature可以看成是一种特殊的combo feature,即参与交叉字段只有一个的combo feature。一般来讲,参与交叉的各个字段来自不同的表(比如user特征和item特征进行交叉)。

combo feature在特征组合后以 One-Hot 的方式生成特征向量。

配置示例:

{
  "FeatureConf": [
    {
      "feature_type": "combo_feature",
      "expression": ["user:age_class", "arm:item_id"],
      "hash_bucket_size": 200,
      "share_weight": true
    },
    {
      "feature_type": "combo_feature",
      "expression": ["user:age_class", "arm:level"],
      "num_buckets": [5, 8],
      "share_weight": true
    }
  ]
}

输出的feature个数等于

说明

|F1| |F2| ... * |Fn| 其中Fn指依赖的第n个字段的值的个数。

如果配置了 hash_bucket_size,则组合之后的特征值会hash到 hash_bucket_size 个桶里。

Lookup Feature

lookup feature,是从一组kv中匹配到自己需要的结果。

lookup feature 依赖 map 和 key 两个字段,map是一个多值string(MultiString)类型的字段,其中每一个string的样子如"k1:v2"。;key可以是一个任意类型的字段。生成特征时,先是取出key的值,将其转换成string类型,然后在map字段所持有的kv对中进行匹配,获取最终的特征。

map 和 key 源可以是 item,user,context 的任意组合。item的多值用多值分隔符char(29)分隔,user和context的多值在tpp访问时用list表示。该特征仅支持JSON形式的配置方式。

配置示例:

{
  "FeatureConf": [
    {
      "feature_type": "lookup_feature",
      "map": "user:userid_kv__author__click_cnt_15",
      "key": "arm:userId",
      "normalizer": "method=log10",
      "share_weight": true
    }
  ]
}

Geohash Feature

geohash feature,是把经纬度转成指定长度的字符串后再执行hash操作生成的特征。geohash 把地理位置划分成一个个的网格,每个网格分配一个encode hash值。

geohash的原理请参考 这篇文章

配置示例:

{
  "FeatureConf": [
    {
      "feature_type": "geohash_feature",
      "expression": ["latitude", "longitude"],
      "geohash_precision": 4,
      "hash_bucket_size": 128
    }
  ]
}

最终的geohash值会被hash到 hash_bucket_size 个桶里。

Binary Feature

Binary Feature为二值特征,特征值取 0 或 1。诸如用户的性别等特征适合用binary feature来表达。

二值特征通过判断原始特征是否在vocab_list指定的集合里,来生成特征值;命中指定集合的某元素则特征值为1,否则为0。

配置示例

{
  "FeatureConf": [
    {
      "feature_type": "binary_feature",
      "expression": "gender",
      "vocab_list": ["M"]
    }
  ]
}

如果原始特征的值就是0/1二值类型,则通过raw feature来配置,不需要通过binary feature配置。