推荐系统根据用户的历史行为分析用户的兴趣,再根据兴趣为用户推荐项目。然而,在推荐系统运作过程中,新用户与新项目会源源不断地出现。由于这部分用户与项目没有历史评分信息,系统无法有效推断新用户的兴趣与新项目的受欢迎度,这种涉及新用户和新项目推荐的问题成为冷启动推荐问题。
本文首先介绍冷启动的基本概念,并通过冷启动实际案例来说明如何解决新用户或新项目的冷启动问题。
01
什么是冷启动
推荐系统的主要目标是将大量的物品推荐给可能喜欢的用户, 这里就涉及物品和用户两类对象,任何平台,物品和用户都是不断增长变化的,所以一定会频繁的面对新的物品和新的用户, 推荐系统冷启动问题指的就是对于新注册的用户或者新入库的物品,如何给新用户推荐物品让用户满意,以及如何将新物品推荐给喜欢它的用户。
另外,如果是新开发的平台,初期用户很少,用户行为也不多,常用的协同过滤、深度学习等依赖大量用户行为的算法不能很好的训练出精准的推荐模型,怎么让推荐系统很好的运转起来,让推荐变得越来越准确,这个问题就是系统冷启动。
总之,推荐系统冷启动主要分为物品冷启动、用户冷启动和系统冷启动三大类。
用户冷启动:主要解决如何给系统的新用户做个性化推荐的问题,当新用户到来时,我们没有新客户的行为数据,所以无法根据新客户的历史行为预测其兴趣爱好,也就无法提供个性化推荐。
物品冷启动:当一个系统中出现了新的物品时,我们需要向用户推荐这个物品,然而系统中并没有关于该物品的任何信息,用户无法感知新产品的存在,这就给推荐系统的推荐带来一定的麻烦。
系统冷启动:主要解决如何在一个新开发的平台(网站或App)上设计个性化推荐,从而在产品刚上线时就让用户体验到个性化推荐服务。
02
解决冷启动的方案
一、 客户冷启动
(1)利用用户注册信息
很多产品在新用户注册时是需要用户填写一些信息的,这些用户注册时填的信息就可以作为为用户提供推荐的指导。典型的比如相亲网站,需要填写自己的相关信息,填的信息越完善代表越真诚,这些完善的信息就是产品为你推荐相亲对象的素材。
(2)利用社交关系推荐
有些APP,用户在注册时要求导入社交关系,比如手机通讯录,这时可以将你的好友喜欢的标的物推荐给你。利用社交信息来做冷启动,特别是在有社交属性的产品中,这是很常见的一种方法。社交推荐最大的好处是用户基本不会反感推荐的标的物,所谓人以类聚,你的好友喜欢的东西你也可能会喜欢。
(3)利用用户填写的兴趣点
还有一些APP,强制需要用户在注册时提供你的兴趣点,有了这些兴趣点就可以为你推荐你喜欢的内容了。通过该方法可以很精准的识别用户的兴趣,对用户兴趣把握相对准确。这是一个较好的冷启动方案,但是要注意不能让用户填写太多内容,用户操作也要非常简单,占用用户太多时间,操作太复杂,用户可能就会流失。
(4)Top-N产品推荐
解决用户冷启动问题的另一个方法是在新用户第一次访问推荐系统时,不立即给用户展示推荐结果,而是给用户提供一些物品,让用户反馈他们对这些物品的兴趣,然后根据用户反馈给提供个性化推荐。
在各种不同的业务场景中,经常使用的方案是推荐比较热门的产品,即Top-N产品推荐,如何定义“热门”,可能是最近一段时间产品的访问次数、交易次数、交易规模,又或者是电话询问次数等等,可以根据具体场景自主选择。
(5)新产品推荐
可以利用新的标的物作为推荐,人都是有喜新厌旧倾向的,推荐新的东西肯定能抓住用户的眼球(比如视频行业推荐新上映的大片)。推荐热门标的物, 由于这些标的物是热点,同时人是有从众效应的,大家都在看的,新用户喜欢的可能性比较大。
二、物品冷启动
(1)采用快速试探策略
将新标的物曝光给随机一批用户,观察用户对标的物的反馈,找到对该标的物有正向反馈(观看,购买,收藏,分享等)的用户, 后续将该标的物推荐给有正向反馈的用户或者与该用户相似的用户。
该方法特别适合像淘宝这种提供平台的电商公司以及像今日头条、快手、阅文等UGC平台公司,他们需要维护第三方生态的繁荣,所以需要将第三方新生产的标的物尽可能的推荐出去,让第三方有利可图。同时通过该方式也可以快速知道哪些新的标的物是大受用户欢迎的,找到这些标的物,也可以提升自己平台的营收。
(2)利用相似的物品进行推荐
对于新加入的物品,可以利用物品的内容信息,计算其与其他物品的相似度,基本思路就是将物品转换成关键词向量,通过计算向量之间的相似度(例如计算余弦相似度),得到物品的相关程度,根据相似度,将它们推荐给喜欢过和它们相似物品的用户,这就用到了基于项目的协同过滤算法,具体实现方案,可以参考第三章的内容。
三、系统冷启动
很多系统在建立的时候,既没有用户的行为数据,也没有充足的物品内容信息来计算物品相似度。这种情况下,很多系统都利用专家进行标注,代表系统有个性化网络电台Pandora和电影推荐网站Jinni。
以Pandora电台为例,Pandora雇用了一批音乐人对几万名歌手的歌曲进行各个维度的标注,最终选定了400多个特征,每首歌都可以标识为一个400维的向量,然后通过常见的向量相似度算法计算出歌曲的相似度。
03
冷启动实际案例
上一节中给出了各种常见的冷启动方案,针对不同的业务场景,所选择的方案不尽相同。综合考虑如上方案,其具体技术实现难度均较为简单,本节将通过两个案例,来说明如何解决冷启动问题。
一、热门推荐案例
当一个客户刚刚注册时,因为没有该用户的历史记录,所以,一个最基本的方法是应用基于人气的策略,即推荐最受欢迎的产品。
本案例中我们使用最简单的数据,数据集中有7名用户对不同书籍的评分,评分为1至5分,首先我们导入数据,代码如下所示。
import pandas as pd
dataset={'Tom': {'Python数据分析': 5,'人工智能概论': 3,
'SAS数据挖掘': 3,'Tensorflow入门': 3,'机器学习导论': 2,
'python数据化运营': 3},
'Abby': {'Python数据分析': 5,'人工智能概论':
3,'Tensorflow入门': 5,'SAS数据挖掘':5,'概率与统计': 3,
'机器学习导论': 3},
'Coco': {'大数据分析': 2,'SAS数据挖掘': 5,'Tensorflow入门': 3,
'概率与统计': 4},
'Kate': {'SAS数据挖掘': 5,'大数据分析': 4,'Tensorflow入门': 4,},
'Judy': {'Python数据分析': 4,'人工智能概论': 4,'SAS数据挖掘': 4,
'概率与统计': 3,'机器学习导论': 2},
'Lucy': {'Python数据分析': 3,'SAS数据挖掘': 4,'概率与统计': 3,
'Tensorflow入门': 5,'机器学习导论': 3},
'Wendy': {'SAS数据挖掘':4,'机器学习导论':1,'Tensorflow入门':4}}
接着,我们计算书籍清单,代码如下所示。
booklist = [book for person,data in dataset.items() for book in data.keys()]
a=set(booklist)
book_unique_lst=list(a)
book_unique_lst.sort()
book_unique_lst
运行上述程序,结果如下所示,总计有8本书籍。
['Python数据分析',
'SAS数据挖掘',
'Tensorflow入门',
'python数据化运营',
'人工智能概论',
'大数据分析',
'机器学习导论',
'概率与统计']
进一步,我们计算每本书的评分次数以及加权评分数,代码如下所示。
# 获取所有用户的评分数据
trending_list = [(i,j) for person,
data in dataset.items() for i,j in data.items()]
# 初始化书籍book的评分list
movies_rating = []
# 用于存放每本书的评分用户数
watching_list = []
#计算每本书的平均加权评分
#对每本书进行循环计算
for i in book_unique_lst:
rating = 0 #初始化评分
no_of_users = 0#初始化客户数
for m,r in trending_list:
if m == i:
rating += r #汇总评分
no_of_users +=1 #计算评分的客户数
#打印出每本书的评分客户数
watching_list.append((no_of_users," users watched:: ",i))
#计算每本书的加权评分
books_rating.append(((rating/no_of_users),i))
#根据加权评分进行排序
books_rating.sort(reverse=True)
print(books_rating, '\n')
print(watching_list)
运行上述程序,结果如下所示,评分最高的书籍为SAS数据挖掘,其评分为4.2857,评分最低的书籍为机器学习导论,其评分为2.2。
#每本书的加权评分结果
[(4.285714285714286, 'SAS数据挖掘'),
(4.25, 'Python数据分析'),
(4.0, 'Tensorflow入门'),
(3.3333333333333335, '人工智能概论'),
(3.25, '概率与统计'),
(3.0, '大数据分析'),
(3.0, 'python数据化运营'),
(2.2, '机器学习导论')]
#每本书的评分人数
[(4, ' users watched:: ', 'Python数据分析'),
(7, ' users watched:: ', 'SAS数据挖掘'),
(6, ' users watched:: ', 'Tensorflow入门'),
(1, ' users watched:: ', 'python数据化运营'),
(3, ' users watched:: ', '人工智能概论'),
(2, ' users watched:: ', '大数据分析'),
(5, ' users watched:: ', '机器学习导论'),
(4, ' users watched:: ', '概率与统计')]
由于新用户没有任何历史信息,所以,可以直接用books_rating的结果数据进行推荐,比如新进的用户名为Anna,则可以直接调用加权评分数据进行推荐,具体代码如下所示。
print("Enter the username")
string = input()
if string not in dataset.keys():
message = "New User Recommendation:Popular Books"
print(message)
for r,m in books_rating:
print(m," rating --->",r)
else:
print("This recommedation is for only new users")
运行上述程序,结果如下所示。
Enter the username
Anna
New User Recommendation:Popular Books
SAS数据挖掘 rating ---> 4.285714285714286
Python数据分析 rating ---> 4.25
Tensorflow入门 rating ---> 4.0
人工智能概论 rating ---> 3.3333333333333335
概率与统计 rating ---> 3.25
大数据分析 rating ---> 3.0
python数据化运营 rating ---> 3.0
机器学习导论 rating ---> 2.2
二、根据用户注册等信息进行推荐
本案例中我们使用基本的用户注册信息数据来对新客户进行产品推荐,首先导入数据集OldUserInfo和NewUserInfo,具体代码如下所示。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#获取数据
olduser_train=pd.read_csv("D:/ReSystem/Data/chapter10/
OldUserInfo.csv")
newuser_test=pd.read_csv("D:/ReSystem/Data/chapter10/
NewUserInfo.csv")
olduser_train.head()
newuser_test.head()
运行上述程序,结果如图1和图2,分别展示了2个数据集的前5个样本,其中数据集OldUserInfo包含4个变量,分别为userid(用户id)、age(用户年龄)、LogonCount(截止建模时间的登陆APP次数)与y(目标变量),其中y变量表示用户是否购买了产品A,数据集NewUserInfo包含3个变量,由于此数据集为新客户的信息,尚无购买产品A的记录,这里主要是为了说明问题,真实情况下用户的注册信息可能更多。
图1 数据集olduser_train的前5个样本
图2 数据集newuser_test的前5个样本
接着,我们查看两个数据集的基本信息,代码如下。
print('数据集olduser_train的基本信息:')
print(olduser_train.info())
print('数据集newuser_test的基本信息:')
print(newuser_test.info())
运行上述代码,结果如下所示,考虑到两个数据集均没有缺失值等特殊情况,则无需进一步进行数据清洗。
数据集olduser_train的基本信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 4 columns):
userid 1000 non-null int64
age 1000 non-null int64
LogonCount 1000 non-null int64
y 1000 non-null int64
dtypes: int64(4)
memory usage: 31.4 KB
None
数据集newuser_test的基本信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 400 entries, 0 to 399
Data columns (total 3 columns):
userid 400 non-null int64
age 400 non-null int64
LogonCount 400 non-null int64
dtypes: int64(3)
memory usage: 9.5 KB
None
这里,我们可以利用老客户的基本信息,利用Logistic回归模型计算新客户对产品A的购买概率,从而可以根据概率分数进行针对性的产品推荐,具体代码如下所示。
#Model Algorithms
from sklearn import linear_model
#指定训练和预测数据集
train_x = olduser_train[['age','LogonCount']]
train_y = olduser_train[['y']]
test_x = newuser_test[['age','LogonCount']]
logreg = linear_model.LogisticRegression()
logreg.fit(train_x, train_y)
Y_pred = logreg.predict(test_x)
print(Y_pred)
运行上述程序,结果如下所示,数据为新用户对产品A的购买偏好概率,可以根据预测结果Y_pred进行产品A的推荐。
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
当然,上述案例仅涉及一个产品,如果考虑更多的产品,本质上是一样的方法,最终可以利用用户的注册信息计算出用户对所有产品的偏好概率矩阵,在推荐产品时,可以根据概率矩阵筛选针对性的客户群进行推荐。
本文选自中国水利水电出版社的《智能推荐系统开发实战》一书,略有修改,经出版社授权刊登于此。
【免费送书】!
👇👇👇
|领取方式:
在文末“写评论”留言(30字以上),小编选择三位赠书!
|截止时间:
2022年8月25日08:00