比如某个特征的类别数特别大(如机构代码、公司代码等),可能有几千类,或上万类,常用方案为,转换为onehot向量。然后送到神经网路如DNN中,责中间层unit数量即为降维后纬度,权值矩阵W的行即为embeding向量。但实际实验时却遇到问题,和其他特征一起送到神经网路后,发现由于矩阵非常稀疏,网路对隐层embedding矩阵的训练效果很差,应该如何解决?是否还需要有其他辅助处理?


题主是希望用词向量的方式来实现高纬度稀疏向量的到低纬度稠密向量的特征降维。

然而,词向量模型是可以在无监督语料上训练的,我们可以轻松收集到海量的文本来训练词向量,再在相对较小的有监督数据集上使用词向量替代one-hot。

但题主所述的场景显然不是这样的。在一个较小规模的有监督数据集上学习低维向量,还不如直接做有监督建模,同时结合特征形式使用一些传统的降维方法。

深度学习从来不是万能的,不要乱用。


根据特征出现的频率进行特征过滤,例如过滤掉样本中出现次数小于某个阈值的特征;或者根据特征出现频率,取top N个类别。其余类别当作是新的一类。

如果多种高纬特征同时使用,例如机构代码,公司代码同时作为输入,可以分组做embedding.


我就说一个点吧

稀疏特征的一个做法是想办法通过规则稠密化,主要是能把id关联到其他东西上去,比如两个同样的机构代码属于同一个区域。

如果有机构名称或属性等,其他特征丰富了之后,也可以专门做度量学习稠密化。


两条路,一个是把你的连续特征(原来想送到DNN中的),离散化,再进行一些人工的组合(第四范式特征自动组合演算法了解一下)。然后交给LR、FM这种浅层的网路就行了。

第二条路,wide and deep,对应paper已经一大把了,然后,祈祷你有足够的算力和足够多的调参经验吧。。。。


1 样本中离散特征频次控制,频次太低的统一划分为一个类型,对应一个embedding训练

2 有点不明白你是要总体的训练效果好还是要embedding的效果好。我理解你是想要总体的训练效果好,因为公司代码这种特征的embedding没什么意义,不像nlp中的word embedding ,这个是有意义的。如果是想要总体效果好,那么就没必要关注某些特征的embedding训的不好。参考1的方法重新训一下吧。


个人思路,如果是只有一个高基数类别特征或者多个类别特征之间完全没有任何共现关系则考虑使用特征编码,否则如果多个类别存在一定交互关系考虑item2vec的思路或者fasttext的思路,当作文本问题处理。


推荐阅读:
相关文章