在配置特征之前,建议阅读一下这篇文章:《在生产环境的推荐系统中部署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。配置和计算方法如下:
log10
配置例子:method=log10,threshold=1e-10,default=1e-10 计算公式:x = x > threshold ? log10(x) : default;
zscore
配置例子:method=zscore,mean=0.0,standard_deviation=10.0 计算公式:x = (x - mean) / standard_deviation
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
配置。