图神经网络实战(5)——常用图数据集
- 0. 前言
- 0. 图数据集介绍
- 2. Cora 数据集
- 3. Facebook Page-Page 数据集
- 小结
- 系列链接
0. 前言
图数据集往往比单纯的连接集合更丰富,节点和边也可以具有表示分数、颜色、单词等的特征。在输入数据中包含这些附加信息对于生成最佳嵌入至关重要。而由于节点和边的特征与表格(非图)数据集具有相同的结构,意味着神经网络等经典技术可以应用于这些数据。在本节中,我们将介绍两个常见图数据集:Cora
和 Facebook Page-Page
。
0. 图数据集介绍
在图神经网络 (Graph Neural Networks
, GNN
) 中所使用的图数据集通常比 Zachary’s Karate Club 数据集更丰富:它们有更多的节点、更多的边,并且包含节点特征。在本节中,我们将对常用的两个数据集进行介绍,以便让我们对这些图有一个全面的了解,并了解如何用 PyTorch Geometric
处理它们:
Cora
数据集Facebook Page-Page
数据集
2. Cora 数据集
Cora
数据集由 Sen
等人于 2008
年提出,是科学文献中最流行的节点分类数据集。它是一个由 2708
篇出版物组成的网络,其中每个连接都是一个引用。每篇出版物都被描述为一个由 1,433
个唯一单词组成的二进制向量,其中 0
和 1
分别表示没有或存在相应的单词。这种表示法在自然语言处理中也被称为二进制词袋 (bag of words
),我们的目标是将每个节点分类到七个类别之一。
无论数据类型如何,可视化始终是我们了解所面临问题的重要步骤。然而,当图过大时,使用 networkx
等 Python
可视化库将无法进行可视化,因此研究人员为图数据可视化开发了专用工具,我们将使用两个流行的工具:yEd Live 和 Gephi 进行图数据集可视化。
下图是用 yEd Live
绘制的 Cora
数据集图。可以看到橙色为论文对应的节点,绿色为论文之间的连接。一些论文之间的相互连接的非常紧密,以至于形成了论文簇,这些簇比连接不紧密的节点更容易分类。
接下来,导入 Cora
数据集,并用 PyTorch Geometric
库分析其主要特征,PyTorch Geometric
库有一个专门的类,用于下载数据集并返回相关的数据结构。PyTorch Geometric
是深度学习框架 PyTorch 的扩展库,用于简化图神经网络的实现。PyTorch Geometric
的安装与其它 Python
第三方库一样,只需在 shell
中使用 pip
命令即可:
pip installl torch_geometric
(1) 从 PyTorch Geometric
中导入 Planetoid
类:
import torch
from torch_geometric.datasets import Planetoid
(2) 使用 Planetoid
类下载数据集:
dataset = Planetoid(root=".", name="Cora")
(3) Cora
只有一个图,将其存储在 data
变量中:
data = dataset[0]
(4) 打印数据集的相关信息:
print(f'Dataset: {dataset}')
print('---------------')
print(f'Number of graphs: {len(dataset)}')
print(f'Number of nodes: {data.x.shape[0]}')
print(f'Number of features: {dataset.num_features}')
print(f'Number of classes: {dataset.num_classes}')
(5) 输出结果如下所示:
Dataset: Cora()
---------------
Number of graphs: 1
Number of nodes: 2708
Number of features: 1433
Number of classes: 7
(6) 通过 PyTorch Geometric
的专用函数,还可以获得更多详细信息:
# Print information about the graph
print(f'\nGraph:')
print('------')
print(f'Edges are directed: {data.is_directed()}')
print(f'Graph has isolated nodes: {data.has_isolated_nodes()}')
print(f'Graph has loops: {data.has_self_loops()}')
(7) 输出结果如下所示:
Graph:
------
Edges are directed: False
Graph has isolated nodes: False
Graph has loops: False
第一个输出结果输出了节点数、特征和类别的信息,第二个输出则提供了关于图本身的更多信息:边是无向的,每个节点都有邻居,而且图不存在自循环。我们也可以使用 PyTorch Geometric
的 utils
函数测试其他属性。
了解了 Cora
数据集后,我们继续介绍一个更能代表真实世界社交网络规模的数据集,Facebook Page-Page
数据集。
3. Facebook Page-Page 数据集
该数据集由 Rozemberczki
等人于 2019
年提出,它是在 2017
年 11
月使用 Facebook Graph API
创建的。这个数据集包含 22470
个节点,其中每个节点都代表一个 Facebook
页面。当页面之间存在互赞行为时,它们就会被连接起来,节点特征( 128
维向量)根据这些页面所有者撰写的文字描述创建。我们的目标是将每个节点分为四种类别之一:oliticians
、companies
、television shows
和 governmental organizations
。
Facebook Page-Page
数据集与 Cora
数据集类似,是一个具有节点分类任务的社交网络。但与 Cora
相比有如下区别:
- 节点数量更多 (
Cora
为2,708
个节点,而Facebook Page-Page
包含22,470
个) - 节点特征的维度较小 (
Cora
节点特征维度为1,433
,而Facebook Page-Page
为128
) - 目标是将每个节点分为
4
个类别,而不是7
个类别(类别较少,更容易分类)
下图是使用 Gephi
对数据集进行的可视化的效果。为了提高性能,我们忽略了连接数少的节点。其余节点的大小取决于它们的连接数,而它们的颜色则表示它们所属的类别。
可以按照与 Cora
相同的方法导入 Facebook Page-Page
数据集。
(1) 从 PyTorch Geometric
中导入 FacebookPagePage
类:
from torch_geometric.datasets import FacebookPagePage
(2) 使用 FacebookPagePage
类下载数据集:
dataset = FacebookPagePage(root=".", name="FacebookPagePage")
(3) 将图存储在 data
变量中:
data = dataset[0]
(4) 打印数据集的相关信息:
print(f'Dataset: {dataset}')
print('-----------------------')
print(f'Number of graphs: {len(dataset)}')
print(f'Number of nodes: {data.x.shape[0]}')
print(f'Number of features: {dataset.num_features}')
print(f'Number of classes: {dataset.num_classes}')
输出结果如下所示:
Dataset: FacebookPagePage()
-----------------------
Number of graphs: 1
Number of nodes: 22470
Number of features: 128
Number of classes: 4
(5) 通过 PyTorch Geometric
的专用函数,获得更多详细信息:
print(f'\nGraph:')
print('------')
print(f'Edges are directed: {data.is_directed()}')
print(f'Graph has isolated nodes: {data.has_isolated_nodes()}')
print(f'Graph has loops: {data.has_self_loops()}')
输出结果如下所示:
Graph:
------
Edges are directed: False
Graph has isolated nodes: False
Graph has loops: True
代码 (4)
中的输出结果确认了我们在数据集描述中看到的节点和类别的数量,(5)
中的输出结果表明这个图中有自循环——某些页面连接到它们自身。
(6) 与 Cora
不同,Facebook Page-Page
默认情况下没有训练、评估和测试掩码,我们可以使用 range()
函数创建掩码:
data.train_mask = range(18000)
data.val_mask = range(18001, 20000)
data.test_mask = range(20001, 22470)
(7) PyTorch Geometric
还提供了一个转换函数,可以在加载数据集时计算随机掩码:
import torch_geometric.transforms as T
小结
Cora
和 Facebook Page-Page
是图神经网络领域中经常使用的两个基准图数据集,通常用来比较不同模型的性能。在本节中,介绍了如何使用 PyTorch Geometric
库提供的数据集类加载 Cora
和 Facebook Page-Page
数据集,并探索了两个数据集的主要特征。
系列链接
图神经网络实战(1)——图神经网络(Graph Neural Networks, GNN)基础
图神经网络实战(2)——图论基础
图神经网络实战(3)——基于DeepWalk创建节点表示
图神经网络实战(4)——基于Node2Vec改进嵌入质量