推荐系统中最重要的两部分是特征和模型,早期模型上没有很大突破的时候,人工特征工程是推荐系统发展的主要方向。在这里我总结一下做特征工程的思路和不同特征的处理方式。
在推荐系统中,大多数特征是离散特征。同时连续特征也会转换成离散特征,所以离散特征的处理方式决定整个模型的数据输入。离散特征通常有LabelEncoding、OnehotEncoding、HashEncoding和Embedding四种处理方式。
是将离散特征编码成连续的数字。sklearn.preprocessing.LabelEncoder工具可以实现这个功能。
优点:
?? 直接、简单
缺点:
??只有简单的数字,数字容易给对数值敏感的模型带来损失,比如SVM、LR还有NN模型。所以这种方法很少用到。
OneHotEncoder同样是对离散特征编码,离散特征中有多少不同的值,就用多少维来表示该特征。sklearn.preprocessing.OneHotEncoder工具可以实现这个功能。onehot之后成为稀疏矩阵,可以用sparse工具存放。
Onehot主要作用在两个场景上:
?? 1)文字离散特征进行Labelhot之后。在对数据集进行处理时候我们会遇到一些包含同类别的数据(如:country)。这样的数据是非numerical的数据,所以我们可以用数字来代替,比如不同的国家我们可以用1,2,3区分不同国家,但是这样会出现一个比较严重的问题。就是国家之间的地位是相同的,但是数字有顺序大小之分。所以我们用另一种方法,就是将不同的类别(如不同国家)另外分为一个列,属于这个国家的设置为1,不属于的设置为0.
??2)数字离散特征。原因同上。
优点:
??避免数值长度对模型的影响
缺点:
??其一,造成维度过高过稀疏的问题。举例来说对于普通的离散特征用户类型,可能只有登录用户,未登录用户,vip用户等十几种用户类型,onehot后维度只增加十几维。但是对于用户ID类型(一般是对象原始ID和hash之后的ID)的离散特征,每个ID之间没有关联,每个用户都有一个ID,ID数量巨大,onehot之后的维度增加到成百上千,甚至更多,特征数量急剧增多,整体成为海量稀疏。其二,onehot只有每个特征只在一个数据点上被激活,完全不具有可推广性。所以推荐系统针对ID类特征做了HashEncoding和Embedding的转换,也有开发了FM、FFM以及各种深度Embedding模型。
针对离散特征中的user_id,advertisement_id,直接做one-hot会导致维度爆炸的问题,通过hashing trick对feature先做hash之后取模降低维度,缓减这一问题。这种方式是目前推荐系统用的最广泛的方式。
优点:
??通过哈希函数自定义变换后的维度长度,节约存储空间和时间;省掉onehot的对照表,只保留hash函数
缺点:
??对于相同意义或者相近的词语容易产生hash冲突,导致结果共享位置,影响模型;hash之后的结果没有实际意义;hash之后的结果也无法映射到原来的离散特征。
hash方式在推荐系统中的应用,在这篇文章中总结的很好,有兴趣的可以看一下。
2010年FM模型首次提出为每个特征学习隐向量的概念,通过模型为每个特征学习到一个相关向量,向量大小可以自定义,向量之间存在相似性。这种方式首次解决了维度变化之后特征失去联系的问题。之后随着技术的发展,word2vec、FFM模型、DepFM、item2vec等工具都可以产生特征的embedding向量,后来更是everything 皆可embedding的状态。
优点:
缺点:
??需要大量的语料训练embedding向量,如果数据较少,embedding学习不充分,结果得不到保证。
在推荐系统,特征是数值类型,且数值是连续具有实际意义的特征被称为连续特征。
连续特征的广泛取值范围对模型的非常大,模型容易倾向连续特征,所以通常将连续离散化,变成离散特征。
离散化将是数值变成符号,损失大量数值,带来的损失也会降低模型的推荐效果。通常会尽可能地从多种角度离散化,避免信息损失。也会考虑合适的离散化标准,比如分桶离散化中桶的大小,分段离散化中段的间隔等等。
知乎上有个关于离散的见解,个人觉得是个新思路,所以记录在这里:知乎地址
总结来说:推荐系统的特征流程是数据预处理->离散化->Labelhot->Onehot->Embedding->模型
原文:https://www.cnblogs.com/x739400043/p/12394135.html