1. 模型架构
本项目采用的是DeepFM模型,其结构结合了FM(因子分解机)与深度神经网络(DNN),实现了低阶与高阶特征交互的有效建模。模型分为以下几层:
1.1 FM部分(因子分解机层)
FM层主要用于建模稀疏特征的低阶交互,其数学公式如下:
- 一阶部分(线性模型):
- y linear = ∑ i = 1 n w i x i y_{\text{linear}} = \sum_{i=1}^{n} w_i x_i ylinear=i=1∑nwixi
- 其中,wi是线性权重,xi是输入特征。
- 二阶部分(特征交互部分):
- y FM = ∑ i = 1 n ∑ j = i + 1 n ⟨ v i , v j ⟩ x i x j y_{\text{FM}} = \sum_{i=1}^{n} \sum_{j=i+1}^{n} \langle \mathbf{v}_i, \mathbf{v}_j \rangle x_i x_j yFM=i=1∑nj=i+1∑n⟨vi,vj⟩xixj
- 其中,vi 和 vj 是特征嵌入向量,表示特征间的隐式交互,⟨vi,vj⟩ 是向量的内积,用于捕捉特征之间的低阶关系。
1.2 DNN部分(深度神经网络层)
DNN部分用于捕捉高阶特征交互。输入特征首先通过嵌入层映射为低维稠密向量,然后输入深度神经网络。DNN部分的计算公式如下:
- 第一层全连接层:
- h 1 = ReLU ( W 1 ⋅ x + b 1 ) h_1 = \text{ReLU}(W_1 \cdot x + b_1) h1=ReLU(W1⋅x+b1)
- 其中,W1和 b1 是第一层的权重矩阵和偏置,x是输入的嵌入向量,ReLU是激活函数。
- 第二层全连接层:
- h 2 = ReLU ( W 2 ⋅ h 1 + b 2 ) h_2 = \text{ReLU}(W_2 \cdot h_1 + b_2) h2=ReLU(W2⋅h1+b2)
- 类似地,W2和 b2 是第二层的权重矩阵和偏置。
- 输出层:
- y DNN = σ ( W 3 ⋅ h 2 + b 3 ) y_{\text{DNN}} = \sigma(W_3 \cdot h_2 + b_3) yDNN=σ(W3⋅h2+b3)
- 其中,σ是sigmoid激活函数,用于二分类预测。
1.3 DeepFM的融合
DeepFM模型将FM部分和DNN部分的输出进行融合,最终的输出为:
y output = σ ( y linear + y FM + y DNN ) y_{\text{output}} = \sigma(y_{\text{linear}} + y_{\text{FM}} + y_{\text{DNN}}) youtput=σ(ylinear+yFM+yDNN)
通过同时训练这三部分,模型能够同时捕捉到低阶和高阶特征交互。
2.1 训练流程
模型的训练流程包括以下步骤:
- 数据准备:对输入特征进行嵌入,并将稀疏特征转化为低维嵌入向量,同时将连续特征归一化。
- 前向传播:通过FM层和DNN层分别对低阶和高阶特征进行建模,并将两部分的结果结合起来,计算最终输出。
- 损失函数:使用二元交叉熵损失函数:
- L = − 1 N ∑ i = 1 N [ y i log ( y i ^ ) + ( 1 − y i ) log ( 1 − y i ^ ) ] L = -\frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(\hat{y_i}) + (1 - y_i) \log(1 - \hat{y_i}) \right] L=−N1i=1∑N[yilog(yi^)+(1−yi)log(1−yi^)]
- 其中,yi是真实标签,yi^是模型预测的概率。
- 优化器:模型使用Adam优化器来更新参数,调整学习率以获得最佳收敛效果。
2.2 评估指标
- AUC(Area Under Curve) :AUC用于评估模型的分类能力。AUC值越接近1,表示模型的分类性能越好。模型通过回调函数监控验证集上的AUC,以确定模型性能并进行早停或调整学习率。
3. 核心代码详细讲解
1. 数据预处理与特征工程
解释:读取用户行为数据集,包含用户与商品的交互数据。
暂时无法在飞书文档外展示此内容
解释:随机生成一个1到5之间的整数来替换原始的 action_type
列。这里模拟了不同的用户行为类型,可能为了确保数据的多样性或处理数据的平衡性。
暂时无法在飞书文档外展示此内容
解释:将行为时间字段转换为datetime
格式,并按照时间排序,以便后续提取时序特征并进行模型训练。
暂时无法在飞书文档外展示此内容
解释:从行为时间中提取月、日等时序特征,以帮助模型捕捉用户行为的时间趋势。
2. 模型架构构建
解释:定义DeepFM模型的输入部分。sparse_input
用于处理类别型(稀疏)特征,dense_input
用于处理连续型(密集)特征。
暂时无法在飞书文档外展示此内容
解释:对稀疏特征进行嵌入处理。每个类别型特征通过嵌入层转换为低维的稠密向量,便于后续的FM和DNN层处理。
暂时无法在飞书文档外展示此内容
解释:构建FM模型的一阶线性部分,将稀疏和密集特征的线性嵌入结果结合,形成线性组合。
暂时无法在飞书文档外展示此内容
解释:构建FM部分的二阶交互层,计算嵌入向量的内积并通过 Subtract
操作实现特征交互。通过平方和差公式得到交互结果,并通过Lambda层调整系数。
暂时无法在飞书文档外展示此内容
解释:DNN部分通过多个全连接层实现高阶特征的非线性组合。每一层都通过批标准化、激活函数和Dropout层进行处理,防止过拟合并增强模型的泛化能力。
暂时无法在飞书文档外展示此内容
解释:将FM模型的线性部分、二阶交互部分以及DNN部分的输出拼接在一起,最终通过Sigmoid层输出预测结果(适用于二分类任务)。