推荐算法学习(二):用户画像

移动互联网时代,精细化运营逐渐成为企业发展的重要竞争力,用户画像的概念也应运而生。用户画像是指用户信息标签化,可简单理解为根据用户的目标、行为和观点的差异,将其区分为不同的类型,然后从每种类型中抽取出典型特征,赋予名字、人口统计学特征、场景等描述,形成一个人物原型。用户画像的建立能够帮助企业更好地为用户提供针对性的服务。

用户画像建模需要解决三个问题:用户“从哪儿来”、“都是谁”、“到哪儿去”。为解决这些问题,首先,我们需要统一标识用户ID,方便我们对用户后续行为进行跟踪,这也是整个用户画像的核心。其次,我们需要对用户进行标签化(可考虑“用户、消费、行为、内容”等维度),方便我们对用户行为进行理解。最后,我们要基于这些标签指导业务,提升客户转化率(获客),增加客户粘性(粘客),降低客户流失率(留客)。

用户画像建模的过程按照数据流处理的阶段来划分,可以分为数据层、算法层和业务层。

0

数据层指的是用户消费行为里的标签,我们可以打上“事实标签”,作为数据客观的记录;算法层指的是透过这些行为算出的用户建模,我们可以打上“模型标签”,作为用户画像的分类标识;业务层指的是获客、粘客、留客的手段,我们可以打上“预测标签”,作为业务关联的结果。所以这个标签化的流程,就是通过数据层的“事实标签”,在算法层进行计算,打上“模型标签”的分类结果,最后指导业务层,得出“预测标签”。

接下来介绍一下用户画像中标签从何而来以及如何利用用户标签做推荐,并给出针对Delicious数据集,利用用户标签做推荐的python代码。

标签从何而来

标签是对高维事物的抽象,事实上也是一种降维。典型的标签产生方式有专家产生(PGC)和普通用户产生(UGC),由于人工打标签的成本较高,还可通过聚类算法产生,如K-Means,EM聚类,Mean-Shift,DBSCAN,层次聚类,PCA。

k_means原理:

  • Step1, 选取K个点作为初始的类中心点,这些点一般都是从数据集中随机抽取的;

  • Step2, 将每个点分配到最近的类中心点,这样就形成了K个类,然后重新计算每个类的中心点;
  • 重复Step2,直到类不发生变化,或者你也可以设置最大迭代次数,这样即使类中心点发生变化,但是只要达到最大迭代次数就会结束。

如何利用用户标签做推荐

标签是一种抽象能力,通过对用户画像进行Profile Learning,同时对item提取标签,从而可以完成基于标签的召回。具体步骤见下述算法。

1. SimpleTagBased算法

  • 统计每个用户的常用标签;

  • 对每个标签,统计被打过这个标签次数最多的商品;

  • 对于一个用户,找到他常用的标签,然后找到具有这些标签的最热门物品推荐给他;

  • 用户u对商品i的兴趣:1

注: 这里为了方便,将数据定义如下。

  • 用户打标签记录:$records[i] = {user, item, tag} $

  • 用户打过的标签:$user_tags[u][t]$

  • 用户打过标签的商品:$user_items[u][i]$

  • 打上某标签的商品:$tag_items[t][i]$

  • 某标签使用过的用户:$tags_users[t][u]$

2. NormTagBased算法

对上述score进行归一化处理:2

3. TagBased-TFIDF算法

如果一个tag很热门,会导致$user_tags[t]$很大,所以即使$tag_items[t][i]$很小,也会导致$score(u,i)$很大。换言之,SimpleTagBased算法给热门标签过大的权重,不能反应用户个性化的兴趣,从而降低推荐结果的新颖性。这里借鉴TF-IDF的思想,SimpleTagBased算法进行改进:3

关于TF-IDF:

  • 词频:$TF=单词次数/文档中总单词数$
  • 逆向文档频率:$IDF=log\frac{文档总数}{单词出现的文档数+1}$,表示一个单词在文档中的区分度,单词出现的文档数越少,区分度越大,IDF越大

实例:基于标签做书签URL的推荐

  • Delicious2K数据集:user_taggedbookmarks-timestamps.dat(该文件包含每个用户提供的书签URL的标签分配及完成标签分配的时间戳)。

  • 分别采用NormTagBased算法和TagBased-TFIDF算法,基于标签计算用户对书签的兴趣,并对用户推荐Top-N书签。

github地址:https://github.com/Alice1214/RS/tree/master/RS02/delicious