go 特征提取
go 特征提取
1.1 简介
电商领域给用户推荐商品,计算用户点击每个商品的概率,按概率从大到小排序。概率计算公式:y^=w1x1+w2x2+w3x3+…,w是权重,x非0即1,代表各个特征具体的取值,比如
连续特征离散化:
- 分箱法。比如年龄,指定分割点18,25,30,35,40
- 取对数。比如销量对2取对数
- 取一个字段。比如时间,取其Hour
- ……
给特征分配编号 - 离散化之后,有些特征的取值范围仍然是不确定的,比如销量的上限是不确定的,所以 log_2 销量 也是不确定的。无法顺序地给为每个特征的每个取值进行编号。
- 索性通过哈希函数把特征取值映射到[0, 2^64)上,并以此作为其编号。几乎可以认为特征取值不同,其编号就不同。
- 不同的特征可能存在相同的取值(比如采用分箱法离散化的特征),所以特征和特征取值要一并喂给哈希函数。
所谓特征抽取,就是给定商品的原始特征,提取出模型所需要的特征,进行预处理(比如离散化),最终把每个特征表示成一个或多个uint64。
2.1 特征抽取的设计思路
功能设计
- 商品struct是事先定义好的。
- type Product struct
- 可用的离散化方法和哈希函数是事先定义好的。
- 通过配置文件来指定商品的各个字段应该采用哪种离散化方法和哪个哈希函数。
- 配置可以灵活改动,以快速验证不同特征、不同预处理方法对模型效果的影响、
代码设计
基础结构体
type Location struct {
Province string
City string
}
type User struct {
Name string
Age int
Gender byte
Address *Location
}
type Product struct {
Id int
Name string
Sales int //销量
Feedback float32 //好评率
Seller *User //商家
OnShelfTime time.Time //上架时间
Tags []string
}
3.1 基础接口
//离散化接口
type Discretizer interface {
Discretize(i interface{}) string
}
//哈希接口
type Transformer interface {
Hash(string, int) uint64
}
4.1 特征转换配置类
type FeatureConfig struct {
Path string //从Product中取得字段
DiscretizeFunc Discretizer
HashFunc Transformer
}
5.1 配置文件
[
{
"id": 8,
"path": "Feedback",
"discretize": "bin 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9",
"hash": "farm"
},
{
"id": 9,
"path": "OnShelfTime",
"discretize": "hour",
"hash": "farm"
}
]
使用反射根据path拿到对应Field的取值,然后送给离散化和哈希函数。discretize指示使用哪个离散化函数以及对应的参数,hash指示使用哪个哈希函数。