DeepFM原理以及DeepCTR代码实现

本文深入解析了DeepFM算法,一种结合因子分解机(FM)与深度神经网络(DNN)的模型,旨在解决CTR预测问题。该算法能同时考虑低阶与高阶特征组合,无需复杂的特征工程。通过在Criteo点击率预测等大型数据集上的应用,验证了其在推荐系统领域的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DeepFM算法:

论文: A Factorization-Machine based Neural Network for CTR Prediction,2017
https://arxiv.org/abs/1703.04247

  • FM(因子分解机,之前的博文有讲过)可以做特征组合,但是计算量大,一般只考虑2阶特征组合
  • 如何既考虑低阶(1阶+2阶),又能考虑到高阶特征 => DeepFM=FM+DNN
  • 设计了一种end-to-end的模型结构 => 无须特征工程
    在各种benchmark和工程中效果好
    Criteo点击率预测, 4500万用户点击记录,90%样本用于训练,10%用于测试
    Company*游戏中心,10亿记录,连续7天用户点击记录用于训练,之后1天用于测试
import pandas as pd
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from deepctr.models import DeepFM
from deepctr.feature_column import SparseFeat,get_feature_names

#数据加载
data = pd.read_csv("movielens_sample.txt")
sparse_features = ["movie_id", "user_id", "gender", "age", "occupation", "zip"]
target = ['rating']

# 对特征标签进行编码
for feature in sparse_features:
    lbe = LabelEncoder()
    data[feature] = lbe.fit_transform(data[feature])
# 计算每个特征中的 不同特征值的个数
fixlen_feature_columns = [SparseFeat(feature, data[feature].nunique()) for feature in sparse_features]
linear_feature_columns = fixlen_feature_columns
dnn_feature_columns = fixlen_feature_columns
feature_names = get_feature_names(linear_feature_columns + dnn_feature_columns)

# 将数据集切分成训练集和测试集
train, test = train_test_split(data, test_size=0.2)
train_model_input = {name:train[name].values for name in feature_names}
test_model_input = {name:test[name].values for name in feature_names}

# 使用DeepFM进行训练
model = DeepFM(linear_feature_columns, dnn_feature_columns, task='regression')
model.compile("adam", "mse", metrics=['mse'], )
history = model.fit(train_model_input, train[target].values, batch_size=256, epochs=1, verbose=True, validation_split=0.2, )
# 使用DeepFM进行预测
pred_ans = model.predict(test_model_input, batch_size=256)
# 输出RMSE或MSE
mse = round(mean_squared_error(test[target].values, pred_ans), 4)
rmse = mse ** 0.5
print("test00 RMSE", rmse)
### MMoE 和 DeepFM 模型介绍 #### 一、MMoE 模型 MMoE(Multi-gate Mixture-of-Experts)是一种专门设计用于处理多任务学习场景下特征共享与特定任务需求之间平衡问题的架构。通过引入专家网络和门控机制,能够有效地捕捉到不同任务间既存在共通之处又各自具备独特性的特点。 - **原理** 在MMoE结构中,输入数据会先经过一系列被称为“Expert”的子神经网络层处理;这些expert可以被看作是对原始特征的不同抽象表示形式的学习器。之后,对于每一个具体的下游任务而言,则会有对应的gate模块负责接收来自所有experts的信息并据此作出选择——即决定哪些部分应该更侧重于当前正在解决的任务上[^1]。 - **实现方式** 下面给出一段简单的Python代码片段展示如何构建一个基础版本的MMoE模型: ```python import tensorflow as tf from tensorflow.keras.layers import Dense, Input from tensorflow.keras.models import Model def build_mmoe_model(input_dim=10, num_experts=8, num_tasks=2): input_layer = Input(shape=(input_dim,)) experts_outputs = [] for _ in range(num_experts): expert_output = Dense(64, activation='relu')(input_layer) experts_outputs.append(expert_output) task_specific_layers = {} outputs = [] for i in range(num_tasks): gate_weights = Dense(num_experts, activation="softmax")(input_layer) gated_sum = sum([g * e for g, e in zip(tf.split(gate_weights, num_experts), experts_outputs)]) output_task = Dense(1)(Dense(32, activation='relu')(gated_sum)) outputs.append(output_task) model = Model(inputs=input_layer, outputs=outputs) return model ``` - **应用场景** 此类模型非常适合应用于那些涉及多个相互关联但又有差异的目标变量预测场合,比如推荐系统中的点击率预估(CTR)以及转化率预估(CVR),或是广告投放平台里针对不同类型用户的个性化营销策略制定等情形。 #### 二、DeepFM 模型 DeepFM融合了因子分解机(Factorization Machine, FM)与深层神经网络的优点,在保持低阶交互项表达能力的同时增强了高维稀疏数据上的非线性映射性能。 - **原理** DeepFM整体框架由两大部分组成:左侧为传统意义上的FM组件,右侧则是标准的全连接前馈神经网路(DNN)。前者主要用于捕获特征间的二阶交叉效应,而后者则进一步挖掘更高层次的关系模式。两者共同作用使得整个体系既能快速收敛又能较好地拟合复杂分布的数据集特性[^2]。 - **实现方式** 接下来提供了一个简化版的PyTorch风格伪代码用来说明怎样搭建这样一个混合式的机器学习工具包: ```python class DeepFM(nn.Module): def __init__(self, field_dims, embed_dim=16, mlp_dims=[128, 64], dropout=0.1): super().__init__() self.fm = FactorizationMachineModel(field_dims, embed_dim) self.embeddings = FeaturesEmbedding(field_dims, embed_dim) self.linear = FeaturesLinear(field_dims) self.mlp = MultiLayerPerceptron(embed_dim * len(field_dims), mlp_dims, dropout) def forward(self, x): """ :param x: Long tensor of size ``(batch_size, num_fields)`` """ fm_part = self.fm(x) emb_x = self.embeddings(x).view(-1, self.embeddings.output_dim()) deep_part = self.mlp(emb_x) linear_part = self.linear(x) out = torch.sigmoid(fm_part + deep_part.sum(dim=-1)+linear_part.squeeze(1)) return out ``` - **应用场景** 广泛适用于各类在线服务平台内的精准推送服务领域,特别是当面对海量用户行为记录且维度极高的情况下表现尤为出色,例如新闻资讯客户端的文章分发、视频流媒体网站的内容定制播放列表生成等方面均可见其身影。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值