图数据工作流

已经在图数据处理上干了快一年,却感觉一直在等待Neo4j和csv,优化做了又感觉好像没做。
就在这里看看别人的一些数据导入做法,或许可以有点启发

PyG的csv导入教程

原文

在本例中,我们将展示如何加载一组 *.csv 文件作为输入,并从中构造一个异构图,该异构图可以作为异构图模型的输入。本教程还可以作为 examples/hetero 目录中的一个可执行示例脚本使用。

我们将使用 GroupLens 收集的 MovieLens 影像数据集。这个玩具数据集描述了来自 MovieLens 的5星评级和标签活动。该数据集包含来自600多个用户的超过9000部电影的大约10万次评级。我们将使用这个数据集生成两个节点类型,分别为电影和用户保存数据,以及一个连接用户和电影的边缘类型,表示用户如何评价特定电影的关系。

首先,我们将数据集下载到一个任意的文件夹(在本例中是工作目录) :

1
2
3
4
5
6
7
from torch_geometric.data import download_url, extract_zip

url = 'https://files.grouplens.org/datasets/movielens/ml-latest-small.zip'
extract_zip(download_url(url, '.'), '.')

movie_path = './ml-latest-small/movies.csv'
rating_path = './ml-latest-small/ratings.csv'

在创建异构图之前,让我们先看一下数据。

1
2
3
4
import pandas as pd

print(pd.read_csv(movie_path).head())
print(pd.read_csv(rating_path).head())

我们看到movies.csv文件提供了三列:movieId为每部电影分配了一个唯一的标识符,而title和genres列代表了给定电影的标题和流派。
我们可以利用这两列来定义一个可以被机器学习模型轻松解释的特征表示。

ratings.csv数据连接了用户(由userId提供)和电影(由movieId提供),并定义了一个特定的用户是如何评价一部特定的电影(评分)。为了简单起见,我们不使用额外的时间戳信息。

为了用PyG数据格式表示这些数据,我们首先定义了一个方法load_node_csv(),它读入一个*.csv文件并返回一个形状为[num_nodes, num_features]的节点级特征表示x。

这里,load_node_csv()从路径中读取*.csv文件,并创建一个字典映射,将其索引列映射到{ 0, …, num_rows - 1 }范围内的连续值。这是需要的,因为我们希望我们最终的数据表示尽可能的紧凑,例如,第一行的电影表示应该可以通过x[0]访问。

我们进一步利用编码器的概念,它定义了特定列的值应该如何被编码成数字特征表示。例如,我们可以定义一个句子编码器,将原始列字符串编码为低维嵌入。为此,我们利用了优秀的句子转换器库,它提供了大量最先进的预训练NLP嵌入模型。