用户画像

目标:通过用户给商品的打标签记录,建立用户画像(显示打标签、亦可为隐式评分:点击率等)

# 使用SimpleTagBased、NormTagBased、TagBased-TFIDF算法对Delicious2K数据进行推荐
# 原始数据集:https://grouplens.org/datasets/hetrec-2011/
# 数据格式:userID     bookmarkID     tagID     timestamp

用户画像的准则

  1. 统一标识: 用户唯一标识是整个用户画像的核心
  2. 给用户打标签:用户标签的4个维度
  3. 基于标签指导业务(标签赋能):业务赋能的3个阶段

用户标签的建立

一、数据初步分析层(一级标签):

首先,需要将用户的数据进行分类,打上一级标签,这涉及到四个维度:
八字原则:用户消费行为分析

  1. 用户标签:性别、年龄、地域、收入、学历、职业等
  2. 消费标签:消费习惯、购买意向、是否对促销敏感
  3. 行为标签:时间段、频次、时长、收藏、点击、喜欢、评分
    (User Behavior可以分成Explicit Behavior显式行为和Implicit Behavior隐式行为)
  4. 内容分析:对用户平时浏览的内容进行分析,比如体育、游戏、八卦

二、算法层(二级标签):

在初步分析基础上,对用户进行聚类分析、标签算法、关联算法的分析,为用户打上二级标签:
用户画像建立、Item特性、产品购买偏好、用户关联关系、热门商品、热门话题支付行为偏好、优惠偏好

三、预测算法层(三级标签):

基于上述两层标签的预测标签:如购买某项产品的预测,用户流失预测等。

标签赋能

为用户建立用户画像后,标签的赋能(对业务的指导)分为用户生命周期(LTV)的三个阶段:获客、粘客、留客。

  1. 获客:如何进行拉新,通过更精准的营销获取客户。 由于前期获客阶段用户的标签不够充分,因此分为两个维度: 用户维度(User)与商品维度(Item)。

1 .商品维度:对本产品中的热门商品(已完善的商品体系)、特色商品(新开发的商品体系)进行广告推荐;
基于商品特色,针对性的向潜在用户群体投放广告,将用户的广告点击行为打上新的标签。
2.用户维度:基于用户已有的标签,推荐相应适合的商品,并根据其点击行为等更新其标签。

  1. 粘客:个性化推荐,搜索排序,场景运营等。对于使用中的客户,拥有充分的标签,因此需要对其进行更加个性化的推荐。以保证其对本商品的粘性。这其中涉及到 协同过滤以及推荐系统的EE问题
  1. 协同过滤算法:通过将与此人相似人群喜欢的事物,对此人进行推荐,实现推荐算法。
  2. EE问题(Explore and Exploit):充分利用已有资源的前提下,针对产品的用户人群推送其他新的未购买过的商品(关联算法),以产生新鲜感。
  1. 留客: 流失率预测,分析关键节点降低流失率。

SimpleTagBased算法

  1. 统计每个用户的常用标签
  2. 对每个标签,统计被打过这个标签次数最多的商品(item−tags[t,i])(item-tags[t,i])(item−tags[t,i])
  3. 对于一个用户,找到他常用的标签,然后找到具有这些标签的最热门物品推荐给他
  4. 用户 uuu 对 商品 iii 的兴趣得分为:
    Score(u,i)=∑tuser−tags[u,t]⋅item−tags[t,i]Score(u, i) = \sum_t{user-tags[u,t] \cdot item-tags[t,i]}Score(u,i)=t∑​user−tags[u,t]⋅item−tags[t,i]
    (user−tags[u,t])(user-tags[u,t])(user−tags[u,t]) 用户 uuu 使用过标签 ttt 的次数
    item−tags[t,i]item-tags[t,i]item−tags[t,i]商品 iii 被打上标签 ttt 的次数

数据结构定义:
用户打标签记录:records[i] = {user, item, tag}
用户 u 打过标签 t 的数量:user_tags[u][t]
用户 u 给商品 i 打过的标签数量:user_items[u][i]
打上 tag 标签的商品的数量:tag_items[t][i]
tag 标签使用过的用户数量:tag_users[t][u]

数据加载

import pandas as pd
import random
from collections import defaultdict#直接传入会出错
def defaultdict_list():return defaultdict(list)
#创建一个默认字典
records = defaultdict(defaultdict_list)#加载数据
def load_data():#如何加载 dat 格式文件data = pd.read_csv('user_taggedbookmarks-timestamps.dat', sep = '\t')for i in range(data.shape[0]):records[data.iloc[i, 0]][data.iloc[i, 1]].append(data.iloc[i, 2])print('共加载{}条数据'.format(data.shape[0]))print('总计{}人'.format(len(records)))%time load_data()

数据切分

由于random的生成是均匀分布,因此大样本情况下,满足均匀分布特性。

# 将数据集拆分为训练集和测试集
test_data = {}
train_data = {}def train_test_split(ratio, seed=100):count = 0random.seed(seed)for u in records.keys():for i in records[u].keys():# ratio比例设置为测试集if random.random()<ratio:test_data.setdefault(u,{})test_data[u].setdefault(i,[])for t in records[u][i]:test_data[u][i].append(t)count += 1else:train_data.setdefault(u,{})train_data[u].setdefault(i,[])for t in records[u][i]:train_data[u][i].append(t)  print('切分比例:{}'.format(count / 437593))                print("训练集用户数 {}, 测试集用户数 {}" .format(len(train_data),len(test_data)))train_test_split(0.2)

数据结构 “user_tags; user_items; tag_items; tag_users” 初始化

#初始化users-items;users-tags;items-tags矩阵
# 设置矩阵 mat[index, item] = 1
user_tags = {}
user_items = {}
tag_items = {}
tag_users = {}
def addValueToMat(mat, index, item, value=1):if index not in mat:mat.setdefault(index,{})mat[index].setdefault(item,value)else:if item not in mat[index]:mat[index][item] = valueelse:mat[index][item] += value# 使用训练集,初始化user_tags, tag_items, user_items
def initStat():records=train_datafor 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)#标签和用户的关系addValueToMat(tag_users, tag, u, 1)print("user_tags, tag_items, user_items, tag_users初始化完成.")print("user_tags大小 %d, tag_items大小 %d, user_items大小 %d, tag_users大小 %d" % (len(user_tags), len(tag_items), len(user_items), len(tag_users)))initStat()

基于SimpleTagBased算法的TOP-N推荐

import operator
# 对用户user推荐Top-N
def simple_recommend(user, N):recommend_items = dict()# 对Item进行打分,分数为所有的(用户对某标签使用的次数 wut, 乘以 商品被打上相同标签的次数 wti)之和tagged_items = user_items[user]for tag, wut in user_tags[user].items():#print(self.user_tags[user].items())for item, wti in tag_items[tag].items():#用户标记过的商品不需要再计算分数if item in tagged_items:continue#print('wut = %s, wti = %s' %(wut, wti))if item not in recommend_items:recommend_items[item] = wut * wtielse:recommend_items[item] = recommend_items[item] + wut * wtireturn  sorted(recommend_items.items(), key = operator.itemgetter(1), reverse=True)[0:N]
# 使用测试集,计算准确率和召回率
def simple_precisionAndRecall(N):hit = 0h_recall = 0h_precision = 0for user,items in test_data.items():#没有标签的用户无法推荐if user not in train_data:continue# 获取Top-N推荐列表rank = simple_recommend(user, N)
#         print(rank)for item,rui in rank:if item in items:hit = hit + 1h_recall = h_recall + len(items)h_precision = h_precision + N#print('一共命中 %d 个, 一共推荐 %d 个, 用户设置tag总数 %d 个' %(hit, h_precision, h_recall))# 返回准确率 和 召回率return (hit/(h_precision*1.0)), (hit/(h_recall*1.0))# 使用测试集,对推荐结果进行评估
def simple_testRecommend():print("推荐结果评估")print("%3s %10s %10s" % ('N',"精确率",'召回率'))for n in [5,10,20,40,60,80,100]:precision,recall = simple_precisionAndRecall(n)print("%3d %10.3f%% %10.3f%%" % (n, precision * 100, recall * 100))

改进:基于NormTagBased算法与 TF-IDFBased算法 的TOP-N推荐

由于 SimpleTagBased 使用的方法

  1. 未考虑用户总的打标签总数量,无法看出对此标签的具体喜好程度
  2. 未考虑一个商品总的被打标签的数量,无法看出商品对此标签的适合程度

因此使用 NormTagsBased 做标准化处理:
Score(u,i)=∑tuser−tags[u,t]⋅item−tags[t,i]user−tags[user]⋅tag−users[tag]Score(u, i) =\sum_t \frac{user-tags[u,t] \cdot item-tags[t,i]}{user-tags[user] \cdot tag-users[tag]} Score(u,i)=t∑​user−tags[user]⋅tag−users[tag]user−tags[u,t]⋅item−tags[t,i]​
user−tags[user]user-tags[user]user−tags[user] 表示一个用户使用的标签总类别数量;
tag−users[tag]tag-users[tag]tag−users[tag] 表示一个标签 tag 总的用户个数。

由于 user−tags[u,t]user-tags[u,t]user−tags[u,t] 表示一个用户使用某 tag 的数量,若该标签热门,那么可能使用的数量就会越多,因此借助TF-IDF的思想,使用:
log(1+(user−tags[user]))log(1 + (user-tags[user]))log(1+(user−tags[user])) 对公式进行处理。
Score(u,i)=∑tuser−tags[u,t]⋅item−tags[t,i]log(1+(user−tags[user]))Score(u, i) =\sum_t \frac{user-tags[u,t] \cdot item-tags[t,i]}{log(1 + (user-tags[user]))} Score(u,i)=t∑​log(1+(user−tags[user]))user−tags[u,t]⋅item−tags[t,i]​

import operator
import numpy#标准化:使用 user_tags[user],用户打过的标签类别 总数;
#tag_users[tag], 使用标签 tag 的用户个数:
#写在前面以减少运行时间
# user_tags_class_counts --->> utcc
utcc = dict()
for user in user_tags.keys():utcc[user] = len(user_tags[user])
# tag_users_class_counts --->> tucc
tucc = dict()
for tag in tag_users.keys():tucc[tag] = len(tag_users[tag])# 对用户user推荐Top-N
def improve_recommend(method, user, N):recommend_items = dict()# 对Item进行打分,分数为所有的(用户对某标签使用的次数 wut, 乘以 商品被打上相同标签的次数 wti)之和#该用户已打分的itemstagged_items = user_items[user]for tag, wut in user_tags[user].items():#print(self.user_tags[user].items())for item, wti in tag_items[tag].items():#用户标记过的商品不需要进行推荐if item in tagged_items:continue#改进算子类型norm = utcc[user] * tucc[tag]tf_idf = numpy.log(1 + tucc[tag])way = 0if method == 'norm': way = normif method == 'tf_idf': way = tf_idf#print('wut = %s, wti = %s' %(wut, wti))if item not in recommend_items:recommend_items[item] = wut * wti / wayelse:recommend_items[item] = recommend_items[item] + wut * wti / wayreturn  sorted(recommend_items.items(), key = operator.itemgetter(1), reverse=True)[0:N]
# 使用测试集,计算准确率和召回率
def precisionAndRecall(method, N):hit = 0h_recall = 0h_precision = 0for user,items in test_data.items():#未训练过的用户无法进行推荐if user not in train_data:continue# 获取Top-N推荐列表rank = improve_recommend(method, user, N)for item,rui in rank:if item in items:hit = hit + 1h_recall = h_recall + len(items)h_precision = h_precision + N#print('一共命中 %d 个, 一共推荐 %d 个, 用户设置tag总数 %d 个' %(hit, h_precision, h_recall))# 返回准确率 和 召回率return (hit/(h_precision*1.0)), (hit/(h_recall*1.0))# 使用测试集,对推荐结果进行评估
def testRecommend(method = str()):print("{}based 算子推荐结果评估:".format(method))print("%3s %10s %10s" % ('N',"精确率",'召回率'))for n in [5,10,20,40,60,80,100]:precision,recall = precisionAndRecall(method, n)print("%3d %10.3f%% %10.3f%%" % (n, precision * 100, recall * 100))


通过对用户画像:user_tags; user_items 的建立,对用户进行个性化推荐。可以看到标准化后的结果有着显著的提高。

Project 4:用户画像的建立相关推荐

  1. 用户画像的建立方法和流程,一篇教会你

    用户画像(Personas)这一概念最初是由交互设计之父Alan Cooper提出的,如图1所示.互联网中的用户画像是通过多个角度,从用户行为数据中提取某个产品的使用者的共同特征,通过比对和抽取特征来 ...

  2. 手把手教你建立用户画像和用户场景

    作者:晨光文具互联网产品经理 (转载已取得授权) 通常在产品设计过程中会遇到一个问题,你的产品适用于什么样的用户,什么样的场景.简而言之就是什么样的用户在什么场景下使用你的产品.这也是产品经理设计产品 ...

  3. 如何建立用户画像和用户体系?

    消费品企业应该如何使用内部产生以及外部采集的数据,像互联网公司一样建立用户画像与会员体系,以数据驱动的方式进行精细化的生产,运营和销售? 传统的管理咨询公司,虽然有无数顶尖的大脑,但是他们的大脑只靠E ...

  4. 【用户画像】用户画像简介、用户画像的架构、搭建用户画像管理平台

    文章目录 一 用户画像简介 1 用户画像 2 定位 2 应用 3 用户标签 (1)标签分级 (2)标签分类 二 用户画像的架构 1 画像处理流程 2 画像标签数据应用 3 用户画像管理平台 三 搭建用 ...

  5. 大数据时代,如何构建精准用户画像,直击精细化运营

    移动互联网时代,精细化运营逐渐成为企业发展的重要竞争力,"用户画像"的概念也应运而生.用户画像是指,在大数据时代,企业通过对海量数据信息进行清洗.聚类.分析,将数据抽象成标签,再利 ...

  6. 个推用户画像的实践与应用

    "以用户为核心"的概念在互联网时代深入人心,然而要真正了解用户懂得用户,就不得不提到"用户画像". 随着大数据技术的深入研究与应用,借助用户画像,企业或APP可 ...

  7. 神策数据王琛:用户画像实践之神策标签生产引擎架构

    导读:用户画像是建立在数据基础之上的用户模型,是产品改进.精准营销等业务场景中不可或缺的重要基础.而构建用户画像的过程就是要给用户打上各种维度的标签,并基于标签进行定性或定量分析.这其中,建设灵活.全 ...

  8. bootstrap-table真实交互数据_博思远略:基于AI交互场景数据构建用户画像的几点思考...

    什么是用户,就是那些藏在每台电脑.手机.pad.智能watch屏幕背后的使用产品或服务恰如你我--有血有肉.有情绪.有想法.有阅历.有逻辑.有思考.固守某种习惯且独一无二.形形色色的人. 用户画像本质 ...

  9. 深度学习 用户画像_一文告诉你什么是用户画像

    什么是用户画像 用户画像,英文又叫 User Profile,我们经常看到在 PPT 中展现出高大上的用户画像,展现的方式是采用标签云的方式绘制一个人的形状,或者在一个人物形象旁边列出若干人口统计学属 ...

  10. 什么叫大数据人物画像_大数据时代,如何构建精准用户画像,直击精细化运营...

    移动互联网时代,精细化运营逐渐成为企业发展的重要竞争力,"用户画像"的概念也应运而生.用户画像是指,在大数据时代,企业通过对海量数据信息进行清洗.聚类.分析,将数据抽象成标签,再利 ...

最新文章

  1. php symfony框架,PHP-Symfony2全栈框架的停用组件
  2. JS详细入门教程(上)
  3. mysql数据库blob换行_mysql Blob存取的一个简单例子
  4. YouTube测试购物功能、 2021 最值得效力的科技公司榜单、2020 移动应用年度报告等|Decode the Week...
  5. JFace中TableViewer的使用
  6. contentsiz contentoffset contentInset的区别
  7. html5小说阅读器源码,文本源码阅读器(NexusTextView)
  8. DXGI高帧率屏幕录像软件源码解析(声音捕获,抓屏,ffmpeg录像,MP4录像,flv录像,麦克风采集)(第4篇编码,录像部分)
  9. [异步图书].精通Python自然语言处理 pdf
  10. 迈高图手机版_迈高图地图数据下载器
  11. oracle 定时任务
  12. android手机微信收藏功能实现,微信小程序实现收藏功能
  13. border-color属性设置单边边框和综合四边边框颜色
  14. JAVA圆和正方形组合图形_关于java:图形数据流组合框架
  15. python函数定义时缩进的作用_定义函数时,函数体的正确缩进为?_学小易找答案
  16. java 版剑指offer算法集锦
  17. 计算机网络ping本机ip,使用ping命令检查本机的TCP / IP协议
  18. MAC使用技巧之苹果电脑新手最容易犯的20个错误
  19. 车势科技发力汽车VR,继阿里BUY+之后再现VR购物挑战者
  20. 组合计数——车的放置(逆元)+数三角形+序列统计(lucas定理)

热门文章

  1. Xamarin学习笔记
  2. 计算机打印服务总是自动关闭,打印机服务怎么使用 打印机服务自动关闭怎么解决...
  3. Quartus波形仿真教程
  4. C语言———求”完数“
  5. 普林斯顿微积分读本小记(未完待续)
  6. 《普林斯顿微积分》读书笔记
  7. P2525 Uim的情人节礼物·其之壱 prev_permutaion
  8. 使用allegro画PCB的基本流程:
  9. CMOS模拟集成电路版图设计课程
  10. arial unicode ms字体_(05)CSS 给文本加样式: 字体属性 | CSS