“`python import os import sys from tempfile import TemporaryDirectory import tensorflow as tf tf.get_logger().setLevel(‘ERROR’)
from recommenders.models.deeprec.deeprec_utils import download_deeprec_resources, prepare_hparams from recommenders.models.deeprec.models.xDeepFM import XDeepFMModel from recommenders.models.deeprec.io.iterator import FFMTextIterator from recommenders.utils.notebook_utils import store_metadata
if not os.path.exists(yaml_file): download_deeprec_resources(‘https://recodatasets.z20.web.core.windows.net/deeprec/’, data_path, ‘xdeepfmresources.zip’)
本笔记本将提供一个如何训练 xDeepFM 模型 的快速示例。
xDeepFM [1] 是一个基于深度学习的模型,旨在捕捉低阶和高阶特征交互,以实现精确的推荐系统。因此,它可以更有效地学习特征交互,并且可以显著减少手工特征工程的工作量。总结来说,xDeepFM 具有以下关键特性:
use_Linear_part
、use_FM_part
、use_CIN_part
和use_DNN_part
)启用不同的组件子集。例如,仅启用use_Linear_part
和use_FM_part
,我们可以获得一个经典的 FM 模型。在本笔记本中,我们将在 Criteo 数据集 上测试 xDeepFM。
0. 全局设置和导入
输出:
参数设置
xDeepFM 使用 FFM 格式作为数据输入:
<label> <field_id>:<feature_id>:<feature_value>
每行代表一个实例,
<label>
是一个二进制值,1 表示正实例,0 表示负实例。特征分为字段。例如,用户的性别是一个字段,它包含三个可能的值:男性、女性和未知。职业可以是另一个字段,它包含比性别字段更多的可能值。字段索引和特征索引均从 1 开始。
2. Criteo 数据
现在让我们在现实世界的数据集上尝试 xDeepFM,这是从 Criteo 数据集 中采样的小样本。Criteo 数据集是一个众所周知的行业基准数据集,用于开发 CTR 预测模型,并且经常被研究论文采用作为评估数据集。
原始数据集对于轻量级演示来说太大,所以我们从中抽取了一小部分作为演示数据集。
“`python
print(‘Demo with Criteo dataset’)
hparams = prepare_hparams(yaml_file,
FEATURE_COUNT=2300000,
FIELD_COUNT=39,
cross_l2=0.01,
embed_l2=0.01,
layer_l2=0.01,
learning_rate=0.002,
batch_size=BATCH_SIZE
epochs=EPOCHS,
cross_layer_sizes=[20, 10],
init_value=0.1,
layer_sizes=[20, 20],
use_Linear_part=True,
use_CIN_part=True,
use_DNN_part=True)
print(hparams)
“`
输出:
3. 数据加载与预处理
我们需要将数据加载到适当的格式中,以便供 xDeepFM 使用。以下代码将展示如何加载和处理 Criteo 数据集。
4. 模型训练
下面的代码展示了如何初始化 xDeepFM 模型并进行训练。
输出:
5. 模型评估
训练完成后,我们需要评估模型的性能。以下代码展示了如何在测试数据集上评估模型。
输出:
6. 模型保存与加载
为了在以后使用模型,我们需要将其保存到文件中。
要加载保存的模型,可以使用以下代码:
完整代码示例
为了便于参考,以下是完整的代码示例,涵盖了从数据加载到模型评估的所有步骤。
“`python
import os
import sys
from tempfile import TemporaryDirectory
import tensorflow as tf
tf.get_logger().setLevel(‘ERROR’)
from recommenders.models.deeprec.deeprec_utils import download_deeprec_resources, prepare_hparams
from recommenders.models.deeprec.models.xDeepFM import XDeepFMModel
from recommenders.models.deeprec.io.iterator import FFMTextIterator
from recommenders.utils.notebook_utils import store_metadata
print(f”System version: {sys.version}”)
print(f”Tensorflow version: {tf.version}”)
EPOCHS = 10
BATCH_SIZE = 4096
RANDOM_SEED = 42
tmpdir = TemporaryDirectory()
data_path = tmpdir.name
yaml_file = os.path.join(data_path, ‘xDeepFM.yaml’)
output_file = os.path.join(data_path, ‘output.txt’)
train_file = os.path.join(data_path, ‘cretio_tiny_train’)
valid_file = os.path.join(data_path, ‘cretio_tiny_valid’)
test_file = os.path.join(data_path, ‘cretio_tiny_test’)
if not os.path.exists(yaml_file):
download_deeprec_resources(‘https://recodatasets.z20.web.core.windows.net/deeprec/’, data_path, ‘xdeepfmresources.zip’)
print(‘Demo with Criteo dataset’)
hparams = prepare_hparams(yaml_file,
FEATURE_COUNT=2300000,
FIELD_COUNT=39,
cross_l2=0.01,
embed_l2=0.01,
layer_l2=0.01,
learning_rate=0.002,
batch_size=BATCH_SIZE,
epochs=EPOCHS,
cross_layer_sizes=[20, 10],
init_value=0.1,
layer_sizes=[20, 20],
use_Linear_part=True,
use_CIN_part=True,
use_DNN_part=True)
print(hparams)
train_iterator = FFMTextIterator(hparams, train_file)
valid_iterator = FFMTextIterator(hparams, valid_file)
test_iterator = FFMTextIterator(hparams, test_file)
model = XDeepFMModel(hparams, train_iterator, valid_iterator)
model.load_model(output_file)
print(“开始训练 xDeepFM 模型…”)
model.fit(train_iterator, valid_iterator)
print(“评估 xDeepFM 模型…”)
res = model.run_eval(test_iterator)
print(“测试集上的评估结果:”, res)
model.save_model(output_file)
print(f”模型已保存到 {output_file}”)
# 加载保存的模型
new_model = XDeepFMModel(hparams, train_iterator, valid_iterator)
new_model.load_model(output_file)
print(“模型已加载”)
“`
7. 结果分析
在模型训练和评估之后,我们可以进一步分析结果。以下是一些常见的分析步骤:
评估指标
我们已经在测试集上计算了 AUC 和 logloss。我们可以将这些指标与基准模型进行比较,以评估 xDeepFM 的性能。
特征重要性
特征重要性分析有助于理解哪些特征对模型的预测最重要。xDeepFM 通过其嵌入层和 DNN 层捕捉特征交互,我们可以使用这些层的权重来推断特征重要性。
模型改进
可以尝试以下方法来改进模型性能:
结论
本文档详细展示了如何使用 xDeepFM 模型进行 CTR 预测。我们介绍了从数据加载、模型训练到模型评估的完整过程,并提供了代码示例。希望这些内容对您理解和使用 xDeepFM 模型有所帮助。
参考文献
[1] Jianxun Lian, et al. “xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems.” arXiv preprint arXiv:1803.05170 (2018).
通过以上步骤,您应该能够成功地在 Criteo 数据集上训练和评估 xDeepFM 模型,并进一步分析和改进模型以获得更好的性能。