本文首先介绍冷启动的基本概念,并通过冷启动实际案例来说明如何解决新用户或新项目的冷启动问题。
有些APP,用户在注册时要求导入社交关系,比如手机通讯录,这时可以将你的好友喜欢的标的物推荐给你。利用社交信息来做冷启动,特别是在有社交属性的产品中,这是很常见的一种方法。社交推荐最大的好处是用户基本不会反感推荐的标的物,所谓人以类聚,你的好友喜欢的东西你也可能会喜欢。
还有一些APP,强制需要用户在注册时提供你的兴趣点,有了这些兴趣点就可以为你推荐你喜欢的内容了。通过该方法可以很精准的识别用户的兴趣,对用户兴趣把握相对准确。这是一个较好的冷启动方案,但是要注意不能让用户填写太多内容,用户操作也要非常简单,占用用户太多时间,操作太复杂,用户可能就会流失。
将新标的物曝光给随机一批用户,观察用户对标的物的反馈,找到对该标的物有正向反馈(观看,购买,收藏,分享等)的用户, 后续将该标的物推荐给有正向反馈的用户或者与该用户相似的用户。
该方法特别适合像淘宝这种提供平台的电商公司以及像今日头条、快手、阅文等UGC平台公司,他们需要维护第三方生态的繁荣,所以需要将第三方新生产的标的物尽可能的推荐出去,让第三方有利可图。同时通过该方式也可以快速知道哪些新的标的物是大受用户欢迎的,找到这些标的物,也可以提升自己平台的营收。
对于新加入的物品,可以利用物品的内容信息,计算其与其他物品的相似度,基本思路就是将物品转换成关键词向量,通过计算向量之间的相似度(例如计算余弦相似度),得到物品的相关程度,根据相似度,将它们推荐给喜欢过和它们相似物品的用户,这就用到了基于项目的协同过滤算法,具体实现方案,可以参考第三章的内容。
很多系统在建立的时候,既没有用户的行为数据,也没有充足的物品内容信息来计算物品相似度。这种情况下,很多系统都利用专家进行标注,代表系统有个性化网络电台Pandora和电影推荐网站Jinni。
以Pandora电台为例,Pandora雇用了一批音乐人对几万名歌手的歌曲进行各个维度的标注,最终选定了400多个特征,每首歌都可以标识为一个400维的向量,然后通过常见的向量相似度算法计算出歌曲的相似度。
上一节中给出了各种常见的冷启动方案,针对不同的业务场景,所选择的方案不尽相同。综合考虑如上方案,其具体技术实现难度均较为简单,本节将通过两个案例,来说明如何解决冷启动问题。
当一个客户刚刚注册时,因为没有该用户的历史记录,所以,一个最基本的方法是应用基于人气的策略,即推荐最受欢迎的产品。
本案例中我们使用最简单的数据,数据集中有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个样本
接着,我们查看两个数据集的基本信息,代码如下。
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]
本文选自中国水利水电出版社的《智能推荐系统开发实战》一书,略有修改,经出版社授权刊登于此。