一、什么是用户画像?
男,31岁,已婚,收入1万以上,爱美食,团购达人,喜欢红酒配香烟。
这样一串描述即为用户画像的典型案例。如果用一句话来描述,即:用户信息标签化。
如果用一幅图来展现,即:
二、为什么需要用户画像
用户画像的核心工作是为用户打标签,打标签的重要目的之一是为了让人能够理解并且方便计算机处理,如,可以做分类统计:喜欢红酒的用户有多少?喜欢红酒的人群中,男、女比例是多少?
也可以做数据挖掘工作:利用关联规则计算,喜欢红酒的人通常喜欢什么运动品牌?利用聚类算法分析,喜欢红酒的人年龄段分布情况?
大数据处理,离不开计算机的运算,标签提供了一种便捷的方式,使得计算机能够程序化处理与人相关的信息,甚至通过算法、模型能够“理解” 人。当计算机具备这样的能力后,无论是搜索引擎、推荐引擎、广告投放等各种应用领域,都将能进一步提升精准度,提高信息获取的效率。
三、如何构建用户画像
构建用户画像的步骤:
采集数据:数据的来源有多种,很多公司有自己的CRM系统,或者有智能采集系统日志的工具,常用的采集方式包括API、SDK和传感器采集等,可以通过想要挖掘什么标签来反推需要的数据源。
数据清洗:原始数据源存在“脏数据”,包括数据空缺和噪声、不一致、重复、错误等问题,为了保证后期挖掘的准确性,避免对决策造成影响,须对原始数据进行预处理。
数据标准化:用户画像的建立需要有整合多源数据(跨屏跨媒体)的能力,例如一个实体可能使用多个设备,拥有网络世界的多个账号,则须把多个身份ID组合,建立统一的标准,才能完整标识实体的用户画像。
用户建模:通过算法模型来定义人群的用户画像,常见为分类模型和聚类模型,例如朴素贝叶斯、决策树、SVM,神经网络,k-means等。
标签挖掘:通过平台来进行标签的加工和计算,通常需要部署环境,如通过Hadoop平台进行训练和学习,大规模的并行计算。
标签验证:须通过真实case验证标签挖掘结果的正确性,保证标签对应的处理结果跟预期大体相符。此步骤有时可以跟上个步骤(标签挖掘)对调,即可以先用小样本数据验证模型的可靠性,再依照结果进行调整,再进行挖掘。
数据可视化:即视觉呈现群体或个人的用户画像,包括柱状图/饼状图/表格等,可根据实际情况选择合适的可视化方式。
5.利用Python生成用户画像
上面介绍了用户画像的相关概念、基本要素和构建步骤,下面介绍如何去完成开发,先附上效果图一张
步骤为:获取数据-->分析数据-->生成用户画像-->网站实现
获取数据:在我们的实际开发中,原始数据是通过在数据库中获取,本文为了方便通过test.txt文件读取数据;
分析数据:在该步骤中,我们需要对读取的数据进行切割,并提取关键词及计算关键词的权重,这里我们我们利用Python的一个中文分词工具jieba,如果还没安装的可以使用pip安装(安装命令为:pip install jieba);
生成用户画像:在这个步骤中,我们需要把获得关键词生成云词图,这里借用wordcloud生成云词图(如果还没安装可以通过命令pip install wordcloud进行安装)
# -*- coding: utf-8 -*-
__author__ = 'heroli'
#wordcloud生成中文词云
from wordcloud import WordCloud
import jieba
# 词频计算
import jieba.analyse as analyse
from scipy.misc import imread
import os
from os import path
import matplotlib.pyplot as plt
class WC(object):
# 绘制词云
def draw_wordcloud(self):
#读入一个txt文件
comment_text = open('static/test.txt','r').read()
#结巴分词,生成字符串,如果不通过分词,无法直接生成正确的中文词云
cut_text = " ".join(jieba.cut(comment_text))
result = jieba.analyse.textrank(cut_text, topK=1000, withWeight=True)
# 生成关键词比重字典
keywords = dict()
for i in result:
keywords[i[0]] = i[1]
d = path.dirname(__file__) # 当前文件文件夹所在目录
color_mask = imread("static/images/alice.png") # 读取背景图片
cloud = WordCloud(
#设置字体,不指定就会出现乱码
font_path="./fonts/Simfang.ttf",
# font_path=path.join(d,'simsun.ttc'),
width=200,
height=200,
#设置背景色
background_color='white',
#词云形状
mask=color_mask,
#允许最大词汇
max_words=2000,
#最大号字体
max_font_size=40
)
word_cloud = cloud.generate(cut_text)# 产生词云
word_cloud.to_file("static/images/user_img.jpg") #保存图片
# 显示词云图片
# plt.imshow(word_cloud)
# plt.axis('off')
# plt.show()
if __name__ == '__main__':
wc = WC()
wc.draw_wordcloud()
Kmeans聚类算法 python sklearn 用户画像
1、基本概念;
聚类分析简称聚类(clustering),是一个把数据集划分成子集的过程,每一个子集是一个簇(cluster),使得簇中的样本彼此相似,但与其他簇中的样本不相似。
聚类分析不需要事先知道样本的类别,甚至不用知道类别个数,因此它是一种典型的无监督学习算法,一般用于数据探索,比如群组发现和离群点检测,还可以作为其他算法的预处理步骤。
在工作中遇到用户画像、群组划分问题,而kmeans聚类这一无监督学习算法,可以在无数据标注训练情况下,基于距离按将群组划分不同的簇。
主要的聚类算法一般可以划分为以下几类:
方法:
划分方法:1.发现球形互斥的簇 2.基于距离 3.可用均值或中心点代表簇中心 4.对中小规模数据有效
层次方法:1.聚类是一个层次分解 2.不能纠正错误的合并或划分 3.可以集成其他技术
基于密度的方法:1.可以发现任意形状的簇 2.簇是对象空间中被低密度区域分隔的稠密区域 3.簇密度 4.可能过滤离群点
基于网格的方法:1.使用一种多分辨率网格数据结构 2.快速处理
2、Kmeans算法
Kmeans属于划分方法的经典聚类方法。
算法步骤如下:
选择K个点作为初始质心(随机产生或者从D中选取)
repeat
将每个点分配到最近的质心,形成K个簇
重新计算每个簇的质心
until 簇不发生变化或达到最大迭代次数2.1 k值选取
k的值是用户指定的,表示需要得到的簇的数目。在运用Kmeans算法时,我们一般不知道数据的分布情况,不可能知道数据的集群数目,所以一般通过枚举来确定k的值。另外,在实际应用中,由于Kmean一般作为数据预处理,或者用于辅助分类贴标签,所以k一般不会设置很大。
2.2 初始质心的选取
Kmeans算法对初始质心的选取比较敏感,选取不同的质心,往往会得到不同的结果。初始质心的选取方法,常用以下两种的简单方法:一种是随机选取,一种是用户指定。
需要注意的是,无论是随机选取还是用户指定,质心都尽量不要超过原始数据的边界,即质心每一维度上的值要落在原始数据集每一维度的最小与最大值之间。
2.3 距离度量方法
距离度量方法(或者说相似性度量方法)有很多种,常用的有欧氏距离,余弦相似度,街区距离,汉明距离等等。在Kmeans算法中,一般采用欧氏距离计算两个点的距离,欧氏距离如下:
举个例子,X=(1000,0.1),Y=(900,0.2),那么它们的欧氏距离就是:
举这个例子是为了说明,当原始数据中各个维度的数量级不同时,它们对结果的影响也随之不同,那些数量级太小的维度,对于结果几乎没产生任何影响。比如所举的例子中的第二个维度的0.1,0.2,与第一个维度1000的数量级相差了一万倍。
为了赋予数据每个维度同等的重要性,我们在运用欧氏距离时,必须先对数据进行规范化,比如将每个维度都缩放到[0,1]之间。
2.4 质心的计算
在Kmeans算法中,将簇中所有样本的均值作为该簇的质心。这也是Kmeans名字的由来吧。
2.5 算法停止条件
在两种情况下算法应该停止:一种是达到了指定的最大迭代次数,一种是算法已经收敛,即各个簇的质心不再发生变化。关于算法的收敛,在2.5部分讨论。
2.6 代价函数与算法收敛
Kmeans算法的代价函数比较简单,就是每个样本点与其所属质心的距离的平方和(误差平方和,Sum of Squared Error,简称SSE):
与其他机器学习算法一样,我们要最小化这个代价函数,但这个函数没有解析解,所以只能通过迭代求解的方法来逼近最优解(这一点也和众多机器学习算法一样吧)。所以你再看看算法步骤,其实就是一个迭代过程。
由于代价函数(SSE)是非凸函数,所以在运用Kmeans算法时,不能保证收敛到一个全局的最优解,我们得到的一般是一个局部的最优解。
因此,为了取得比较好的效果,一般会多跑几次算法(用不同的初始质心),得到多个局部最优解,比较它们的SSE,选取SSE最小的那个。
方法优点:
k-平均算法是解决聚类问题的一种经典算法,算法简单、快速。
对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是O(nkt),其中n是所有对象的数目,k是簇的数目,t是迭代的次数。通常k< 算法尝试找出使平方误差函数值最小的k个划分。当簇是密集的、球状或团状的,而簇与簇之间区别明显时,它的聚类效果很好。 缺点: K 是事先给定的,这个 K 值的选定是非常难以估计的; 对初值敏感,对于不同的初始值,可能会导致不同的聚类结果。一旦初始值选择的不好,可能无法得到有效的聚类结果; 该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的。 不适合于发现非凸面形状的簇,或者大小差别很大的簇; 对于”噪声”和孤立点数据敏感,少量的该类数据能够对平均值产生极大影响。 3、Kmeans算法实现 采用python实现,基于numpy、sklearn库,其中从sklearn.cluster中import KMeans。为了可视化聚类效果,对二维数据进行聚类并用matplot画出数据不同簇的划分。 #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ @author: liuweima """ from sklearn.cluster import KMeans from sklearn.externals import joblib import numpy import time import matplotlib.pyplot as plt import sys reload(sys) sys.setdefaultencoding('utf8') if __name__ == '__main__': ## step 1: 加载数据 print "step 1: load data..." dataSet = [] loss = [] fileIn = open('path') for line in fileIn.readlines(): lineArr = line.strip('\xef\xbb\xbf') # '\xef\xbb\xbf'是BOM,标识读入的文件是UTF-8编码,需strip()切掉 lineArr = lineArr.strip().split('\t') #注意自己文件中每行数据中是用什么对列数据做分割 建议先用Word 规范一下要打开的文件 dataSet.append([float(lineArr[0])/1.99759326,(float(lineArr[1])-100)/192230]) #数据规范化【0,1】 print dataSet #设定不同k值以运算 for k in range(2,10): clf = KMeans(n_clusters=k) #设定k !!!!!!!!!!这里就是调用KMeans算法 s = clf.fit(dataSet) #加载数据集合 numSamples = len(dataSet) centroids = clf.labels_ print centroids,type(centroids) #显示中心点 print clf.inertia_ #显示聚类效果 mark1 = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', ' #画出所有样例点 属于同一分类的绘制同样的颜色 for i in xrange(numSamples): #markIndex = int(clusterAssment[i, 0]) plt.plot(dataSet[i][0], dataSet[i][1], mark1[clf.labels_[i]]) #mark[markIndex]) mark2 = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '
# 画出质点,用特殊图型 centroids = clf.cluster_centers_ for i in range(k): plt.plot(centroids[i][0], centroids[i][1], mark2[i], markersize = 12) #print centroids[i, 0], centroids[i, 1] plt.show() loss.append(clf.inertia_) for m in range(8): #因为k 取值是2-9 (!不包括10) m取值是0-7 plt.plot(m,loss[m],'bo') plt.show() 质心的初始化、最大迭代次数都为默认值。 贴出,k取range(2,30)时,kmeans的误差平方和(SSE)曲线图。 为了弥补经典kmeans聚类算法的不足,出现了一些改进型kmeans 比如二分Kmeans算法(bisectingKmeans)是为了克服Kmeans算法收敛于局部最小值的问题而提出的。 该算法首先将所有点作为一个簇,然后将该簇一分为二。之后选择其中一个簇继续划分,选择哪一个簇进行划分 取决于对其划分是否可以最大程度降低SSE的值,上述过程不断迭代,直到得到用户指定的簇数目为止。 或者先使用MeanShift算法自动生成k值删除游离点。 一个标签通常是人为规定的高度精炼的特征标识,如年龄段标签:25~35岁,地域标签:北京,标签呈现出两个重要特征:语义化,人能很方便地理解每个标签含义。这也使得用户画像模型具备实际意义。能够较好的满足业务需求。如,判断用户偏好。短文本,每个标签通常只表示一种含义,标签本身无需再做过多文本分析等预处理工作,这为利用机器提取标准化信息提供了便利。 人制定标签规则,并能够通过标签快速读出其中的信息,机器方便做标签提取、聚合分析。所以,用户画像,即:用户标签,向我们展示了一种朴素、简洁的方法用于描述用户信息。 1.数据源分析:静态信息数据(用户相对稳定的信息,如图所示,主要包括人口属性、商业属性等方面数据。这类信息,自成标签,如果企业有真实信息则无需过多建模预测,更多的是数据清洗工作)、动态信息数据,(用户不断变化的行为信息,如果存在上帝,每一个人的行为都在时刻被上帝那双无形的眼睛监控着,广义上讲,一个用户打开网页,买了一个杯子;与该用户傍晚溜了趟狗,白天取了一次钱,打了一个哈欠等等一样都是上帝眼中的用户行为。当行为集中到互联网,乃至电商,用户行为就会聚焦很多,如上图所示:浏览凡客首页、浏览休闲鞋单品页、搜索帆布鞋、发表关于鞋品质的微博、赞“双十一大促给力”的微博消息。等等均可看作互联网用户行为。在互联网上,用户行为,可以看作用户动态信息的唯一数据来源。如何对用户行为数据构建数据模型,分析出用户标签,将是本文着重介绍的内容。) 2.目标分析:用户画像的目标是通过分析用户行为,最终为每个用户打上标签,以及该标签的权重。如,红酒 0.8、李宁 0.6。 标签,表征了内容,用户对该内容有兴趣、偏好、需求等等。 权重,表征了指数,用户的兴趣、偏好指数,也可能表征用户的需求度,可以简单的理解为可信度,概率。 3.数据建模方法: 如何根据用户行为,构建模型产出标签、权重。一个事件模型包括:时间、地点、人物三个要素。每一次用户行为本质上是一次随机事件,可以详细描述为:什么用户,在什么时间,什么地点,做了什么事。 1、定性与定量相结合的研究方法 定性化研究方法就是确定事物的性质,是描述性的;定量化研究方法就是确定对象数量特征、数量关系和数量变化,是可量化的。 一般来说,定性的方法,在用户画像中,表现为对产品、行为、用户个体的性质和特征作出概括,形成对应的产品标签、行为标签、用户标签。 定量的方法,则是在定性的基础上,给每一个标签打上特定的权重,最后通过数学公式计算得出总的标签权重,从而形成完整的用户模型。 所以说,用户画像的数据建模是定性与定量的结合。 2、数据建模——给标签加上权重 给用户的行为标签赋予权重。 用户的行为,我们可以用4w表示: WHO(谁);WHEN(什么时候);WHERE(在哪里);WHAT(做了什么),具体分析如下: WHO(谁):定义用户,明确我们的研究对象。主要是用于做用户分类,划分用户群体。网络上的用户识别,包括但不仅限于用户注册的ID、昵称、手机号、邮箱、身份证、微信微博号等等。 WHEN(时间):这里的时间包含了时间跨度和时间长度两个方面。“时间跨度”是以天为单位计算的时长,指某行为发生到现在间隔了多长时间;“时间长度”则为了标识用户在某一页面的停留时间长短。 越早发生的行为标签权重越小,越近期权重越大,这就是所谓的“时间衰减因子”。 WHERE(在哪里):就是指用户发生行为的接触点,里面包含有内容+网址。内容是指用户作用于的对象标签,比如小米手机;网址则指用户行为发生的具体地点,比如小米官方网站。权重是加在网址标签上的,比如买小米手机,在小米官网买权重计为1,,在京东买计为0.8,在淘宝买计为0.7。 WHAT(做了什么):就是指的用户发生了怎样的行为,根据行为的深入程度添加权重。比如,用户购买了权重计为1,用户收藏了计为0.85,用户仅仅是浏览了计为0.7。 当上面的单个标签权重确定下来后,就可以利用标签权重公式计算总的用户标签权重: 标签权重=时间衰减因子×行为权重×网址权重 举个栗子:A用户今天在小米官网购买了小米手机;B用户七天前在京东浏览了小米手机。 由此得出单个用户的标签权重,打上“是否忠诚”的标签。 通过这种方式对多个用户进行数据建模,就能够更广的覆盖目标用户群,为他们都打上标签,然后按照标签分类:总权重达到0.9以上的被归为忠实用户,ta们都购买了该产品……。这样的一来,企业和商家就能够根据相关信息进行更加精准的营销推广、个性化推荐。 用户画像 1.什么是用户画像? 交互设计之父AlanCooper最早提出了用户画像(persona)的概念,认为“用户画像是真实用户的虚拟代表,是建立在一系列真实数据之上的目标用户模型”。通过对用户多方面的信息的了解,将多种信息集合在一起并形成在一定类型上的独特的特征与气质,这就形成了用户的独特的“画像”。看下图会更加直接☟☟☟☟ 2.为什么要用用户画像? 目前用户画像主要应用于商业领域,其核心工作是为用户打标签,打标签的目的之一是为了让人能够理解并且最重要的是方便计算机处理。标签提供了一种便捷的方式,使得计算机能够程序化处理与人相关的信息,甚至通过算法、模型能够“理解”人。当计算机具备这样的能力后,无论是搜索引擎、推荐引擎、广告投放等各种应用领域,都将能进一步提升精准度,提高信息获取的效率。通过对人群基本属性、行为习惯、商业价值等多种维度信息数据综合分析,精准的进行目标受众的画像和定位,能够实现基于大数据的精准营销,这也就是用户画像的用处所在了。 3.如何实现用户画像? 一个标签通常是人为规定的高度精炼的特征标识,如年龄段标签:25~35岁,地域标签:北京,标签呈现出两个重要特征(看下图): 人为制定标签规则,并能够通过标签快速读出其中的信息,机器方便做标签提取、聚合分析。所以,用户画像,也称用户标签,为我们提供了一种简洁的方式去描述用户信息。 懂得了如何处理用户信息之后,接下来如何实现用户画像呢?首先我们需明确我们的画像方向,例如:影迷偏好、消费者能力等等,人工设计画像的方向,可方便后面的数据采集以及模型构建。详细请看下图: 主要的思路就是: 用户微观画像的建立→用户画像的标签建模→用户画像的数据架构 4.标签与用户画像的联系 提了这么久的标签,那么标签和用户画像到底是什么关系呢?简单来说,它们是整体和局部的关系,用户画像是整体,标签是局部,这种关系通过“标签体系”体现。整体和局部总包含两方面的关系: (1)化整为零:整体如何反映在局部; (2)化零为整:局部如何组成整体。 举例来说:“人有一双眼睛一个鼻子”,那么: (1)化整为零:对每个人都应该观察到一双眼睛和一个鼻子; (2)化零为整:只有位置合适的一双眼睛和一个鼻子我们才认为他是一个人。 标签建模是用户画像中核心的一块: 5.用户画像如何进行验证? 用户画像的验证主要是以下两个方面: (1)标签打得准不准 (2)标签打得全不全 但目前的重点还是放在准确性的验证上~ 6.用户画像中对基本属性的预测方式 懂得了理论之后,当然不仅仅纸上谈兵,用到实处才是硬道理~用户画像目前采用机器学习模型+少量的人工规则来实现的~ 那么接下来我将迈出用户画像建模的一小步,使用GBDT算法(前一篇博客有所提及)来实现对性别这个基本属性的预测。 主要分为以下几个步骤: (1)训练和测试语料准备 (2)特征选择与特征权重计算 (3)线下模型训练与测试 (4)线下效果评估 (5)线上应用 (6)线上效果评估 具体的操作如下: 安装xgboost-Python(xgboost是GBDT算法的实现,适合用于大量数据处理中,在前一篇博客也有所提及)