目录
- 7.1 什么是用户画像
- 7.2 标签系统
- 7.2.1 标签分类方式
- 7.2.2 多渠道获取标签
- 7.3 用户画像数据特征
- 7.3.1 常见的数据形式
- 7.3.2 文本挖掘算法
- 7.3.3 嵌入式表示
- 7.3.4 相似度计算方法
- 7.4 用户画像应用
因此只基于某个层面的数据便可以产生部分个体面像,可用于从特定角度形容群体乃至个体的大致差异。说了这么多,那这些和本章要探讨的用户面像有什么关系呢?首先要明确用户面像里的用户是谁:数据收集方(即产品提供方)往往开发出某件产品供人使用,这些使用者便是数据收集方的用户,数据收集方为了推广产品,同时持续维护和改善用户体验便需要对由用户操作而产生的数据进行挖掘,以期从中发现群体乃至个体的行为偏好,形成数据层面上的所谓面像。
7.1 什么是用户画像
在机器学习中提到的用户面像通常是基于给定的数据对用户属性以及行为进行描述,然后提取用户的个性化指标,再以此分析可能存在的群体共性,并落地应用到各种业务场景中。
7.2 标签系统
用户面像的核心其实就是给用户 “打标签”,即标签化用户的行为特征,企业通过用户面像中的标签来分析用户的社会属性、生活习惯、消费行为等信息,然后进行商业应用。
构建一个标签系统成为企业赋能更多业务的关键,标签系统也是本节要详细介绍的内容,具体从三个方面来展开,分别是标签分类方式、多渠道获取标签和标签体系框架。
7.2.1 标签分类方式
如下图所示,通过分析一个用户的特征来展示标签分类方式。
7.2.2 多渠道获取标签
根据标签获取方式可以把标签分为事实类标签、规则类标签和模型类标签三种。标签获取方式也可以看作特征获取方式,借助这三种方式从原始数据中提取能够表现用户特点、商品特点或者数据特点的特征。
-
事实类标签
事实类标签最容易获取,直接来源于原始数据,比如性别、年龄、会员等级等字段。当然也可以对原始数据进行简单的统计后提取事实标签,比如用户行为次数、消费总额。 -
规则类标签
规则类标签使用广泛,是由运营人员和数据人员经过共同协商而设定的多个规则生成的标签,其特点是直接有效灵活、计算复杂度低和可解释度高,主要用作较为直观和清晰的用户相关标签,例如地域所属、家庭类型、年龄层等。使用到的技术知识主要是数理统计类知识,例如基础统计、数值分层、概率分布、均值分析、方差分析等。如下图所示,主要对单一或者多种指标进行逻辑运算、函数运算等运算生成最终的规则类标签,这里分为用户行为、用户偏好和用户价值三部分,感兴趣的话,可对用户进行更深层次的刻面。
-
模型类标签
模型类标签是经过机器学习和深度学习等模型处理后,二次加工生成的洞察性标签。比如预测用户状态、预测用户信用分、划分兴趣人群和对评论文本进行分类等,经过这些处理得到的结果就是模型类标签。其特点是综合程度高、复杂程度高,绝大部分标签需要先有针对性地构建相应的挖掘指标体系,然后依托经典数学算法或模型进行多指标间的综合计算方能得到模型类标签,常常需要多种算法一起组合来建模。如下图所示,基于模型类标签可以使用 RFM 模型来衡量用户价值和用户创利能力、对用户行为信息建模预测用户生命周期变化情况、通过模型预测用户信用评分、使用图嵌入或用户分层模型划分兴趣人群。除此之外还有很多通过模型来得到标签的方法。
对标签的分类和获取有了初步了解后,我们可以将其串联起来形成基本的标签体系框架,包括从底层数据的提取到业务应用赋能。
如下图所示,可以看出整个标签体系框架分为四个部分:数据源、标签管理、标签层级分类和标签服务赋能。
7.3 用户画像数据特征
无论是构建用户面像还是进行算法竞赛,数据都是产生效益的核心。一般而言,用户面像的数据来源为用户数据、商品数据和渠道数据,比如从电商网站和微信平台可以获取用户的交易数据、行为数据等,从平台用户系统可以获取用户属性数据。
这些数据的存在形式多样,通过对数据形式的理解可以进行统计、编码和降维等处理来提取有效特征,然后用这些特征构造我们需要的标签。本节我们将介绍常见的数据形式以及用户面像相关竞赛的一些特征提取方法。
7.3.1 常见的数据形式
在各式各样的竞赛当中,数据的形态和格式是多种多样的,本节以用户画像为例将数据的有关字段大致分为数值型变量、类别型变量、多值型变量以及文本型变量四种常见的数据形式,每种变量都有对应的处理方式。需要强调的是这些变量都是针对用户层面的,即所有样本数据以用户为唯一主键进行区分,且每个用户只有一条记录,之所以这样举例是因为通常基于用户面像的机器学习模型所需的数据是以用户池的形式呈现的,对用户的标签进行对应的特征学习。
实际竞赛中给的数据可能十分复杂,甚至是以打点记录的方式描述用户的行为,这时候往往还需要参赛者构建提取用户特征,这涉及更深的应用技巧。
- 数值型变量
最常见的一种数值型变量是连续型变量,指的是具有数值大小含义的变量,比如下图所示的年龄、身高、体重等,其他如消费金额、流量累计等。 - 类别型变量
类别型变量是指具有类别标识的变量,比如性别、 籍贯、所在城市等,这类变量记录了用户的固有属性,如下图所示。 - 多值型变量
多值型变量是指用户在某个维度具有多个取值的变量,比如兴趣爱好、穿衣风格、看过的电影等,这类变量由于其特殊结构无法直接应用到模型中,需要借助特别的数据结构如稀疏矩阵进行处理,如下图所示。 - 文本型变量
文本型变量(如下图所示)是指利用文本记录的变量,比如用户对某件商品或者某次购物的评论等。处理这类变量需要用到自然语言处理的一些工具,比如中文分词工具 jieba 等。
7.3.2 文本挖掘算法
对于基础的原始数据,比如经常出现的用户标签集合、购物评价等,除了常见的统计特征外,还能够基于文本挖掘算法进行特征提取,同时对原始数据进行预处理和清洗,以达到匹配和标识用户数据的效果。本节将会对常见的文本挖掘算法 LSA、PLSA 和 LDA 进行介绍,这三种均为无监督学习方法。
-
LSA
LSA(潜在语义分析) 是一种非概率主题模型,与词向量有关,主要用于文档的话题分析,其核心思想是通过矩阵分解的方式来发现文档与词之间基于话题的语义关系。具体地,将文档集表示为词-文档矩阵,对词-文档矩阵进行 SVD(奇异值分解),从而得到话题向量空间以及文档在话题向量空问的表示。LSA 的具体使用也非常简单,我们以 2020 腾讯广告算法大赛中的数据为例,首先构造用户点击的广告素材 ID 序列 (creative_id),然后进行 TF-IDF 计算,最后经过 SVD 得到结果,实现代码如下:
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import TruncatedSVD from sklearn.pipeline import Pipeline # 提取⽤户点击序列 docs=data_df.groupby(['user_id'])['creative_id'].agg(lambda x:" ".join(x)).reset_index()['creative_id'] # tfidf + svd tfidf = TfidfVectorizer() svd = TruncatedSVD(n_components=100) svd_transformer = Pipeline([('tfidf', tfidf), ('svd', svd)]) lsa_matrix = svd_transformer.fit_transform(documents)
-
PLSA
PLSA(概率潜在语义分析)模型其实是为了克服 LSA 模型潜在存在的一些缺点而提出的。PLSA 模型通过一个生成模型来为 LSA 赋予概率意义上的解释。该模型假设每一篇文档都包含一系列可能的潜在话题,文档中的每一个单词都不是凭空产生的,而是在潜在话题的指引下通过一定的概率生成的。 -
LDA
LDA(潜在狄利克雷分布)是一种概率主题模型,与词向量无关,可以将文档集中每篇文档的主题以概率分布的形式给出。通过分析一批文档集,抽取出它们的主题分布,就可以根据主题分布进行主题聚类或文本分类。同时,它是一种典型的词袋模型,即一篇文档由一组相互独立的词构成,词与词之间没有先后顺序关系。
7.3.3 嵌入式表示
毫不夸张地说,任何可以形成网络结构的东西,都可以有嵌入表示(Embedding),并且嵌入表示可以将高维稀疏特征向量转换成低维稠密特征向量来表示。嵌入表示这个概念最初在 NLP 领域被广泛应用,现在已经扩展到了其他应用,比如电商平台。电商平台将用户的行为序列视作由一系列单词组成的句子,比如用户点击序列和购买商品序列,经过训练后得到关于商品的嵌入向量。这里主要介绍经典的 Word2Vec 以及网络表示学习中的 DeepWalk 方法。
-
词嵌入 Word2Vec
Word2Vec 在竞赛中被经常使用,能够带来意想不到的效果,掌握其原理非常关键。Word2Vec 根据上下文之间的关系去训练词向量,有两种训练模式,分别为 Skip-Gram(跳字模型)和 CBOW(连续词袋模型),两者的主要区别为在于输入层和输出层的不同。简单来说,Skip-Gram 是用一个词语作为输入,来预测它的上下文;CBOW 是用一个词语的上下文作为输入,来预测这个词语本身。如下图所示,Word2Vec 实质上是只有一个隐藏层的全连接神经网络,用来预测与给定单词关联度大的单词。模型词汇表的大小是,每个隐藏层的维度是 N N N,相邻神经元之问的连接方式是全连接。下图中的输入层是把一个词被转化成的独热向量,即给定一个单词,然后把此单词转化为 { x 1 , x 2 , x 3 , ⋯ , x V } \{ x_1,x_2,x_3, \cdots, x_V \} {x1,x2,x3,⋯,xV} 序列,这个序列中只有一个值为 1 1 1,其他均为 0 0 0;通过输入层和隐藏层之问的权重矩阵 W V × N W_{V \times N} WV×N,将序列在隐藏层进行简单的映射;隐藏层和输出层之问存在一个权重矩阵 W N × V ′ W'_{N \times V} WN×V′,通过计算得出词汇表中每个单词的得分,最后使用 softmax 激活函数输出每个单词的概率结果。
如下图所示,Skip-Gram 根据当前单词预测给定的序列或上下文。假设输入的目标单词为 x k x_k xk,定义的上下文窗口大小为 c c c,对应的上下文为 { y 1 , y 2 , ⋯ , y c } \{ y_1, y_2, \cdots, y_c \} {y1,y2,⋯,yc},这些 y y y 是相互独立的。
如下图所示,为 CBOW 的模型结构,定义上下文窗口大小为 c c c,上下文单词为 { x 1 , x 2 , ⋯ , x c } \{ x_1, x_2, \cdots, x_c \} {x1,x2,⋯,xc},通过上下文单词来对当前的单词进行预测,对应的目标单词为 y y y。
Word2vec 使用起来非常方便,直接调用 gensim 包即可,需要注意的是几个具体参数,比如窗口大小、模型类型选择、生成词向量长度等等。
对于 Skip-Gram 和 CBOW 的选择,大致可以基于以下三点:CBOW 在训练时要比 Skip-Gram 快很多,因为 CBOW 是基于上下文来预测这个单词本身,只需把窗口内的其他单词相加作为输入进行预测即可,不管窗口多大,都只需要一次计算;相较于 Skip-Gram,CBOW 可以更好地表示常见单词;Skip-Gram 在少量的训练集中也可以表示稀有单词或者短语。
-
图嵌入 DeepWalk
在很多场景下,数据对象除了存在序列关系,还存在图或者网络的结构关系,而 Word2vec 仅能提取序列关系下的嵌入表示,不能跨越原本的序列关系获取图相关的信息。为了能从 “一维” 关系跨越到 “二维” 关系,图嵌入 (Graph Embedding) 成为了新的的研究方向,其中最具影响的是 DeepWalk。如下图所示,DeepWalk 算法主要包括三个部分,首先生成图网络,比如通过用户点击序列或购买商品序列来构造商品图网络,就是把序列中前后有关联的商品用线连接起来并作为图的边,商品则作为点,这样某个商品点就可以关联大量的领域商品;然后基于图网络进行随机游走 (random walk)获取网络中节点与节点的共现关系,根据游走长度生成商品序列;最后把产生的序列当作句子输入到 Skip-Gram 进行词向量的训练,得到商品的图嵌入表示。
为了方便理解,下面给出 DeepWalk 的代码描述:
def deepwalk_walk(walk_length, start_node):walk = [start_node]while len(walk) <= walk_length:cur = walk[-1]try:cur_nbrs = item_dict[cur]walk.append(random.choice(cur_nbrs))except:breakreturn walkdef simulate_walks(nodes, num_walks, walk_length):walks = []for i in range(num_walks):random.shuffle(nodes)for v in nodes:walks.append(deepwalk_walk(walk_length=walk_length, start_node=v))return walksif __name__ == "__main__": # 第⼀步:⽣成图⽹络(省略) # 构建item_dict 保存图中的节点关系,即字典结构存储,key 为节点,value 为领域 # 第⼆步:通过DeepWalk ⽣成商品序列 nodes = [k for k in item_dict] # 节点集合 num_walks = 5 # 随机游⾛轮数 walk_length = 20 # 随机游⾛⻓度 sentences = simulate_walks(nodes, num_walks, walk_length) # 序列集合 # 第三步:通过Word2Vec 训练商品词向量 model = Word2Vec(sentences, size=64, window=5, min_count=3, seed=2020)
对于 Word2Vec 的衍生 ltem2Vec 以及更多图嵌入方法,比如
LINE、Node2Vec 和 SDNE 都是很值得研究的。从传统的
Word2vec 到推荐系统中的嵌入表示,再到如今逐渐向图嵌入过渡,这些嵌入方式的应用都非常广泛。
7.3.4 相似度计算方法
基于相似度计算的特征提取有欧式距离、余弦相似度、Jaccard 相似度等,有助于提取用户、商品和文本的相似度。当已经获取了 用户和商品的嵌入表示、文本的分词表示及各类稀疏表示后,可以对些向量表示进行相似度的计算。基于相似度计算在用户分层聚类、个性化推荐或广告投放等应用中一直被广泛使用。
-
欧氏距离
欧式距离是最易于理解的一种距离计算方式,是二维、三维或多维空间中两点之问的距离公式。在 n n n 维空问中,对于向量 A = [ a 1 , a 2 , ⋯ , a n ] , B = [ b 1 , b 2 , ⋯ , b n ] A = [a_1, a_2, \cdots, a_n], \ B = [b_1, b_2, \cdots, b_n] A=[a1,a2,⋯,an], B=[b1,b2,⋯,bn],其公式如下: d ( A , B ) = ∑ i = 1 n ( a i , b i ) 2 d(A, B) = \sqrt{\sum_{i=1}^n (a_i, b_i)^2} d(A,B)=i=1∑n(ai,bi)2欧氏距离的代码如下:def EuclideanDistance(dataA, dataB):# np.linalg.norm ⽤于范数计算,默认是⼆范数,相当于平⽅和开根号return 1.0 / ( 1.0 + np.linalg.norm(dataA - dataB))
-
余弦相似度
首先,样本数据的夹角余弦并不是真正几何意义上的夹角余弦,实际上前者只不过是借用后者的名字,变成了代数意义上的 “夹角余弦”,用于衡量样本向量之间的差异。夹角越小,余弦值越接近于 1 1 1,反之则趋近于 − 1 -1 −1。上面的向量 A 和向量 B 之间的夹角余弦公式如下: c o s θ = ∑ i = 1 n ( a i × b i ) ∑ i = 1 n a i 2 × ∑ i = 1 n b i 2 cos \theta = \frac{\sum_{i=1}^n (a_i \times b_i)}{\sqrt{\sum_{i=1}^n a_i^2} \times \sqrt{\sum_{i=1}^n b_i^2}} cosθ=∑i=1nai2×∑i=1nbi2∑i=1n(ai×bi)余弦相似度的代码实现如下:def Cosine(dataA, dataB):sumData = np.dot(dataA, dataB)denom = np.linalg.norm(dataA) * np.linalg.norm(dataB)# 归⼀化到[0,1] 区间return ( 1 - sumData / denom ) / 2
-
Jaccard 相似度
Jaccard 相似度一般用于度量两个集合之间的差昇大小,其思想为两个集合共有的元素越多,二者就越相似。为了控制其取值范国,我们可以增加一个分母,也就是两个集合拥有的所有元素。集合 C、集合 D 的 Jaccard 相似度公式如下: J ( C , D ) = ∣ C ∩ D ∣ ∣ C ∪ D ∣ = ∣ C ∩ D ∣ ∣ C ∣ + ∣ D ∣ − ∣ C ∩ D ∣ J(C, \ D) = \frac{|C \cap D|}{|C \cup D|} = \frac{|C \cap D|}{|C| + |D| - |C \cap D|} J(C, D)=∣C∪D∣∣C∩D∣=∣C∣+∣D∣−∣C∩D∣∣C∩D∣Jaccard 相似度的代码实现如下:def Jaccard(dataA, dataB):A_len, B_len = len(dataA), len(dataB)C = [i for i in dataA if i in dataB]C_len = len(C)return C_len / ( A_len + B_len - C_len)
更多相似度计算方法有皮尔逊相关系数 (Pearson correlationcoefficient)、修正余弦相似度 (Adjusted Cosine Similarity)、汉明距离 (Hamming distance)、曼哈顿距离(Manhattan distance)、莱文斯坦距离 (Levenshtein distance)等。
7.4 用户画像应用
- 用户分析
- 精准营销
- 风控领域