不管是在机器学习,还是深度学习场景中,特征决定了模型效果的天花板。在互联网公司中,总会有那么些团队专门去做用户画像,他们提取用户落下的日志,转化成能够精准描述用户的特征,这部分特征可以自己组内提出,也可以是算法组提出,将用户用一连串的特征去表示,来达到某种特定模型上线最好的效果。
做特征,需要紧紧围绕目标去做特征,而不是为了做特征而做特征,不合适的特征后续的存储、维护问题很多,以信息流推荐场景为例,目标是希望推给用户的内容都是用户喜欢的。我们可以通过用户对推荐的某篇文章或视频的点击、点赞、评论、转发、收藏、浏览播放时长等数据来综合衡量用户对该文章或视频的喜欢程度;可以通过用户打开APP的次数、用户返回APP的时间间隔、用户一次停留时长等来衡量用户对APP的满意程度。
知道了目标,确定了衡量目标的标准,我们围绕这些标准来做特征。这部分特征包括:用户画像,用户的历史行为、用户所处的环境、文章的内容和属性等因素相关。
上线的模型并不是用了所有特征,针对不同的场景,会增加特定特征。例如,序列化推荐会添加用户历史交互信息特征 hist_item, 时序预测项目中,添加了过去m天的滑窗特征增加对未来N天的预测效果等。
在获得了诸多的特征后,如何进行特征筛选,或者类别特征和连续特征如何进行处理?
1 特征筛选方法
按照传统统计学上面的回答:
- 基于统计量筛选:选择方差大的特征、皮尔逊相关系数(与target相关系数高,数据正态且连续)、覆盖率、假设检验。
假设检验;假设特征变量和目标变量之间相互独立,选择适当检验方法计算统计量,然后根据统计量做出统计推断。例如,对于特征变量为类别变量而目标变量为连续数值变量的情况,可以使用方差分析,对于特征变量和目标变量都为连续数值变量的情况,可以使用皮尔森卡方检验。卡方统计量取值越大,特征相关性越高。(方差分析所要研究的是分类自变量对数值因变量的影响。卡方检验分析两个变量间的关系:是否相互独立,是否来自一个总体。)
- 基于模型选择:
- 基于模型参数;LR 系数
- 树模型;最开始分裂特征,重要的特征更有可能出现在树生成早期的节点,作为分裂节点的次数也越多。
- L1正则;L1可以得到稀疏解,也就是可以对特真进行降维
- AutoML:
这里再解释几种特征筛选的方法:
(1) 对于类别特征 计算单特征的 AUC
意思就是说,将所有离散特征与target离散label,计算单值特征的AUC;再进行特征重要性排序,取出单值特征AUC较高的特征。
REF: AUC 理解与应用
单特征的AUC和 训练集与验证集划分划分有关,因为拿的是训练集中特征值的占比作为预测值,划分大小不一样,映射到验证集上也不一样吧。那这样是给了数据集了 就可以手算出来了。
(2) 树模型
XGBoost, lightGBM树模型都可以用来特征筛选;运用 plot_importance() 可以得到所有特征的 score, 然后进行排序。
ps:2. 类别特征和连续特征处理方法(sparse feature, dense feature).
(1)sparse feature
离散特征是非常常见的一类特征,如性别、标签等等。
- one-hot
- 散列编码 (类似于 mutil-hot)
https://www.jianshu.com/p/9c40b8dc60bf - 离散特征之间交叉 (男-北京,男-上海)
- 离散特征与连续特征交叉
将离散特征a对连续特征进行groupby,取连续特征的sum, mean, max, min;然后 to 到 离散特征后面。
(2)dense feature
- 离散化
分桶(等距,等频,模型分桶(聚类K类)) - 特征交叉
这里通过 z=f(x,y)的形式。 - 滑窗特征
一般用在时序数据上,通过统计过去N天同连续特征值下的mean, max, min等。