随着互联网上数据量的逐年增加,推荐系统(RS)已经成为从电子商务到电子资源的各个领域的重要组成部分。如今,像Netflix、亚马逊、YouTube等大型企业都使用RS来帮助用户找到有用的信息,以提升用户体验,从而获得用户的信任。
推荐系统的主要任务是从网络上海量的数据中为用户提供相关和有趣的信息,同时帮助企业获利。具体来说,RS是一个预测用户可能在未来消费的物品的工具。在这篇文章中,将探讨如何使用Python中的Keras构建一个简单的电影推荐系统。
将使用包含943名用户对1682部电影的100K个评分的电影数据集。对于这篇文章,需要从下载的文件夹中提取u.data文件。
为了便于理解,将一次性加载所有有用的库。
import numpy as np
import pandas as pd
import os
import warnings
from keras.models import load_model
from sklearn.model_selection import train_test_split
from keras.layers import Input, Embedding, Flatten, Dot, Dense, Concatenate
from keras.models import Model
warnings.filterwarnings('ignore')
Pandas用于加载、读取和处理数据集。Numpy用于处理数组和矩阵。Keras是一个开源库,用于处理人工神经网络,它减少了开发神经网络的工作量。
由于代码是在Google Colab中编写的,首先需要使用以下语句上传u.data文件,然后使用Pandas库读取数据集。
from google.colab import files
uploaded = files.upload()
header = ['user_id','item_id','rating','timestamp']
dataset = pd.read_csv('u.data',sep = 't',names = header)
dataset.head()
dataset.head()打印数据集的前5行,如下所示:第一行表示用户196在时间戳881250949给电影242的评分。
一旦读取了数据集,下一步就是将其分割为测试和训练数据集。在这里,认为20%的数据集作为测试,其余80%作为训练数据集。训练神经网络需要大量的数据以获得更好的准确性。
train, test = train_test_split(dataset, test_size=0.2, random_state=42)
Keras库使得创建特定问题的模型变得简单。模型由3层组成:输入层、嵌入层和输出层。
# 创建电影嵌入路径
movie_input = Input(shape=[1], name="Movie-Input")
movie_embedding = Embedding(n_items+1, 5, name="Movie-Embedding")(movie_input)
movie_vec = Flatten(name="Flatten-Movies")(movie_embedding)
# 创建用户嵌入路径
user_input = Input(shape=[1], name="User-Input")
user_embedding = Embedding(n_users+1, 5, name="User-Embedding")(user_input)
user_vec = Flatten(name="Flatten-Users")(user_embedding)
# 合并特征
conc = Concatenate()([movie_vec, user_vec])
# 添加全连接层
fc1 = Dense(128, activation='relu')(conc)
fc2 = Dense(32, activation='relu')(fc1)
out = Dense(1)(fc2)
# 创建模型并编译
model2 = Model([user_input, movie_input], out)
model2.compile('adam', 'mean_squared_error')
上述代码首先创建了用户和电影向量,然后将这些向量合并。这些合并后的向量被传递到一个包含2个隐藏层的神经网络中。第一个隐藏层包含128个神经元,而第二个包含32个神经元。输出层由out表示,包含1个神经元,给出用户对电影的预测评分。
一旦创建了模型,下一步就是训练模型。在这里,采用了5个epoch,可以增加以使模型更准确。目标是更新嵌入向量,以使预测值接近实际值。在这里,损失表示整个训练数据集上预测和实际评分之间的误差。
history = model2.fit([train.user_id, train.item_id], train.rating, epochs=5, verbose=1)
现在,可以为测试数据集生成预测值,即给定user_id和movie_id,使用构建的模型计算预测评分。在这里,从测试数据集中取出前10行,并预测相应的user_id和movie_id的值。通常,可以为整个测试数据集预测值,然后可以推荐预测评分最高的电影给特定用户。
predictions = model2.predict([test.user_id.head(10), test.item_id.head(10)])
[print(predictions[i], test.rating.iloc[i]) for i in range(0,10)]
上述代码的输出:这些是预测值和实际值。
1. 数据稀疏性:推荐基于用户的历史,用户对物品的评分在理解用户的口味中起着重要作用。然而,在实际情况中,用户对消费的物品的评分很少,导致数据稀疏问题,这影响了推荐过程的准确性。模型对用户了解得越多,就能做出越准确的推荐。考虑的电影镜头数据集是93.7%稀疏的。