学习推荐算法的笔记,慢慢更新完善ing...
电商平台用户购物数据,特征工程实践
Customer Segmentation & Recommendation System (kaggle.com)
(1)RFM特征
RFM是一种用于分析客户价值和细分客户群体的方法。
最近购买时间(R):较低的值意味着客户最近进行了购买,这表明他们与品牌的互动更频繁。
购买频率(F):较高的值意味着客户更频繁地与企业互动,这表明他们的忠诚度或满意度较高。
消费金额(M):消费金额较高的客户对企业的贡献更大,表明他们的潜在终身价值较高。
三个指标共同帮助我们理解客户的购买行为和偏好,对于个性化营销和创建推荐系统至关重要。
R
定义特征-自上次购买以来的天数:通过了解购买的时间间隔,企业可以针对那些一段时间没购物的客户制定营销策略,以重新吸引他们,从而可能提高客户留存率并促进忠诚度。
F 创建两个特征来量化客户与零售商互动的频率:
总交易次数:有助于理解客户与零售商之间的互动水平。
总购买产品数量:它提供了客户购买行为的洞察,尤其是在产品购买量方面。
M 创建两个特征,代表客户交易的货币方面:
总消费:有助于识别每个客户所产生的总收入,这是客户对业务价值的直接指标。
平均交易价值:将总消费除以每个客户的总交易次数得出的。对于了解客户每次交易的消费行为非常有用,可以帮助根据客户的平均消费模式制定针对不同客户群体的营销策略和优惠。
(2)产品多样性特征
了解客户在产品购买行为的多样性。理解产品多样性可以帮助制定个性化的营销策略和产品推荐。
独特购买的产品数量:代表了客户购买的不同产品数量。数值越高,说明客户的品味越多样,购买的产品种类也越丰富。理解产品购买的多样性可以帮助根据客户的购买多样性进行细分,这对于个性化产品推荐至关重要。
(3)客户表现特征
理解和捕捉顾客的购物模式和行为。这些特征将为我们提供关于顾客何时喜欢购物的偏好洞察。
购买间隔平均天数:表示顾客在进行下一次购买之前平均等待的天数。可以帮助预测顾客何时可能进行下一次购买,这对于精准营销和个性化促销是一个关键指标。
最喜欢的购物日:可以帮助识别不同顾客群体的偏好购物日,从而优化针对不同星期几的营销策略
最喜欢的购物时间:识别最喜欢的购物时间可以帮助优化营销活动和促销的时机,以与不同顾客群体最活跃的时间相匹配。
在数据集中加入这些行为特征,将有可能提升聚类算法的有效性,从而形成更有意义的顾客细分。
(4)地理特征
了解客户的地理分布非常重要
国家:包含国家数据可以帮助我们理解特定地区的购买模式和偏好。不同地区可能有不同的偏好和购买行为,这对个性化营销策略和库存规划至关重要。此外,这在物流和供应链优化中也非常重要,特别是对于在线零售商来说,运输和交付发挥着重要作用。
假设大部分(e.g 89%)交易来自英国,考虑创建一个二元特征来指示交易是否来自英国。有可能简化聚类过程,同时不丢失关键信息,尤其是在应用K-means这样对特征空间维度敏感的算法时。
customer_main_country[['CustomerID', 'Is_UK']]
(5)Cancellation Insights
深入研究客户的取消模式,以获取可以增强客户细分模型的Insights。
取消频率:理解取消的频率帮助我们识别更可能取消交易的客户。这可能是客户不满意或其他问题的标志,了解这些可以帮助我们制定策略,以减少取消并提升客户满意度。
取消率:表示客户在所有交易中取消的交易所占的比例。高取消率可能表明客户群体的不满。通过识别这些群体,我们可以制定有针对性的策略,以改善他们的购物体验,并可能降低取消率。
通过将这些Cancellation Insights纳入我们的数据集中,我们可以建立客户行为的更全面视图,从而可能帮助创建更有效和更细致的客户细分。
(6)Seasonality&Trends
深入探讨客户购买行为的季节性和趋势,为调整营销策略和提升客户满意度提供宝贵的见解。
每月消费均值:帮助我们评估每个客户的整体消费习惯。较高的均值表明客户的消费较多,可能对高端产品感兴趣,而较低的均值可能表明客户更加注重预算。
每月消费标准差:这个特征表示客户每月消费的波动性。较高的数值表明客户的消费在不同月份之间波动较大,可能意味着偶尔会有大额购买。了解这种波动性可以帮助我们在客户预计会有更多消费的时期制定个性化的促销或折扣。
消费趋势:这反映了客户消费随时间变化的趋势,计算方法是拟合其消费数据的线性趋势线的斜率。正值表示消费趋势在上升,可能表明客户忠诚度或满意度在提高。相反,负趋势可能表明客户的兴趣或满意度在下降,突出需要重新吸引客户的策略。接近零的值则表示消费习惯稳定。识别这些趋势可以帮助我们制定策略,以维持或改变客户的消费模式,从而提高营销活动的有效性。
通过将这些详细见解纳入我们的客户细分模型,我们可以创建更精确和可操作的客户群体,促进高度针对性的营销策略和促销活动的发展。
4.类别特征的处理(在特征工程中很重要)
为了增加推荐结果的个性化成分,互联网大厂都喜欢将User ID、Item ID这种最细粒度的特征加入模型,显然这些特征都是类别特征,并且将特征空间的维度和稀疏性都提高了许多。
假设特征是“用户年龄”,“用户年龄”在模型中对应一个Embedding,代表它对目标的贡献。使用时,将特征值当成权重与特征Embedding相乘,表示对特征的贡献进行缩放。显然例如场景是判断年龄和购买意愿的关系,年龄不应该作为数值特征,因为二者没有线性关系,正确的方式应该是将每个年龄段视为独立的类别特征,学习出其自己的权重或 Embedding。
线上工程实现时更偏爱类别特征,因为推荐系统中的类别特征空间超级稀疏,可以实现非零存储、 排零计算,减少线上开销,提升在线预测与训练的实时性。以Logistic Regression(LR)模型为例,如公式 (2-7)所示。
推荐系统中为类别特征设计的技术:
1.单个类别特征的表达能力弱,为了增强其表达能力,业界想出了两个办法
- 通过Embedding自动扩展其内涵。比如“用户年龄在20~30岁之间”这个类别特征,既可能反映出用户经济实力有限,又可能反映出用户审美风格年轻、时尚。这一系列的潜台词,术语叫作“隐语义”,都可以借助Embedding自动学习出来,扩展了单个特征的内涵。
- 多特征交叉。比如单凭“用户年龄在20~30岁之间”这个特征,推荐模型可能还猜不透用户的喜 好。再与“工作”特征交叉,比如“用户年龄在20~30岁之间、工作是程序员”,推荐模型立刻就会明 白,“格子衬衫”对该用户或许是一个不错的选择。
2.类别特征的维度特别高,要存储这么多特征的权重和Embedding向量,单机是容纳不下的。
Parameter Server这样的架构应运而生,一方面 Parameter Server利用分布式集群分散了参数存储、检索的压力,另一方面它利用推荐系统的特征空间超级稀疏这一特点。每次计算时无须同步整个特征空间上亿个特征的参数,大大节省了带宽资源与时间开销。
3.类别特征空间本来就是稀疏的,实数特征离散化和多特征交叉又进一步提高了特征空间的稀疏程度,降低了罕见特征的受训机会,导致模型训练不充分。为了解决这一问题,业界想出了以下办法
- FTRL这样的优化算法为每维特征自适应地调节学习率。常见特征受训机会多,步长小一些;罕见特征受训机会少,步长大一些,允许利用有限的受训机会快速收敛。
- 阿里巴巴的DIN为每个特征自适应地调节正则系数。
- 对于第i个特征Xi与第j个特征Xj的交叉特征的权重Wij,LR模型只能拿Xi与Xj都不为0的样本来训练,在推荐系统这种特征超级稀疏的环境下,这样的样本少之又少,导致交叉特征的权重不能充分训练。(FM解决了这一问题,使只要满足Xi不为0或Xj不为0的样本都能参与训练 ,大大提升了训练效率)
处理类别特征之Embedding
如何将类别特征喂入推荐模型?最常见方式是将稀疏类别特征映射成一个稠密向量,即Embedding
a.理解部分与实践
“将特征、函数转化为待优化变量”的思想并不是深度学习发明的,早在用矩阵分解进行推荐的时代就已经存在了,只不过那时,它还不叫Embedding,而叫隐向量(Latent Vector)。 深度学习对于推荐算法的贡献与提升,其核心就在于Embedding。
Embedding自动将概念拆解为特征向量,目标是提升推荐算法的扩展能力,从而能够自动挖掘出那些低频、长尾、小众的模式,更好地个性化推荐。
import tensorflow as tf
unq_categories=["music","movie","finance","game","military","history"]
#StringLookup这一层将类别、单词等字符串转化为整数索引,使其能够用于神经网络模型的输入
id_mapping_layer=tf.keras.layers.StringLookup(vocabulary=unq_categories)
emb_layer=tf.keras.layers.Embedding(
input_dim=len(unq_categories) + 1, # 多加⼀维是为了处理输⼊不包含在unq_categories中的情况
output_dim=4) # output_dim指明映射向量的⻓度
#Embedding
cate_input=tf.constant(["movie","history"])#size:[batch_size,1]文章分类向量
cate_ids=id_mapping_layer(cate_input)#string型的文章分类向量映射成int型id
cate_embeddings=emb_layer(cate_ids)#size:[batch_size,4]的Embedding向量,表示每个文章分类向量的语义
'''
cate_embeddings:
<tf.Tensor: shape=(2, 4), dtype=float32, numpy=
array([[ 0.03224236, -0.03262739, -0.00755619, -0.04042579],
[ 0.03437633, -0.04975318, 0.00674157, 0.0386601 ]],
dtype=float32)>
'''
b.不同推荐算法在Embedding层的两大技术路线:共享与独占
共享Embedding
同一套Embedding要喂入模型的多个地方,发挥多个作用。
共享Embedding 的好处有以下两点:
- 能够缓解由于特征稀疏、数据不足所导致的训练不充分;
- Embedding矩阵一般都很大,复用能够节省存储空间。
例子:
比如,模型要用到“近7天安装的App”“近7天启动过的App”“近7天卸载的App”这3个Field,而每个具 体的App是一个Feature,要映射成Embedding向量。(1)如果3个Field不共享Embedding,“装启卸”3个Field都使用独立的Embedding矩阵来将App映射成稠密向量,那么整个模型需要优化的参数变量是共享模型的3 倍,需要更多的训练数据,否则容易欠拟合。(2)每个Field的稀疏程度是不一样的,对于同一个 App,在“启动列表”中出现得更频繁,其Embedding向量就有更多的训练机会,而在“卸载列表”中较少出现,其Embedding向量得不到足够训练。因此,可以让“装启卸”这3个Field共享同一个Embedding矩阵。
另一类Embedding共享发生在特征交叉的时候。典型代表就是Factorization Machine(FM, 因子分解机)。在FM中,每个特征只有一个Embedding,在与其他不同特征交叉时,共同使用唯一的Embedding。FM也因共享Embedding而获得了有利于训练稀疏特征、提升模型扩展性等益处
独占Embedding
应用场景:
- 避免相互干扰
各互联网大厂最不缺的就是数据,共享Embedding的缺陷就暴露出来,即不同目标在训练同一套 Embedding时可能相互干扰。
比如,用户有着不同类型的行为历史,比如点击历史、购买历史、收藏历史、点赞历史……各种历 史行为序列都由Item ID组成。各种类型的行为对Item ID Embedding所表达的语义有着不同的要求, 为了避免相互干扰,同一个物料在不同的行为序列中可以使用不同的Item ID Embedding。大厂的推荐系统都是多目标的,比如要同时优化点击率、购买率、转发率等多个目标。 有一些重要特征在参与不同目标的建模时,也要使用不同的Embedding。
- 特征交叉时独占Embedding技术的演进
FM:
无论第i个特征与哪个特征交叉,FM都是用相同vi来生成交叉特征的系数,即 Embedding是共享的。这可能存在互相干扰的问题
FM->FFM:
Field-aware Factorization Machine(FFM,域感知因子分解机)核心思想是,每个特征在与不同特征交叉时, 根据对方特征所属的Field要使用不同的Embedding,如公式(3-2)所示
缺点是参数空间爆炸,因为多引入了一个Filed,当n个特征,Embedding长度为k,n个特征属于f个Filed时,参数量由nk变为nfk
FM->FFM->CAN:2021年,阿里巴巴提出了Co-Action Network(CAN),目标有两个:像FFM那样,让每个特征在与其他不同特征交叉时使用完全不同的Embedding; 不像FFM那样引入那么多参数而导致参数空间爆炸。
c.基于Parameter Server的分布式训练范式
Embedding的引入极大提升了推荐模型的扩展性,但是也增加了训练难度。为了解决这一难题,基于Parameter Server的分布式训练范式应运而生,并且已经成为各大厂推荐系统的标配。