高纬度特征带来的问题
这里就简单描述下。
通常我们会使用特征训练模型或特征矩阵求相似度。高维的特征带来的计算成本非常大,甚至完不成。同时一般高维的特征都比较稀疏,直接使用高维的特征训练需要样本量很大,难以拟合,模型效果不好。
训练模型时特征的筛选
通常我们训练模型时,会人为挑选特征,控制每类特征维度范围,比如年龄我们使用one-hot的方式表示,分成0-10,10-20...,>100
这几个段,也就是将年龄映射成了11维,相比如果每个年龄表示一维,这也是一种降维的方法。
还有一种降维的方式是,假如我们人为不确定那种特征的好坏,我们可以将初选的所有特征(所有维度)哪去训练,将得到的模型中权重为0或与0相差甚微的特征(向量去掉),再重新训练,一直到比较合适为止。
工作中常用的两种降维方式
除上诉几种简单的降维方法。工作中还经常遇到两种情况需要降低特征维度。
embedding
拿用户来说,好的产品活跃用户非常多(如微信),假如用户数超过10亿。假设我们需要用用户做协同过滤,此时就需要知道用户间的相似度。不管使用哪种相似度计算方法(余弦,jaccard等等),我们首选要得到的是等维度的用户向量。假设我们通过某种办法(下面会详细描述)将每个用户都embedding成了128维的向量,我们就可以拿这个用户向量矩阵通过计算框架(如:faiss)去计算每个用户topN的相似用户及相似度。
又假如我们要把用户向量选做特征参与gbdt的训练,此时也是要首先获取用户的向量表示。