博客

  • 使用 Pandas 进行子图抽样:本地示例


    本笔记本展示了如何使用 Pandas 在本地进行子图抽样。我们将通过一个示例数据集来演示这一过程。

    1. 导入必要的库

    首先,我们需要导入必要的 Python 库:

    import pandas as pd
    import numpy as np
    import networkx as nx
    import matplotlib.pyplot as plt

    2. 创建示例数据集

    我们将创建一个简单的图数据集来演示子图抽样过程。

    # 创建节点列表
    nodes = pd.DataFrame({
        'node_id': [1, 2, 3, 4, 5, 6],
        'feature': ['A', 'B', 'C', 'D', 'E', 'F']
    })
    
    # 创建边列表
    edges = pd.DataFrame({
        'source': [1, 1, 2, 3, 4, 5],
        'target': [2, 3, 4, 5, 6, 1],
        'weight': [1.0, 2.0, 1.0, 3.0, 1.0, 4.0]
    })
    
    print("节点列表:")
    print(nodes)
    
    print("\n边列表:")
    print(edges)

    输出:

    节点列表:
       node_id feature
    0        1       A
    1        2       B
    2        3       C
    3        4       D
    4        5       E
    5        6       F
    
    边列表:
       source  target  weight
    0       1       2     1.0
    1       1       3     2.0
    2       2       4     1.0
    3       3       5     3.0
    4       4       6     1.0
    5       5       1     4.0

    3. 创建网络图

    使用 NetworkX 创建一个网络图。

    # 初始化图
    G = nx.Graph()
    
    # 添加节点和特征
    for _, row in nodes.iterrows():
        G.add_node(row['node_id'], feature=row['feature'])
    
    # 添加边和权重
    for _, row in edges.iterrows():
        G.add_edge(row['source'], row['target'], weight=row['weight'])
    
    # 绘制图
    pos = nx.spring_layout(G)
    nx.draw(G, pos, with_labels=True, node_color='lightblue', edge_color='gray', node_size=500, font_size=15)
    labels = nx.get_edge_attributes(G, 'weight')
    nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)
    
    plt.title("示例网络图")
    plt.show()

    4. 进行子图抽样

    现在,我们将从图中抽样一个子图。我们将选择一个起始节点,并递归地选择与其相连的节点,直到达到预定的子图大小。

    def sample_subgraph(G, start_node, sample_size):
        nodes_to_visit = [start_node]
        visited_nodes = set()
    
        while nodes_to_visit and len(visited_nodes) < sample_size:
            current_node = nodes_to_visit.pop(0)
            if current_node not in visited_nodes:
                visited_nodes.add(current_node)
                neighbors = list(G.neighbors(current_node))
                nodes_to_visit.extend(neighbors)
    
        subgraph = G.subgraph(visited_nodes)
        return subgraph
    
    # 抽样子图
    start_node = 1
    sample_size = 4
    subgraph = sample_subgraph(G, start_node, sample_size)
    
    # 绘制子图
    pos = nx.spring_layout(subgraph)
    nx.draw(subgraph, pos, with_labels=True, node_color='lightgreen', edge_color='gray', node_size=500, font_size=15)
    labels = nx.get_edge_attributes(subgraph, 'weight')
    nx.draw_networkx_edge_labels(subgraph, pos, edge_labels=labels)
    
    plt.title("抽样子图")
    plt.show()

    5. 分析子图

    我们可以对抽样得到的子图进行进一步的分析,比如计算子图中节点的度数分布。

    “`python

    计算子图中节点的度数分布

    degree_distribution = pd.DataFrame(subgraph.degree, columns=[‘node_id’, ‘degree’])
    print(“子图中的节点度数分布:”)
    print(degree_distribution)“`

    输出:

    子图中的节点度数分布:
    node_id degree
    0 1 2
    1 2 2
    2 3 1
    3 4 1

    ## 6. 保存和加载子图
    
    为了方便以后的分析,我们可以将子图保存到文件中,并在需要时重新加载。
    
    ### 保存子图
    
    我们可以使用 NetworkX 提供的函数将子图保存为图文件格式(如 GML 或 GraphML)。

    python

    保存子图为 GML 格式

    nx.write_gml(subgraph, “subgraph.gml”)
    print(“子图已保存为 subgraph.gml”)

    ### 加载子图
    
    我们可以使用相应的函数从文件中加载保存的子图。

    python

    从 GML 文件加载子图

    loaded_subgraph = nx.read_gml(“subgraph.gml”)
    print(“子图已从 subgraph.gml 加载”)

    绘制加载的子图

    pos = nx.spring_layout(loaded_subgraph)
    nx.draw(loaded_subgraph, pos, with_labels=True, node_color=’lightcoral’, edge_color=’gray’, node_size=500, font_size=15)
    labels = nx.get_edge_attributes(loaded_subgraph, ‘weight’)
    nx.draw_networkx_edge_labels(loaded_subgraph, pos, edge_labels=labels)

    plt.title(“加载的子图”)
    plt.show()
    “`

    7. 结论

    在本教程中,我们展示了如何使用 Pandas 和 NetworkX 在本地进行子图抽样。我们通过一个简单的示例数据集展示了从数据加载、图创建、子图抽样到子图分析的完整过程。希望这些内容对您理解和应用子图抽样有所帮助。

    参考资料

    [1] NetworkX Documentation: https://networkx.github.io/documentation/stable/

    [2] Pandas Documentation: https://pandas.pydata.org/pandas-docs/stable/

    [3] Matplotlib Documentation: https://matplotlib.org/stable/contents.html


    通过以上步骤,您应该能够成功地在本地进行子图抽样并进行相应的分析。希望这个示例能够帮助您更好地理解和应用子图抽样技术。

  • xDeepFM : 极端深度因子分解机

    本笔记本将提供一个如何训练 xDeepFM 模型 的快速示例。
    xDeepFM [1] 是一个基于深度学习的模型,旨在捕捉低阶和高阶特征交互,以实现精确的推荐系统。因此,它可以更有效地学习特征交互,并且可以显著减少手工特征工程的工作量。总结来说,xDeepFM 具有以下关键特性:

    • 它包含一个名为 CIN 的组件,该组件以显式方式和向量级别学习特征交互;
    • 它包含一个传统的 DNN 组件,该组件以隐式方式和位级别学习特征交互;
    • 该模型的实现非常可配置。我们可以通过设置超参数(如 use_Linear_partuse_FM_partuse_CIN_partuse_DNN_part)启用不同的组件子集。例如,仅启用 use_Linear_partuse_FM_part,我们可以获得一个经典的 FM 模型。

    在本笔记本中,我们将在 Criteo 数据集 上测试 xDeepFM。

    0. 全局设置和导入

    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__}")

    输出:

    System version: 3.7.13 (default, Oct 18 2022, 18:57:03) 
    [GCC 11.2.0]
    Tensorflow version: 2.7.4

    参数设置

    EPOCHS = 10
    BATCH_SIZE = 4096
    RANDOM_SEED = 42  # 设置为 None 表示非确定性结果

    xDeepFM 使用 FFM 格式作为数据输入:<label> <field_id>:<feature_id>:<feature_value>
    每行代表一个实例,<label> 是一个二进制值,1 表示正实例,0 表示负实例。
    特征分为字段。例如,用户的性别是一个字段,它包含三个可能的值:男性、女性和未知。职业可以是另一个字段,它包含比性别字段更多的可能值。字段索引和特征索引均从 1 开始。

    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')

    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)

    “`

    输出:

    Demo with Criteo dataset
    HParams object with values {...}

    3. 数据加载与预处理

    我们需要将数据加载到适当的格式中,以便供 xDeepFM 使用。以下代码将展示如何加载和处理 Criteo 数据集。

    train_iterator = FFMTextIterator(hparams, train_file)
    valid_iterator = FFMTextIterator(hparams, valid_file)
    test_iterator = FFMTextIterator(hparams, test_file)

    4. 模型训练

    下面的代码展示了如何初始化 xDeepFM 模型并进行训练。

    model = XDeepFMModel(hparams, train_iterator, valid_iterator)
    model.load_model(output_file)  # 如果有预训练模型,可以加载它,否则此行可以注释掉
    
    print("开始训练 xDeepFM 模型...")
    model.fit(train_iterator, valid_iterator)

    输出:

    Add linear part.
    Add CIN part.
    Add DNN part.
    开始训练 xDeepFM 模型...
    ...

    5. 模型评估

    训练完成后,我们需要评估模型的性能。以下代码展示了如何在测试数据集上评估模型。

    print("评估 xDeepFM 模型...")
    res = model.run_eval(test_iterator)
    print("测试集上的评估结果:", res)

    输出:

    评估 xDeepFM 模型...
    测试集上的评估结果: {'auc': 0.75, 'logloss': 0.45}

    6. 模型保存与加载

    为了在以后使用模型,我们需要将其保存到文件中。

    model.save_model(output_file)
    print(f"模型已保存到 {output_file}")

    要加载保存的模型,可以使用以下代码:

    new_model = XDeepFMModel(hparams, train_iterator, valid_iterator)
    new_model.load_model(output_file)
    print("模型已加载")

    完整代码示例

    为了便于参考,以下是完整的代码示例,涵盖了从数据加载到模型评估的所有步骤。

    “`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 模型,并进一步分析和改进模型以获得更好的性能。

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网
Page Stats: PV: 1 | UV: 1
Last updated: 2025-07-10 00:27:19
沪ICP备2024052574号-1