【BI学习心得03-推荐系统眼中的你——用户画像】


1.背景故事

小明是2020年刚毕业的学生,谁都想不到,今年的疫情如此严重,小明的毕业答辩也是远程进行,完成毕业前的相关事项。头疼的事情来了,工作怎么找?上网搜了几篇博客,看别人怎么写简历。写了一份还不错的简历并且投递出去,犹如石沉大海,没有任何的反应,实在没有办法,把简历投到了海底捞,海底捞一看是学推荐系统的,给了小明一个机会。疫情严重,海底捞的线下店开不了,老板发了一个用户数据集,要求小明给用户做画像,做好了就可以入职上任。小明要怎么完成这个任务,从而顺利入职,开启自己工作时光。小明遇到的第一个问题就是用户画像是什么?用户画像怎么做?

2.概述

用户画像是通过分析用户的基础信息、特征偏好、社会属性等各维度的数据,刻画出用户的信息全貌,从中挖掘用户价值。这些标签集合就能抽象出一个用户的信息全貌,如下图所示是某个用户的标签集合,每个标签分别描述了该用户的一个维度,各个维度之间相互联系,共同构成对用户的一个整体描述。

在这里插入图片描述

3.用户画像流程

3.1整体流程

构建用户画像的方法进行总结归纳,发现用户画像的构建一般可以分为统一标识、给用户打标签、基于标签指导业务三步。

3.2用户为什么进行标注

统一标识,是用户的唯一ID, 是最基础常见的标签,从用户注册数据、用户访问数据中统计得出。在实际应用中,我们用userID,简称uid,统一用户标识。
在这里插入图片描述
有了统一标签,我们想给不同的用户打上独特标签,更加精准的识别和分类。用户的标签可以从不同的维度出发,从这些维度全方位的了解用户,分析客户喜欢什么,提供相应的服务。
在这里插入图片描述
在设计基于标签的个性化推荐系统之前,我们需要深入了解用户的标注行为(即打标签的行
为),知知道用户为什么要标注,用户怎么标注,只有深入了解用户的行为,我们才能基于这个行为设计出令他们满意的个性化推荐系统。

YouTube网站是对用户的标注方面算是首屈一指,用户的观看时长、在什么时间段浏览信息、收藏什么类型视频、在哪些视频下进行了评分与关注等,这些都是肉眼可见的指标。除此之外,有的UP主视频做的好,很多人关注,慢慢推出专栏视频,需要用户付费观看,为了消除广告,体验VIP会员专享,开通会员,用来分析用户消费行为。用户平时浏览的内容是科普、读书类,可能会推送相类似的,还会不定时推送其他内容,探索用户的潜在需求。

3.3用户如何打标签

在互联网中,尽管每个用户的行为看起来是随机的,但其实这些表面随机的行为背后蕴含着很多规律。这一节将通过研究Delicious数据集总结用户标注行为中的一些统计规律。

德国研究人员公布过一个很庞大的Delicious数据集,该数据集包含2003年9月到2007年12月Delicious用户4.2亿条标签行为记录。本节选用该数据集2007年一个月的数据进行分析,对该数据集的统计特性进行研究。

用户行为数据集中用户活跃度和物品流行度的分布都遵循长尾分布(Power Law分布)。因此,我们首先看一下标签流行度的分布。我们定义的一个标签被一个用户使用在一个物品上,它的流行度就加一。如下代码计算了每个标签的流行度

 # 使用训练集,初始化user_tags, tag_items, user_items
def initStat():
    records=train_data
    for u,items in records.items():
        for i,tags in items.items():
            for tag in tags:
                #print tag
                # 用户和tag的关系
                addValueToMat(user_tags, u, tag, 1)
                # tag和item的关系
                addValueToMat(tag_items, tag, i, 1)
                # 用户和item的关系
                addValueToMat(user_items, u, i, 1)
    print("user_tags, tag_items, user_items初始化完成.")
    print("user_tags大小 %d, tag_items大小 %d, user_items大小 %d" % (len(user_tags), len(tag_items), len(user_items)))

给用户“打标签”,总的来说可以分为三类:

● 统计类标签:最基础常见的标签,从用户注册数据、用户访问数据中统计得出。

● 规则类标签:基于用户行为及规则产生,通常由对业务更为熟悉的运营人员和数据人员共同协商确定。

● 机器学习挖掘类标签:通过机器学习挖掘产生,根据某些用户行为或熟悉进行预测判断。

3.3.1数据结构

画像系统的基础设施包括Spark、Hive、HBase、Airflow、Redis、Elasticsearch。
下图是《用户画像》中的数据仓库架构。
在这里插入图片描述
(1)数据仓库ETL加工流程是对每日的业务数据、日志数据、埋点数据等数据经过ETL过程,加工到对应的原始数据层(ODS)、数据仓库(DW)、数据集市层(DM)中。

(2)用户画像不是产生数据的源头,是经过ODS层、DW层、DM层中的数据与用户相关数据的二次建模加工得到的数据。

在ETL过程将用户标签写入Hive,根据不同数据对应不同数据库的应用场景,再将数据同步到MySQL、HBase、Elasticsearch等数据库中。

Hive:存储用户标签、用户人群及用户特征库的计算结果

MySQL:存储标签元数据,监控相关数据,导出到业务系统的数据

HBase:存储线上实时数据

Elasticsearch:支持海量数据的实时查询分析

(3)用户标签在Hive中加工完成后,部分标签通过Sqoop同步到MySQL数据库,提供用于BI报表展示的数据、多为透视分析数据、圈人服务数据;另一部分标签同步到HBase数据库用于产品的线上个性化推荐。

3.3.2用户画像模块

搭建用户画像方案整体考虑以下8个模块
在这里插入图片描述
● 用户画像基础

了解和明确用户画像包含的模块,设计数据仓库架构、开发流程、表结构,及ETL的设计。主要就是明确大方向的规划。

● 数据指标体系

建立数据指标体系,根据业务线梳理,包括用户属性、用户行为、用户消费、风险控制等维度的指标体系。

● 标签数据存储

设计好数据指标体系后,考虑不同应用场景使用哪种存储方式。

● 标签数据开发

重点模块。标签数据开发包含统计类、规则雷、挖掘类、流式计算类标签的开发,以及人群计算功能的开发。

重点内容:数据调研、和业务方确认数据口径、标签开发上线。打通画像数据和各业务系统之间的路,提供接口服务

● 开发性能调优

标签数据开发上线后,为了缩短调度时间、保证数据稳定性,需要对标签脚本、调度脚本进行迭代重构、调优。梳理现有标签开发、调度、校验告警、同步到服务层等相关脚本、明确可以优化的地方,迭代优化。

重点内容:减少ETL调度时间,降低调度时的资源消耗。

● 作业流程调度

标签加工、人群计算、同步数据和业务系统、数据监控预警脚本开发完成后,需要调度工具把整套流程调度起来。

重点内容:满足定式调度、监控预警、失败重试,各调度任务之家的复杂依赖关系。

● 用户画像产品化

产品化的模块包括包括标签视图、用户标签查询、用户分群、透视分析等。

重点内容:满足业务方对用户精准营销的需求。

● 用户画像应用

应用场景包括用户特征分析、短信邮件、站内信、Push消息的精准推送,客户针对不同用户的话术、针对高价值用户的极速退款等高级服务应用等。

重点内容:帮助业务方理解和应用用户画像数据,提高用户活跃度和GMV。

3.3.3数据指标体系

数据指标体系是建立用户画像的基础,也是在进入开发前的关键环节,是需要结合业务场景制定的数据指标。

建立用户画像一般从2个维度:

用户维度(userid):基于当前用户账号相关数据推送内容。

设备维度(cookie):当用户没有登陆账户而访问设备时,基于用户在设备的行为对该设备推送相关内容。

  1. 用户标签从标签类型可分为:统计类、规则类、机器学习挖掘类。

  2. 从建立的维度来看,可分为:用户属性类、用户行为类、用户消费类、风险控制类。
    至于标签如何分类,没有严格的规定,符合业务场景和使用者使用即可。

建立数据指标体系,从而知道用户画像建立的基本维度。但现实往往很复杂,数据的处理也是一个难题,只有把数据清洗干净,得到合适的特征,才能更好地给用户打标签。好的数据质量,要满足“完全合一”,即四个重要标准:

  • 完整性:数据是否存在空值,字段是否完善,是否有漏掉
  • 全面性:观察某一列的全部数值及特征值,是否存在单位、字段名与数值不匹配
  • 合法性:数据的类型、内容、大小的合法性。
  • 唯一性:数据是否存在重复记录
3.3.4常见的数据清洗问题
问题1:缺失值

在数据中有些年龄、体重数值是缺失的,这往往是因为数据量较大,在过程中,有些数值没有采集到。通常我们可以采用以下三种方法:

  • 删除:删除数据缺失的记录;
  • 均值:使用当前列的均值;
  • 高频:使用当前列出现频率最高的数据。

创建一个包含NaN(not a number)的数据。

import pandas as pd
import numpy as np
 
dates = pd.date_range('20201121', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
df.iloc[0, 1] = np.nan
df.iloc[1, 2] = np.nan
print(df)
"""
             A     B     C   D
2020-11-21   0   NaN   2.0   3
2020-11-22   4   5.0   NaN   7
2020-11-23   8   9.0  10.0  11
2020-11-24  12  13.0  14.0  15
2020-11-25  16  17.0  18.0  19
2020-11-26  20  21.0  22.0  23

"""

pd.dropna

如果直接想去掉全是nan的行或者列,使用dropna;

df = df.dropna(
    axis=0,     # 0: 对行进行操作; 1: 对列进行操作
    how='any'   # 'any': 只要存在 NaN 就 drop 掉; 'all': 必须全部是 NaN 才 drop 
    ) 
"""
             A     B     C   D
2020-11-23   8   9.0  10.0  11
2020-11-24  12  13.0  14.0  15
2020-11-25  16  17.0  18.0  19
2020-11-26  20  21.0  22.0  23

"""

pd.fillna()
如果是将 NaN 的值用其他值代替, 比如代替成 0:

df = df.fillna(value=0)

"""
             A     B     C   D
2020-11-21   0   0.0   2.0   3
2020-11-22   4   5.0   0.0   7
2020-11-23   8   9.0  10.0  11
2020-11-24  12  13.0  14.0  15
2020-11-25  16  17.0  18.0  19
"""

pd.isnull()
判断是否有缺失数据 NaN, 为 True 表示缺失数据:

df = df.isnull()
"""
                A      B      C      D
2020-11-21  False   True  False  False
2020-11-22  False  False   True  False
2020-11-23  False  False  False  False
2020-11-24  False  False  False  False
2020-11-25  False  False  False  False
"""

检测在数据中是否存在 NaN, 如果存在就返回 True:

np.any(df.isnull()) == True  
# True
问题2:空行

删除全空的行

df.dropna(how='all',inplace=True)
问题3:列数据的单位不统一

weight列的数值,有的单位是千克(kgs),有的单位是磅(lbs)。
这里统一将磅(lbs)转化为千克(kgs):

# 获取 weight 数据列中单位为 lbs 的数据
rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
# 将 lbs转换为 kgs, 2.2lbs=1kgs
for i,lbs_row in df[rows_with_lbs].iterrows():
	# 截取从头开始到倒数第三个字符之前,即去掉lbs。
	weight = int(float(lbs_row['weight'][:-3])/2.2)
	df.at[i,'weight'] = '{}kgs'.format(weight) 
问题4:非ASCII字符

如果文本中存在非 ASCII 的字符。我们还需要进行删除或者替换。

# 删除非 ASCII 字符
df['name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
问题5:一列有多个参数(可选)

可以将Name分成last name + first name,也可以进行保留。

# 切分名字,删除源数据列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)

默认采用的空格进行分割,相当于df[‘name’].str.split(’ ', expand=True)

问题6:重复数据

如果存在重复记录,就使用 Pandas 提供的 drop_duplicates() 来删除重复数据。

# 删除重复数据行
df.drop_duplicates(['first_name','last_name'],inplace=True)
3.3.5标签维度

1.用户属性类

一般是与用户自带属性相关,例如性别、年龄、地域、注册日期、会员类型等。

对于相同的一级标签诶些,需要判断多个标签之间的关系是互斥还是非互斥关系。

例如,在判断性别时,不能既是男、又是女,这就是互斥关系。

对于传统企业来说,更多的是从用户属性类维度去丰富指标体系。而对于互联网企业来说,其拥有海量的用户访问日志数据,所以更容易从用户行为类数据分析用户的行为特性。

2.用户行为类

常见用户行为维度指标包括订单相关行为、下单/访问相关行为、用户近30天行为指标、高频活跃时间段、用户购买类、点击偏好、营销敏感度等相关行为。

3.用户消费类

用户消费维度指标体系建设从用户搜索、流量、加购、收藏、下单商品对应的品类入手。品类越精细,给用户推荐的准确性越高。

例如品类细分到:手机-手机配件-数据线。

4.风险控制类

风控维度主要是预防薅羊毛、恶意刷单、借贷欺诈行为的用户,未防止这类用户给平台带来损失,所以专门设置风控类维度。

结合业务场景,可从账号风险、设备风险、借贷风险等维度考虑指标体系。

5.社交属性维度

该维度主要是了解用户的社交范围,如家庭成员、社交偏好、社交活跃度等等。以此来提供个性化推荐和精准营销。

例如在朋友圈收到的广告,也是基于用户的社交属性进行的推送。

下面是整理的上述5个维度的画像主题:
在这里插入图片描述

3.3.6其他常见标签维度

用户标签体系不限于划分维度,通过应用场景对标签进行归类也是常用手段。

从业务场景出发,可分为:用户属性、用户行为、营销场景、地域细分、偏好细分、用户分层等维度。

每个维度再分成二级标签、三级标签等。
在这里插入图片描述

3.3.7标签命名方式

在确定好标签后,需要对标签进行命名,以便于管理。

对一个标签,可从多个角度来确定唯一名称。
在这里插入图片描述
1.标签主题
标明属于哪个类型的标签,如人口属性(ATTRITUBE),行为属性(ACTION),用户消费(CONSUME),风险控制(RISKMANAGE)等。

2.用户维度
表明该标签来源,是用户唯一标识(userid),还是用户设备(cookie),一般用U和C区分。

3.标签类型
标签分类,统计型(01)、规则型(02)、算法型(03)。

4.一级归类
在每个标签大类下面,进一步细分的标签类型。

参照上面的命名方式,举例用户的性别标签:

命名规则:标签主题_用户维度_标签类型_一级归类

【男】:ATTRITUBE_U_01_001

【女】:ATTRITUBE_U_01_002

ps: 实际应该全部显示文本,只有背后实现是字母数字。

3.3.8元数据管理

标签完成梳理和命名后,需要维护一张码表用例记录标签id名称、标签含义及标签口径等主要信息,方便元数据的维护与管理。

3.3.9标签数据存储

用户画像的数据存储的技术选型有多种,不同存储方式适用于不同场景。主要有Hive、MySQL、HBase、Elasticsearch。

Hive数据库
Hive是基于Hadoop的一个数据仓库工具,依赖于HDFS存储数据,可以将结构化的数据文件映射为一张数据库表,提供SQL语言查询存储在HDFS中的数据。

一般使用Hive作为数据仓库用来存储标签、用户特征库等相关数据。

主要用来做离线数据分析,比直接用MapReduce开发效率更高。

3.3.10数据仓库

在数仓建模过程中,主要是设计事实表和维度表的建模开发。

在画像系统中主要使用Hive作为数据仓库,开发相应的事实表和维度表来存储标签、人群、应用到服务层的相关数据。

a. 事实表
事务事实表:用于描述业务过程,按业务过程的单一或多业务过程可进一步分为单事务事实表和多事务事实表。

周期快照事实表:在一个确定的时间段内对业务状态进行度量。例如:查看一个用户近1年的付款金额、近1年购物次数、近30天登录天数等。

累计快照事实表:对不同的事件之间的时间间隔进行度量。例如:用户从购买到支付的时长、从下单到订单完结的时长。一般用于统计时间周期明显的业务过程。

b. 维度表
维度表是对事实属性的各个维度的描述。

例如,商标维度包括:价格、折扣、品牌、原厂家、型号等方面的信息。维度表的开发中,经常遇到维度缓慢变化的情况,对于缓慢变化维,一般采用:

① 重写维度值,对历史数据进行覆盖;

② 保留多条数据,通过插入维度列字段区分;

③ 开发日期分区表,每日分区数据积累当日维度的属性;

④ 开发拉链表,按时间变化进行全量存储等方式处理。

ID-MAP
开发用户标签的时候,需要把用户不同来源的身份通过数据手段识别为同一主体,即ID-Mapping。

用户的属性、行为相关数据分散在不同来源中,通过ID-Mapping能够把不同场景下的数据联系到一起,消除数据孤岛。

即通过ID-Mapping打通userid和cookieid的对应关系。
在这里插入图片描述
在设计ID-Mapping表时,由于一个用户可在多个设备登录,一个设备也可以被多个用户登录,所以考虑用缓慢变化维表来记录不同时间点的状态变化。

① 从埋点表和访问日志表获取到cookieid和userid同时出现的访问记录;

② 将获取到的userid和cookieid插入cookieid-userid关系表;

③ 创建ID-Map拉链表,将每天新增到cookie表的数据与拉链表历史数据做笔记,若有变化或新增,则更新拉链表;

④ 创建完成后,每天ETL调度将数据更新到ID-Mapping拉链表中。

⑤ 对于拉链表,可查看某日的快照数据,以查看某个用户在某天关联到的设备id。

对于实际开发中,还需要考虑用户在不同平台间(如Web端和App端)的打通情况。

3.3.11MySQL

MySQL是关系型数据库,在用户画像系统中可用于元数据管理、监控预警数据、结果集存储等应用中。

1.元数据管理
Hive适用于大数据量的批处理工作。而小量级的数据会存储在MySQL中,因为MySQL有更快的读写速度。

平台标签视图中的标签元数据可存储在MySQL关系数据库中,便于便签编辑、查询、管理。
在这里插入图片描述
2.监控预警数据
MySQL还可以用于存储每日对ETL结果的监控信息。

从标签计算数据的监控,到服务层同步数据的监控。

① 标签计算数据监控

监控每天标签ETL的数据量,若有异常则发送警告通知,同时暂停后续任务。

② 服务层同步数据监控

即将标签相关数据从Hive数仓像服务层同步数据的监控。

服务层一般采用HBase、Elasticsearchzuo作为数据库存储标签数据供线上调用。

当相关数据在Hive中的数量不等于同步到服务层后的数量,则会触发警告。

3.结果集存储
在打通画像业务与业务系统时,考虑将hive中的用户标签同步到各个业务系统中,此时MySQL可以用户存储结果集。

Sqoop是一个用来将Hadoop和关系型数据库中的数据相关迁移的工具,它可以将关系型数据库中的数据导入Hadoop的HDFS中,也可将HDFS中的数据导入关系型数据库中。

3.3.12HBase

HBase是存储线上接口实时调用的数据,是高性能、列存储、可伸缩、实时读写的分布式存储系统,运行在HDFS上。

Hive是跑MapReduce任务离线查询,适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。

HBase 则适合用来进行大数据的实时查询,例如 Facebook 用 HBase 进行消息和实时的分析。

画像系统中每天在Hive里跑出的结果集数据可同步到HBase数据库,用于线上实时应用的场景。
在这里插入图片描述
应用场景
某渠道运营人员为促进未注册的新安装用户注册、下单,计划通过App首页弹窗发放红包或优惠券的方式进行引导注册。

① 通过组合用户标签(如【未注册用户】【按照据今天数小于7天】)筛选出对应用户群,然后将对于人群推送到“广告系统”,这样每天画像系统的ETL调度完成后对应的人群数据会推送到HBase数据库进行存储。

② 当满足条件的新用户来访App时,由在线接口读取HBase数据库,查询到该用户时就会为其推送该弹窗。

3.3.13Elasticsearch

Elasticsearch存储标签用于人群计算和人群多维透视分析,是一个开源的分布式全文检索引擎,开源近乎实时地存储、检索数据。

而且扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

对于用户标签查询、用户分群计算、用户群多维透视分析这类时间响应要求极高的场景适用。

Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档,用json作为文档格式。
在这里插入图片描述
1.应用场景
a. 在每天的ETL调度中,将Hive计算的标签数据导入Elasticsearch中。

b. 在标签调度完成且通过校验后(标签监控预警完成),将标签数据同步到Elasticsearch中。

c. 在与elasticsearch数据同步完成并通过校验后,向在MySQL维护的状态表中插入一条状态记录,表示当日数据可用,线上计算用户人群的接口则读取最近的数据。

d. 如果当天因为调度延迟或其他原因没有及时将当日数据导入Elasticsearch,接口也能读取最近一天对于的数据。如当日数据产出正常时,state字段=0,异常=1,。图1月20日异常时,线上接口扫描该状态记录后不读取1月20日的数据,而是读取前一天的数据。

e. 为避免从Hive到Elasticsearch中灌入数据时发生数据缺失,在像MySQL状态表更新状态位前需要校验elasticsearch与Hive中的数据是否一致。

f.Hive中的用户标签灌入Elasticsearch中后,业务人员在画像产品端计算人群或分析人群时,通过RESTful API访问Elasticsearch进行计算。
在这里插入图片描述

3.3.14标签数据开发

标签数据开发是用户画像体系中最重要的一环,主要包括离线标签开发、实时标签开发、用户特征库开发、人群计算、打通数据服务层等开发内容。

在这里插入图片描述

3.3.15统计类标签开发

统计类标签是指用户年龄、性别、购买金额、累计购买次数、近x日登陆次数等描述用户状态的标签。

▷ 案例:近30日购买行为标签

① 拆解二级标签。近30日购买行为拆解为:付款订单量(ACTION_U_01_001)、总付款金额(ACTION_U_01_002)、加入购物车次数(ACTION_U_01_003)

② 将需要计算的标签从目标表中抽出来(ACTION_U_01_001、ACTION_U_01_002、ACTION_U_01_003)

③ 增量获取用户最新状态,做全连接关联。即通过全连接(full outer join)方式,当有最新状态时获取最细状态,否则保留原来的状态标签;

④ 任务执行完后,将数据插入Hive数据表中;

3.3.16规则类标签开发

一般是根据业务场景,在 业务层面上指定的规则标签。这类标签受主观判断因素的影响,在开发前需要做数据调研,结合运营业务规则开发。

除了写脚本开发标签外,还可自动打标签。比如用户触发的行为中,有超过80%的记录是3C商品,那么自动打上“数码达人”的标签。

▷ 案例:用户价值类标签

RFM模型是衡量用户价值的重要工具,包含3个指标,8类人群:

(1)Recency:最近一次消费。指上一次购买的时候。

(2)Frequency:消费频率。消费频率是顾客在限定的期间内所购买的次数。

(3)Money:消费金额。消费金额是所有数据库报告的支柱,也可以验证“帕雷托法则”(Pareto’s Law)——公司80%的收入来自20%的顾客。

在这里插入图片描述
在这里插入图片描述
在开发对应标签前需要进行数据调研。

结合业务场景对3个维度的指标在时间定义或数值上进行确定和划分。

① 得到用户最近一次交易时间的分布。例如按照二八比例,将最近一次交易时间距今<90天的,定义为“近”,>90天的定义为“远”

② 得到用户近一年交易订单量分布。将历史订单<=3单的的划分为“低频”,>3单的划分为“高频”

③ 得到将一年交易额分布。将交易金额<300的,定义为“低额”;>300的,定义为“高频”

④ 根据以上3个维度,进行交叉分析(R≤90=“近”,R>90=“远”;F≤3=“低频次”,F>3=“高频次”;M≤300=“低额”,M>300=”高额”),划分为以下8类人群
在这里插入图片描述

3.3.17挖掘类标签开发

挖掘类标签即算法类标签,需要用算法挖掘用户相关特征。

ps: 这里更加倾向于 NLP 相关的处理。

一般用户相关的挖掘标签可包括根据购买商品预测用户男女性别、预测用户点击下单、判断用户已流失或即将流失。

挖掘类标签开发环节包括:①用户行为特征工程开发、②算法调优、③上线工程化调度等环节,开发周期较长。

▷ 案例:对大量未打标签的文章、帖子等文本数据自动分类,自动打标签。

1、特征选取及开发

① 标注:对一批文章进行人工准确分类,作为训练样本;

② 训练:计算机从标注好的文档集中挖掘出能够有效分类的规则,生成分类器。模型中用到的算法和数据处理技术包括文本分词、TF-IDF算法、朴素贝叶斯分类算法;

③ 分类:将生成的分类器应用在待分类的文档集中,从而获得文档的分类结果。

2、文本分词处理

将连续的字序按照一定规范重新组合成次序列的过程,中文分词是讲一个个汉字序列切分重一个个独立的单词。

3、数据结构处理

为了便于后续生成词向量空间模型,这些分词后的文本信息需要转换成文本向量信息并对象化。

4、文本TF-IDF权重

该步骤中将上一步存储的结构化数据构建成一个TF-IDF词向量空间,空间中的词均来自该训练集,各个词的权重矩阵也都一并保存下来。

5、朴素贝叶斯分类

3.3.18流式计算标签开发

离线标签的开发,即批次ETL任务,一般为T+1日的数据。

流式计算标签主要是实时数据,比如实时订单分析,或者给首次登录App的新人用户弹窗推送、发放红包,实时分析用户场景并进行推送。

3.3.19用户特征库开发

特征库是对用户每一次行为(浏览、首次、搜索、购买等)及该行为对应的标签(或商品类)进行详细的记录,以便挖掘用户喜好。

是为个性化推荐、精准营销、商业分析提供中间层数据。

▪ 用户标签:静态记录当前状态

▪ 用户特征库:多维度汇总。例如:一个用户经常浏览、购买奶粉等婴儿用品,则她可能是个妈妈;用户经常收藏、点赞搞笑视频,可用于挖掘用户偏好;用户经常搜索美妆美容类商品,可能用户是女性。

① 特征库规划

用户与商品相关的行为日志数据保护了用户对商品行为的明细。

根据应用需要,创建表dw.cookie_feature_event_append来构建用户特征。

在这里插入图片描述
② 数据开发

数据开发过程中,主要从订单表、访问日志表、打点日志表中对用户当日的行为(加购、点击、浏览、点赞等)抽取数据,然后清洗加载到用户特征库对应表(dw.cookie_feature_event_append)
在这里插入图片描述
③ 其他特征库规划

除了用户特征库,还有围绕本公司的产品进行特征库的规划与开发。

3.3.20标签权重计算

用户行为对应不同的权重,比如用户购买的权重肯定比加到购物车重,加入购物车的权重大于收藏,收藏大于浏览。

1.TF-IDF算法

TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。

2.时间衰减系数

在用户画像的应用中,用户的某些行为会随时间衰减,而某些行为不会随时间衰减。时间衰减是指随着时间的推移,用户的历史行为和当前行为的相关性不断减弱。

3.标签权重配置

用户标签的权重最终还是需要进一步结合标签所处的业务场景、距离当前时间、用户行为产生该标签的行为次数等因素,最终得到用户标签权重的综合打分公式:

用户标签权重=行为类型权重×时间衰减×用户行为次数×TF–IDF计算标签权重

3.3.21标签相似度计算

标签相似度计算主要是对标签进行有效聚类,通过对用户身上的标签构建“同现矩阵”的方式对标签进行聚类。

例如最经典的“啤酒和尿布”的营销场景,就是一种相关性。即这里的同现是指标签同时出现,即一个用户被打上A标签的同时被打上B标签。

3.3.22标签组合计算

当业务方根据业务规则应用标签时,是需要组合多个标签来创建对应的用户群体的,此时需要应用到组合标签计算。

▷ 应用案例:用户A、B、C、D、E已经被打上了符合自己特征的标签,业务人员想给“高价值用户群组”分发消费券。

根据运营经验定义了“高价值用户群组”,其特征为:①女性;②25~35岁;③累计消费>5次;④累计消费>500元;⑤活跃度在中活跃以上的用户。

组合标签计算的任务就是根据业务人员筛选的规则,给出符合上述条件的用户群组。

1、从MySQL读取不同组合标签的计算规则;

2、将上述规则拼接成接口传入参数的查询命令,通过接口方式进行查询;

3、通过Elasticsearch查询符合这些条件的用户id,返回id作为rowkey去HBase中查询用户身上的标签。

3.3.22数据服务层开发

数据的主要目的是应用到业务系统和营销场景中,需要打通标签数据和业务系统,通过产品化的方式将标签数据应用到业务系统。

数据服务层开发就包括了离线服务层和在线服务层。

离线服务层:将ETL后的用户群数据推送到对应业务系统。

在线服务层:以RESTful API方式提供接口服务,可支持个性化推荐、营销推送(站内广告系统的个性化弹窗、App的消息push和轮播广告、短信等)、在线特征库等场景。

几个典型的应用场景包括:

1)短信营销:可以基于用户画像的自定义圈人服务,进行重点用户的广告/消息消息推送/短信/邮件营销。

2)邮件营销:可以基于不同用户群体,进行个性化有效的会员营销,同时在服务上也可以基于已经打通的用户数据,提供会员差异化的客服/物流/活动等服务。

3)风控系统:可以根据用户级别,作为风控系统规则引擎或模型的输入。

4)数据分析:可以分析不同群体的行为特征,提供分析和决策。

5)BI数据:可以监控核心用户群体的变化,为上层决策提供数据基础支持。

3.3.23GraphX图计算用户

Spark GraphX是分布式图计算框架,基于Spark平台提供了对图计算的简单且丰富的接口,以满足对分布式图处理的需求。

Spark GraphX由于底层是基于Spark来处理的,所以天然就是一个分布式的图处理系统。

在工程实践中,存在需要计算二度关系用户的场景,即用户与用户之间通过其共同的好友找到他们的二度关系熟人,这种对图的挖掘计算可借助Spark GraphX完成。

GraphX提供顶点(Vertex)、边(Edge)、三元组(Triple)三种视图,GraphX图计算也在这三种视图上完成。

顶点包括顶点id和顶点属性;边包括源顶点(srcid),目标顶点(dstid)和属性(property);三元组是对顶点和边的扩展,将顶点和边的属性保存为一个RDD[EdgeTriplet[VD,ED]]
在这里插入图片描述
▷ 应用案例:多个用户(如下111、222、333)登录同一个手机上的某App(如下C),也存在同一个用户(111)在多个手机上(A、C)登录该App的情况,这里初步认为在同一个手机上登录的用户之间是熟人关系,基于这种熟人关系需要进一步挖掘用户的二度熟人。

在这里插入图片描述

3.4用户标签如何指导业务

收集、分析用户的数据,了解用户的喜好,推荐系统自动搜索精致内容,日活量用户持续增加,这是很多做推荐系统的,理想目标。现实是,没有使用过公司类似产品,如何进行拉新,通过精准的营销获取新客户?新用户入住公司的APP,提供个性化的推荐,用户停留时间加长,用户的访问数据被存进数据池,下次用户打开APP时,看到全新的内容,并且是用户熟悉的内容,乐此不疲。推荐系统分析到客户浏览某一信息过多,用户感到厌烦,没有新鲜感,便更换内容,一条广告映入用户眼帘,用户果断关掉APP,卸载,APP在角落吃灰。

项目经理,喊来数据分析人员,查明原因,算法部分的人说,推荐的商品太贵了,这个用户平时喜欢用优惠券买东西,我们没提供,销售的人应该把这个加进去。。。。。。
在这里插入图片描述

3.5标签从而来

说来说去,还是用户少打了一个“要优惠券”标签。每天的产生大量的数据,很多不标准的数据,我们也要一条条去分析,去看吗?标准,有意义的样本数据可以交给数据专家们,制作标准数据库。

在面对如此庞大的“压力”,使用聚类算法小可爱,就能快速给出一个初步结果。 常用的聚类算法有,K-Means、EM聚类、Mean-Shif、DBSCAN、层次聚类、PCA。

3.5.1什么是聚类分析?

聚类 (Clustering) 就是将数据对象分组成为多个类或者簇 (Cluster),它的目标是:在同一个簇中的对象之间具有较高的相似度,而不同簇中的对象差别较大。所以,在很多应用中,一个簇中的数据对象可以被作为一个整体来对待,从而减少计算量或者提高计算质量。

其实聚类是一个人们日常生活的常见行为,即所谓“物以类聚,人以群分”,核心的思想也就是聚类。人们总是不断地改进下意识中的聚类模式来学习如何区分各个事物和人。同时,聚类分析已经广泛的应用在许多应用中,包括模式识别,数据分析,图像处理以及市场研究。通过聚类,人们能意识到密集和稀疏的区域,发现全局的分布模式,以及数据属性之间的有趣的相互关系。

聚类同时也在 Web 应用中起到越来越重要的作用。最被广泛使用的既是对 Web 上的文档进行分类,组织信息的发布,给用户一个有效分类的内容浏览系统(门户网站),同时可以加入时间因素,进而发现各个类内容的信息发展,最近被大家关注的主题和话题,或者分析一段时间内人们对什么样的内容比较感兴趣,这些有趣的应用都得建立在聚类的基础之上。作为一个数据挖掘的功能,聚类分析能作为独立的工具来获得数据分布的情况,观察每个簇的特点,集中对特定的某些簇做进一步的分析,此外,聚类分析还可以作为其他算法的预处理步骤,简化计算量,提高分析效率,这也是我们在这里介绍聚类分析的目的。

3.5.2不同的聚类问题

对于一个聚类问题,要挑选最适合最高效的算法必须对要解决的聚类问题本身进行剖析,下面我们就从几个侧面分析一下聚类问题的需求。

  • 聚类结果是排他的还是可重叠的

为了很好理解这个问题,我们以一个例子进行分析,假设你的聚类问题需要得到二个簇:“喜欢詹姆斯卡梅隆电影的用户”和“不喜欢詹姆斯卡梅隆的用户”,这其实是一个排他的聚类问题,对于一个用户,他要么属于“喜欢”的簇,要么属于不喜欢的簇。但如果你的聚类问题是“喜欢詹姆斯卡梅隆电影的用户”和“喜欢里奥纳多电影的用户”,那么这个聚类问题就是一个可重叠的问题,一个用户他可以既喜欢詹姆斯卡梅隆又喜欢里奥纳多。

所以这个问题的核心是,对于一个元素,他是否可以属于聚类结果中的多个簇中,如果是,则是一个可重叠的聚类问题,如果否,那么是一个排他的聚类问题。

  • 基于层次还是基于划分

其实大部分人想到的聚类问题都是“划分”问题,就是拿到一组对象,按照一定的原则将它们分成不同的组,这是典型的划分聚类问题。但除了基于划分的聚类,还有一种在日常生活中也很常见的类型,就是基于层次的聚类问题,它的聚类结果是将这些对象分等级,在顶层将对象进行大致的分组,随后每一组再被进一步的细分,也许所有路径最终都要到达一个单独实例,这是一种“自顶向下”的层次聚类解决方法,对应的,也有“自底向上”的。其实可以简单的理解,“自顶向下”就是一步步的细化分组,而“自底向上”就是一步步的归并分组。

  • 簇数目固定的还是无限制的聚类

这个属性很好理解,就是你的聚类问题是在执行聚类算法前已经确定聚类的结果应该得到多少簇,还是根据数据本身的特征,由聚类算法选择合适的簇的数目。

  • 基于距离还是基于概率分布模型

基于距离的聚类问题应该很好理解,就是将距离近的相似的对象聚在一起。相比起来,基于概率分布模型的,可能不太好理解,那么下面给个简单的例子。

一个概率分布模型可以理解是在 N 维空间的一组点的分布,而它们的分布往往符合一定的特征,比如组成一个特定的形状。基于概率分布模型的聚类问题,就是在一组对象中,找到能符合特定分布模型的点的集合,他们不一定是距离最近的或者最相似的,而是能完美的呈现出概率分布模型所描述的模型。

下面图 1 给出了一个例子,对同样一组点集,应用不同的聚类策略,得到完全不同的聚类结果。左侧给出的结果是基于距离的,核心的原则就是将距离近的点聚在一起,右侧给出的基于概率分布模型的聚类结果,这里采用的概率分布模型是一定弧度的椭圆。图中专门标出了两个红色的点,这两点的距离很近,在基于距离的聚类中,将他们聚在一个类中,但基于概率分布模型的聚类则将它们分在不同的类中,只是为了满足特定的概率分布模型(当然这里我特意举了一个比较极端的例子)。所以我们可以看出,在基于概率分布模型的聚类方法里,核心是模型的定义,不同的模型可能导致完全不同的聚类结果。

图 1 基于距离和基于概率分布模型的聚类问题
在这里插入图片描述

3.5.3无监督算法之K-means

1.概述:

K-means聚类算法也称k均值聚类算法,是集简单和经典于一身的基于距离的聚类算法。它采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为类簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

2. 算法核心思想

K-means聚类算法是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

3. 算法实现步骤

1、首先确定一个k值,即我们希望将数据集经过聚类得到k个集合。

2、从数据集中随机选择k个数据点作为质心。

3、对数据集中每一个点,计算其与每一个质心的距离(如欧式距离),离哪个质心近,就划分到那个质心所属的集合。

4、把所有数据归好集合后,一共有k个集合。然后重新计算每个集合的质心。

5、如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),我们可以认为聚类已经达到期望的结果,算法终止。

6、如果新质心和原质心距离变化很大,需要迭代3~5步骤。

4. 算法步骤图解

在这里插入图片描述
上图a表达了初始的数据集,假设k=2。在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图d所示,新的红色质心和蓝色质心的位置已经发生了变动。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图f。

K-means术语:

簇:所有数据的点集合,簇中的对象是相似的。

质心:簇中所有点的中心(计算所有点的中心而来)

5. K-means算法优缺点

优点:

1、原理比较简单,实现也是很容易,收敛速度快。

2、当结果簇是密集的,而簇与簇之间区别明显时, 它的效果较好。

3、主要需要调参的参数仅仅是簇数k。

缺点:

1、K值需要预先给定,很多情况下K值的估计是非常困难的。

2、K-Means算法对初始选取的质心点是敏感的,不同的随机种子点得到的聚类结果完全不同 ,对结果影响很大。

3、对噪音和异常点比较的敏感。用来检测异常值。

4、采用迭代方法,可能只能得到局部的最优解,而无法得到全局的最优解。

K-means算法的使用

scikit-learn中的K-means参数说明
from sklearn.cluster import KMeans
KMeans(n_clusters=8, max_iter=300)
n_clusters:聚类个数,缺省值为8 
max_iter:执行一次k-means算法所进行的最大迭代数,缺省值为300 
K-means算法的实战
# coding: utf-8
from sklearn.cluster import KMeans
from sklearn import preprocessing
import pandas as pd
# 数据加载
data = pd.read_csv('team_cluster_data.csv', encoding='gbk')
train_x = data[["2019国际排名","2018世界杯排名","2015亚洲杯排名"]]
kmeans = KMeans(n_clusters=3)
# 规范化到 [0,1] 空间
min_max_scaler=preprocessing.MinMaxScaler()
train_x=min_max_scaler.fit_transform(train_x)
# kmeans 算法
kmeans.fit(train_x)
predict_y = kmeans.predict(train_x)
# 合并聚类结果,插入到原数据中
result = pd.concat((data,pd.DataFrame(predict_y)),axis=1)
result.rename({0:u'聚类结果'},axis=1,inplace=True)
print(result)
# 将结果导出到CSV文件中
#result.to_csv("team_cluster_result.csv")

from sklearn.mixture import GaussianMixture
model = GaussianMixture(n_components=3, covariance_type="full")
model.fit(train_x)
#result = model.predict(train_x)
predict_y = model.predict(train_x)
# 合并聚类结果,插入到原数据中
result = pd.concat((data,pd.DataFrame(predict_y)),axis=1)
result.rename({0:u'聚类结果'},axis=1,inplace=True)
print(result)
# 代码结果如下:
'''
            国家  2019国际排名  2018世界杯排名  2015亚洲杯排名  聚类结果
0       中国        73         40          7     1
1       日本        60         15          5     2
2       韩国        61         19          2     2
3       伊朗        34         18          6     2
4       沙特        67         26         10     2
5      伊拉克        91         40          4     1
6      卡塔尔       101         40         13     0
7      阿联酋        81         40          6     1
8   乌兹别克斯坦        88         40          8     1
9       泰国       122         40         17     0
10      越南       102         50         17     0
11      阿曼        87         50         12     0
12      朝鲜       110         50         14     0
13      印尼       164         50         17     0
14      澳洲        40         30          1     2
15     叙利亚        76         40         17     0
16      约旦       118         50          9     1
17     科威特       160         50         15     0
        国家  2019国际排名  2018世界杯排名  2015亚洲杯排名  聚类结果
0       中国        73         40          7     2
1       日本        60         15          5     1
2       韩国        61         19          2     1
3       伊朗        34         18          6     1
4       沙特        67         26         10     1
5      伊拉克        91         40          4     2
6      卡塔尔       101         40         13     2
7      阿联酋        81         40          6     2
8   乌兹别克斯坦        88         40          8     2
9       泰国       122         40         17     0
10      越南       102         50         17     2
11      阿曼        87         50         12     2
12      朝鲜       110         50         14     2
13      印尼       164         50         17     0
14      澳洲        40         30          1     1
15     叙利亚        76         40         17     0
16      约旦       118         50          9     2
17     科威特       160         50         15     0

'''

  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水花

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值