用户画像一般包含三种画像:基础画像(base_info_da)、行为画像(action_info_da)、偏好画像(prefer_info_da)。
- 基础画像:用户的年龄、性别、婚姻状态,还有挖掘类标签也可融入其中,如用户生命周期、留存率、流失率等。
- 行为画像:比如用户近X天在Y维度下访问、关注商品的次数。(X可以是1、3、7、100天,Y可以是比如裤子类、羽绒服类、夹克类)
- 偏好画像:根据用户X的行为数据,进行时间衰减和不同行为的权重计算出偏好。(比如裤子类中,用户对休闲裤的偏好是0.6,牛仔裤的偏好是0.4)
用户画像需要买足三个特性:一致性、快速产出、快速迭代。
- 一致性:各种画像数据能够对得上。(用户近7天有牛仔裤页面的访问,但是没有裤子类的偏好)
- 快速产出:离线画像T+1,越早产出业务方使用效果越好。
- 快速迭代:快速优化、新增画像数据到画像。(比如用户偏好增加用户行为,新增一个维度的用户偏好)
基于上述特性,开始进行设计:
- mapped层:要有一份最全的行为数据,包括线上、线下、商机,详情页、非详情页、主页、各种频道页面,只要是和用户有关的数据都要包含。
- action层:从mapped取到和某件商品(主体)直接关联的数据,比如裤子页面的访问数据需要,裤子列表页的数据不需要。
- 目前有了各种用户数据,就需要思考每种画像所需的数据是什么样的,需要进行链路上的设计。
- 用户基础画像、用户行为画像都需要一个人群表(所有主键表),基于这个人群进行很多次left join去做一张很大的画像表,那么需要人群表。
- 基础画像和行为画像的人群一般情况是不一样的,比如基础画像的人群表只需要有id,行为画像的人群表就需要id、type(例如上衣、裤子,就可以根据此计算用户近7天访问裤子页面次数,近7天访问上衣页面次数)。虽然需要字段个数的不一样,但是差别也不会很大。
- 根据5的需求,可以根据mapped做一层mapped_simplify,只保留基础、行为画像用得到的字段,并进行聚合。比如一个用户访问一条裤子三次,理论上应有三行数据,但现在合并成一行,加个cnt字段为3。
- 有了mapped_simplify,可以作出两种画像的人群base_info_base_da、action_info_base_da,画像就可以用这两个表当主表,一直进行left join就可以了。
- 用户偏好画像一般是在某个属性上的,比如裤子价格、裤子风格,每种属性都是单独计算,所以要基于action层构造一个适用于偏好的底层表,这张表要满足:合理设计二级分区、数据聚合、统一枚举值处理。使在计算偏好时候读到的数据没有一行、一列是重复的。
- 接下来计算用户各种行为衰减之后的值,再根据权重计算偏好、归一。
- 三种画像可以做成接口供业务方使用;也可以将偏好再处理一下,选取每种偏好的top1,搭配基础、行为画像圈包使用。
三种特性怎样满足:
- 一致性:通过合理的链路设计,一致性自然而然的就可以满足。
- 快速产出:计算画像的时候,合理的di表聚合、裁剪,中间表的开发,sql、参数的调优。(需要熟悉业务、了解mr)
- 快速迭代:对于有大量重复的工作,可以通过配置化完成,减少hql开发时间。