使用Keras实现MF模型的训练

引入

Matrix Factorisation之类的模型将User和Item使用隐向量的方式表征, 通常使用点积的方式得到一个(User, Item)对的点击, 评分等情况. 在训练过程中, 根据损失函数, 将要训练的隐向量偏置等参数经过计算, 得到与真实值的差距.

由于User和Item是用隐变量表征的, 每个都由一个单独的向量表示, 因此可以使用embedding的方式, 通过embedding lookup查找表示. 沿着这个思路, 使用交互数据进行训练(这使得整个训练过程类似于回归任务).

数据集

使用Movielens-100k数据集作为说明. 该数据集共有943个user和1682个item, 拥有100k的评分记录, 即大约有7%(User, Item)对是有评分记录的, 所有的评分在1-5之间, 且为整数.

过程

首先读取数据集.

dataset = pd.read_csv("./data/ml-100k/u.data", sep="\t", header=None, names=["user_id", "item_id", "rating", "timestamp"])
dataset.head()
    user_id    item_id    rating    timestamp
0    196    242    3    881250949
1    186    302    3    891717742
2    22    377    1    878887116
3    244    51    2    880606923
4    166    346    1    886397596

查看user和item的数量:

为了保证所有user和item的索引是连续的, 并且从0开始, 使用pandas.Series.cat相关的方法进行转换:

再将训练数据按80/20的比例分成训练集和开发集:

Matrix Factorisation方法将user和item用定长的低维向量表示, 从而类似于embedding方法.

假设有MM个user, NN个item, 则行为矩阵就是一个A[M,N]A[M, N]的矩阵, 假设每个元素用kk维的向量表征, 则user和item的embedding矩阵分别为W[M,k]W[M, k]H[]N,k]H[]N, k]. 最简单的MF训练方法为: AWHTA \approx W \cdot H^T.

下面开始使用keras解决MF训练的问题.

训练模型:

评估结果:

获取隐向量:

参考文章

最后更新于

这有帮助吗?