DeepFM

DeepFM

CTR预估是推荐系统中根据用户特征对item进行点击率预测的一个任务。而CTR任务中面临的特征往往具有相关性,且经过one-hot编码后具有稀疏性。
FM就是为处理这种稀疏的相关性而提出的。为了处理相关性,FM在一阶特征的基础上引入二阶特征项;而由于特征稀疏(尤其是二阶项组合,如所有xi*xj中0所占比例应比所有xi中0所占比例更高)导致二阶项组合大部分为0,这时二阶项系数矩阵必定存在大量的参数冗余,FM采用矩阵分解的方式来减少冗余参数。其实就是试图将每个one-hot编码前的原始特征embedding成一个向量,计算每两个向量之间内积和。FM能处理一阶、二阶特征,而不能处理更高阶特征。
DeepFM中FM Component与FM完全相同。与FM不同的是,DeepFM引入了一个DNN Component,从而能够处理更复杂的特征交互。DNN Component的embedding层参数与FM component共享。DeepFM不需要对embedding层进行预训练,是一个end-to-end的架构。

### 使用DeepFM模型训练MovieLens数据集进行电影推荐 #### 数据准备 为了使用DeepFM模型处理MovieLens数据集,需先下载并解析该数据集。通常情况下,MovieLens数据集中包含了用户评分、电影元数据以及标签等信息。 ```python import pandas as pd ratings = pd.read_csv('ml-latest-small/ratings.csv') movies = pd.read_csv('ml-latest-small/movies.csv') print(ratings.head()) print(movies.head()) ``` #### 特征工程 考虑到DeepFM能够有效利用稀疏特征,在构建输入向量时应特别注意去除无意义的零值特征[^3]。对于每部电影和每位用户的交互记录,可提取如下特征: - 用户ID - 电影ID - 时间戳(作为辅助特征) - 类别编码后的电影类别 - 年龄分组或其他人口统计学属性(如果可用) 这些特征有助于捕捉潜在模式,并提升最终推荐系统的性能。 #### 构建DeepFM模型架构 基于TensorFlow或PyTorch框架实现DeepFM网络结构。此部分涉及定义嵌入层(embedding layer),线性组件(linear component) 和多层感知机(Multi-Layer Perceptron, MLP)[^1]。 ```python from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, Embedding, Flatten, Dense, Concatenate from deepctr.feature_column import SparseFeat, VarLenSparseFeat, get_feature_names from deepctr.models.deepfm import DeepFM # 定义特征列 feature_columns = [ SparseFeat('user_id', vocabulary_size=users.shape[0], embedding_dim=8), SparseFeat('movie_id', vocabulary_size=movies.shape[0], embedding_dim=8) ] dnn_feature_columns = feature_columns.copy() model_input = {feat.name:Input(shape=(1,), name=feat.name) for feat in dnn_feature_columns} deep_fm_model = DeepFM(dnn_feature_columns=dnn_feature_columns, linear_feature_columns=feature_columns) output_layer = deep_fm_model(model_input) final_model = Model(inputs=list(model_input.values()), outputs=output_layer) final_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) ``` #### 训练过程 完成上述准备工作之后,即可调用`fit()`方法启动训练流程。期间建议设置合理的批量大小(batch size) 及迭代次数(epoch number), 同时监控验证集上的表现来调整超参数直至获得满意的结果。 ```python history = final_model.fit(train_data, train_labels, batch_size=256, epochs=10, validation_split=0.2) ``` #### 推荐结果保存 旦训练结束,可以将得到的最佳权重应用于测试集以生成个性化推荐列表,并将其序列化到类似于 `rank10.pkl` 的文件中以便后续部署至前端界面显示。 ```python recommendations = predict_with_trained_model(test_users) with open('rank10.pkl', 'wb') as f: pickle.dump(recommendations[:10], f) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值