本发明涉及机器学习、神经网络以及智能推荐领域,具体涉及一种基于最大负例的门控循环单元神经网络的景点推荐方法。
背景技术:
近年来,旅游业已经成为最重要的行业之一,网络发展越来越快的同时也走入了人们的生活当中。在旅游休闲方面人们开始通过互联网对旅游信息进行查询并筛选出自己喜欢的信息。用户的增加使互联网上的数据量呈指数倍增长,数据量增大导致用户需要大量时间进行筛选自己感兴趣的景点以至于难以选择出适合自己的旅游路线。因此,为每一个用户推荐其适合的旅游路线是目前需要解决的问题。在旅游推荐领域中传统的推荐算法虽然取得了良好的效果,但因没有数据而造成的启动困难问题-冷启动,数据稀疏性问题,以及忽略旅游轨迹中的隐含语义问题,推荐精准度低下等问题仍需要解决。
目前在旅游推荐领域中传统的推荐算法虽然取得了良好的效果,但存在因没有数据而造成的启动困难问题:冷启动,数据稀疏性问题,以及忽略旅游轨迹中的隐含语义问题,推荐精准度低下问题。
技术实现要素:
本发明所要解决的技术问题是现有技术中存在的启动困难问题:冷启动,数据稀疏性问题,以及忽略旅游轨迹中的隐含语义问题的技术问题。提供一种新的基于门控循环单元神经网络的景点推荐方法,该基于门控循环单元神经网络的景点推荐方法具有启动简单、数据稀疏性好、解决了忽略序列之间的隐藏信息以及推荐准确度低的的特点。
为解决上述技术问题,采用的技术方案如下:
一种基于门控循环单元神经网络的景点推荐方法,所述基于门控循环单元神经网络的景点推荐方法包括:
步骤一,采集旅游数据<uj1,sj2,vj3>,对旅游数据进行预处理,按照第j个游客的所有旅游数据按照时间顺序生成表征旅游轨迹的旅游序列t为<uj1,s12,v13>,<uj1,s22,v23>,...,<uj1,sj2,vj3>,...,<uj1,sn22,vn23>;
其中,uj1表示第j1个游客,sj2表示第j2个时刻,vj3表示第j3个景点,j1为小于等于n1的正整数,j2为小于等于n2的正整数,j3为小于等于n2的正整数;n1和n2为大于1的正整数,n2表示旅游轨迹长度;
步骤二,将步骤一的旅游序列输入到门控循环单元神经网络中,通过门控循环神经网络对旅游数据进行建模,建立门控循环单元神经网络学习模型;
步骤三,将步骤一的旅游序列t作为数据集同时输入步骤二的门控循环单元神经网络学习模型,将同批次的其他景点作为负例进行训练;
步骤四,定义损失函数,更新推荐列表,完成景点推荐。
本发明的工作原理:本发明通过使用循环网络对整条序列进行建模,比传统的推荐算法相比解决了冷启动问题,矩阵稀疏问题,忽略序列之间的隐藏信息以及推荐准确度低的问题。由于采集的原始数据会存在冗余和信息不完整等问题,需要对采集到的原始数据进行预处理;在预处理数据后,按照每个用户旅游的时间顺序整理成旅游序列。
上述方案中,为优化,进一步地,步骤一中的时刻为访问时间,访问时间为实际访问时间或评论时间,实际访问时间优先于评论时间。
进一步地,步骤一中还包括:剔除无效信息,无效信息包括旅游轨迹短于有效旅游轨迹阈值的旅游轨迹,以及相邻景点访问时间超过间隔时间阈值的。
进一步地,步骤二中的门控循环单元神经网络学习模型中包括景点特征学习层、gru隐层及景点得分输出层:
景点特征学习层中,所有景点使用独热编码表示,景点特征学习层输入的长度等于景点的个数,把独热编码表示嵌入到景点特征学习层用低维向量表示;
gru隐层中,gru隐层的输入是景点的独热编码表示;
景点得分输出层,景点得分输出层把gru隐层的输出通过tanh激活函数后表示每个景点的得分,得分表征预测访问概率。
进一步地,步骤二中使用多条旅游轨迹同时训练。
进一步地,所述多条旅游轨迹同时训练包括:
每条轨迹相对应的位置定义为同一批次,把同一批次中其他轨迹的景点作为负例来训练模型;
创建一个窗口,窗口大小为dx,dx表征dx条旅游轨迹同时训练;
对每个旅游轨迹进行排序,使用第一个旅游轨迹中的第一个景点作为第一个输入,第二个景点作为第二个输入,以此类推,直到一个旅游轨迹结束;
每一条旅游轨迹训练完成后均重置赋值权重矩阵;
在已有的负例集合上加入提前抽取好的有效负例集合组成全新的负例集合。
进一步地,所述有效负例集合中有效负例的产生方法如下:
把其他旅游轨迹中同一批次中的旅游景点设为负例集合a;
把所有景点采取随机抽样的方法取出一部分作为额外的负例集合b;
所有景点里的得分最高的负例景点,把负例集合里的所有景点得分与得分最高的负例进行比值,得到每个景点的赋值权重;
将赋值权重用于更新更新损失函数。
进一步地,所述更新推荐列表采用pairwise的方法进行排序,对应的损失函数为
其中,sn表示样本大小,sm表示负例q与得分最高负例的比值,p代表正例,q代表负例,r代表景点的得分,rq表示景点q的得分,rp表示景点p的得分。
本发明的有益效果:本发明通过使用门控循环单元神经网络学习模型对整条序列进行建模,比传统的推荐算法相比解决了冷启动问题,矩阵稀疏问题,忽略序列之间的隐藏信息以及推荐准确度低的问题。本发明使用多条旅游轨迹同时训练的方法,把其他序列中同位置的景点以及预先准备好的额外的有效数据集作为负例,与对全部景点作为负例相比大大的减少了运算时间和运算量。本发明通过有效的利用高质量的负例来改进推荐效果。在本发明中使所有负例都获得了权重,让高质量的负例有更高的权重来影响模型,无效负例对模型的影响降到最低,从而提供高质量的推荐。
附图说明
下面结合附图和实施例对本发明进一步说明。
图1,基于门控循环单元神经网络的景点推荐方法流程示意图。
图2,生成旅游序列示意图。
图3,多条旅游轨迹同时训练的方法示意图。
具体实施方法
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
实施例1
本实施例提供一种基于门控循环单元神经网络的景点推荐方法,如图1。
具体包括以下步骤:
步骤1,利用网络爬虫采集用户id,景点名称和游玩时间属性数据,并进行预处理,再根据每位用户对景点的浏览时间生成旅游序列;
步骤2,将旅游序列同时输入到门控循环单元神经网络学习模型中,在同批次的其他景点作为负例的基础上加入有效抽取的负例进行训练;
步骤3,在所有景点中找到得分最高的景点并把所有负例景点的得分与之对比并按比值赋予权重;
步骤4,根据所有负例得到的权重比值来计算损失函数,使用pairwise来更新推荐列表,实验证明在旅游数据集上与其他模型对比得到更好的推荐效果。
步骤1中具体如图2:
首先根据游客的旅游数据整理成游客的旅游轨迹。定义旅游数据由<u,s,i>组成,表示游客u在时间s访问景点i。游客u1在时间s1访问景点i1,因此得到旅游数据<u1,s1,i1>;游客u1在之后时间s2又访问景点i2,又得到的旅游数据<u1,s2,i2>;将游客u1的所有旅游数据按时间顺序排列成游客u1的旅游轨迹。本实施例中,为了减小数据量,预处理包括定义旅游轨迹太短或者景点与景点之间的时间间隔太长的为无效的信息,并去除冗余信息。
例如t:<u1,s1,i1>,...,<u1,sk,ik>,...,<u1,sn,in>,其中t表示游客u1的旅游轨迹,n表示旅游轨迹的长度。旅游数据集中的游客id,访问时间以及游玩景点在携程旅游网web标签中的用户评论中爬取。在所有景点的评论下爬取所有游客id和评论时间,整理成旅游数据,然后把每个游客的旅游数据按评论时间整理成游客的旅游轨迹。
评论时间与景点的访问时间有相关性,如果数据中没有实际景点访问时间,可以将评论时间近似的认为是景点的访问时间。
具体地,过滤掉了长度小于2的旅游轨迹,访问景点的间隔时间超过7天的景点序列。然后把数据集以某一时间划分为训练集和测试集。
最终本实施例的桂林旅游数据集由19724条旅游数据组成,共包含290个旅游景点,3940名游客的旅游轨迹。上海旅游数据集由113103条旅游数据组成,包含3097个旅游景点,31308名游客的旅游数据。
神经网络模型中,景点特征学习层:所有景点都使用独热编码表示,输入的长度等于景点的个数。景点特征学习层也就是embedding层,把独热编码表示嵌入到该层用低维向量表示。
gru隐层:输入是景点的独热表示,输出经过景点得分输出层后得到每个景点的得分也代表预测访问概率。
景点得分输出层:把gru网络的输出通过tanh激活函数后表示每个景点的得分,也就是预测访问概率。
步骤2的具体过程中,输入层,rnn在自然语言处理任务中可使用mini-batch梯度下降的方法。通常是对句子中的单词使用滑动窗口,把窗口内的单词放在一起使用mini-batch梯度下降的方法来处理。由于序列的长度是不同的且比句子的长度会长很多。例如:用户1的旅游轨迹可以只包含2个旅游景点,而用户2的旅游轨迹可能包含20个,30个甚至更多。
为了捕捉旅游序列随着时间推移的演变结果。优选地,本实施例提出多条旅游轨迹同时训练的方法。具体地,在多条旅游轨迹同时训练的方法中,每条轨迹相对应的位置称为同一批次,把同一批次中其他轨迹的景点作为负例来训练模型,减少计算时间的同时也减少了不必要的计算。多条旅游轨迹同时训练需要创建一个窗口。
例如窗口大小为4,即4条旅游轨迹同时训练。对每个旅游轨迹进行排序,使用第一个旅游轨迹中的第一个景点作为第一个输入,第二个景点作为第二个输入,直到一个旅游轨迹结束。在一个旅游轨迹结束后,会有新的旅游轨迹继续输入。
如图3所示,旅游轨迹2和旅游轨迹4都是3个景点,训练完成后分别有旅游轨迹5和旅游轨迹6接着输入进行训练,为了保证模型对单条旅游轨迹进行训练,在一条旅游轨迹训练完成后将权重矩阵重置。最后在已有的负例集合上加入提前抽取好的有效负例集合组成全新的负例集合进行计算。
步骤3具体如下,可以提高负例质量的问题:
把其他旅游轨迹中同一批次中的旅游景点设为负例集合a,把所有景点采取随机抽样的方法取出一部分作为额外的负例集合b。
因为负例集合a是采取同一批次的景点,在旅游轨迹前面的同一批次中的景点都是热门景点,因为游客会根据景点的热门程度来选择先后浏览。
负例集合b把所有景点在旅游数据库中的出现次数进行累加。比如七星公园在桂林旅游数据库中一共出现100次,象鼻山在桂林旅游数据库中一共出现200次,银子岩在桂林旅游数据库中一共出现50次,把所有景点的出现次数进行累加,那么总出现次数就是100+200+50=350,在350个景点里随机抽取。这样的取样方法基于景点的出现次数,越热门的景点选取的概率也就越大。最终集合a和集合b的所有景点就是新的负例集合,虽然集合a和集合b的选取方法不一样,但是可以近似认为选取的景点大多都是热门景点。
最后得到所有景点里的得分最高的负例景点,把负例集合里的所有景点得分与得分最高的负例进行比值,得到每个景点的权重。越热门景点得分越高,得到的权重也越大,对损失函数的影响也越大。冷门景点得分较低,得到的权重越小,对损失函数的影响也越小。
经过试验,在旅游数据集上的评判指标召回率和mrr上都优于其他推荐模型,证明了我们的改进是有效的,可以为游客提供更高效、更准确的个性化推荐。
具体地,步骤4中提高负例质量更新损失函数。找到所有景点里得分最高的负例景点,把负例集合里的所有景点得分与得分最高的负例进行比值,得到每个景点的权重。负例获取的权重与其得分有关,如果负例的得分越高相对得到的权重也会越大。通过这样的方法有效负例对模型产生的影响就会变大,而无效负例的影响就会变小,得分很低的负例基本对模型没有影响。
本实施例使用pairwise的方法进行排序,损失函数如下公式所示:
其中,sn表示样本大小,sm表示负例q与得分最高负例的比值,p代表正例,q代表负例,r代表景点的得分,rq表示景点q的得分,rp表示景点p的得分。
损失函数分为两个部分,第一部分把正例得分和负例得分进行然后赋予权重,第二部分就是正则化部分,目的就是防止过拟合和使负例的得分趋近于0。
最后验证推荐效果的评判指标我们使用最近在推荐系统中常用的的recall和mrr,列表范围取前10,用recall@10用公式表示:
zmrecall@10表示正确的景点m在从大到小排列的预测得分列表的前10位时,zm@10=1,否则zm@10=0。m表示预测总次数。recall不考虑该景点的实际排名,它只需要在预测得分列表的前10位即可,针对的recall@10。
mrr@10用公式表示:
rankm@10表示正确的景点m在从大到小排列的预测得分列表的前10位时,rankm@10=a,如果正确景点在预测得分列表中的排名在10以后,rankm@10则=0。a表示正确景点m在预测得分列表中的具体排名数。m表示预测总次数。
最后实验效果对比,如表1和表2:
表1
表2
randompred:随机预测模型,该模型随机把景点推荐给游客。这在某些推荐上是简单有效的推荐方法。
pop:基于流行度的预测模型。此基线总是推荐给游客在训练集里最受欢迎的景点。尽管它很简单,但是它在某些推荐领域里是一个表现很好的基线模型。
item-knn:基于最近邻的项目预测模型。此基线把与正确景点类似的景点推荐给游客。该基线是推荐系统中“景点-景点”的最常见的解决方法之一。它在“浏览过这个景点的人也去过其他的景点”这样的背景下做出推荐。
bpr-mf:基于贝叶斯的协同过滤预测模型,此方法是最常见的矩阵分解方法之一。此模型使用优化排序的方法是随即梯度下降算法(sgd)。矩阵分解不能直接应用于基于session的推荐,因为新的session没有可以预先计算的特征向量。可以通过使用推荐景点和会话景点之间的特征向量的相似度取平均值的方法来克服这个问题。
gru:使用门控循环单元神经网络并没有使用提高负例质量的方法进行推荐的结果。
前述为现有的方法,max-gru为本实施例的一种基于最大负例门控循环单元神经网络的景点推荐方法。
本实施例使用门控循环单元神经网络解决了原有推荐方法的冷启动,矩阵稀疏,忽略序列间的语义信息的问题,并在此基础上使用多条旅游轨迹同时训练的方法提高训练速度,减少计算量的同时加入了最大负例的思想来提高负例质量,最终形成了高质量的推荐方法。
尽管上面对本发明说明性的具体实施方法进行了描述,以便于本技术领域的技术人员能够理解本发明,但是本发明不仅限于具体实施方法的范围,对本技术领域的普通技术人员而言,只要各种变化只要在所附的权利要求限定和确定的本发明精神和范围内,一切利用本发明构思的发明创造均在保护之列。