图数据集Planetoid御三家:Cora,CiteSeer,PubMed详解

时间:2024-10-26 07:30:45

诸神缄默不语-个人****博文目录

文章目录

  • 1. 数据集基本情况介绍
    • 1.1 Cora数据集
    • 1.2 CiteSeer数据集
    • 1.3 PubMed
  • 2. PyG数据集的Planetoid调用接口
  • 3. Planetoid官方数据处理方式
  • 4. 原始数据处理介绍
  • 5. CogDL的数据集调用接口
  • 6. 本文撰写过程中所使用的参考资料

Cora,CiteSeer,PubMed应该是GNN学习过程中没有人能逃得过的三大关口,在数据集上的意义可能相当于GCN,GraphSAGE,GAT之于空域GNN的意义。
本文旨在介绍御三家数据集,包括其基本信息和使用方式。
您可以根据您所需数据使用情况来观看本文。譬如若您只想在PyG建模时调用该数据集,可以仅观看第一节;如果您想了解如何将原始数据处理成类似御三家数据集的格式,可以仅观看第三节。
Enjoy!

本文将首先介绍数据集的基本情况,接下来以集成度从高到底的顺序进行撰写数据集的调取和使用方式:
第2节,从PyG的数据集调用接口开始介绍数据集的使用方式,并在这一节介绍三个数据集的基本信息(毕竟集成度高,数据很好用)。
第3节,介绍Planetoid数据(PyG数据来源)的使用和处理方式。
第4节,介绍从原始数据来源下载并处理数据的方式,包括如何将这种类似的原始数据处理成类Planetoid数据的方式。
第5节,最后介绍另一个集成度较高、但是流行度较低的CogDL中的数据集接口及使用方式。

1. 数据集基本情况介绍

Cora,CiteSeer,PubMed是三个文献引用网络数据集。
都是一张无向图,节点代表文件(论文文献),边代表引用关系。
标签在节点上,多分类任务。
节点特征是word vector,每一元素都是0-1二元变量,描述每个单词在paper中是否存在。统计时经过了stemming1和去除停用词,并去掉了小于10篇文档中出现过的单词。

1.1 Cora数据集

2708个节点,5429条边。标签共7个类别。数据集的特征维度是1433维。

Cora数据集的节点是机器学习论文,论文主题(标签)分为以下七类之一:
Case_Based基于案例
Genetic_Algorithms遗传算法
Neural_Networks神经网络
Probabilistic_Methods概率方法
Reinforcement_Learning强化学习
Rule_Learning规则学习
Theory理论

论文的选择方式是,在最终语料库中,每篇论文引用或被至少一篇其他论文引用(即没有孤立点存在)。

1.2 CiteSeer数据集

3312个节点,4723条边。标签共7个类别。数据集的特征维度是3703维。

论文主题(标签)分为以下七类之一:
Agents
AI
DB
IR
ML
HCI

论文的选择方式是,在最终语料库中,每篇论文引用或被至少一篇其他论文引用(即没有孤立点存在)。

1.3 PubMed

略。

2. PyG数据集的Planetoid调用接口

torch_geometric.官方文档

PyG所使用的御三家数据来源就是这篇论文:Revisiting Semi-Supervised Learning with Graph Embeddings. Zhilin Yang, William W. Cohen, Ruslan Salakhutdinov. ICML 2016.

代码:

from torch_geometric.datasets import Planetoid

ds_rn_map=[('/tmp/cora','Cora'),('./tmp/citeseer','CiteSeer'),('./tmp/pubmed','PubMed')]

for i in range(3):  #public split
    dataset = Planetoid(root=ds_rn_map[i][0], name=ds_rn_map[i][1])
    print(dataset)
    print('dataset.num_classes '+str(dataset.num_classes))
    print('dataset.num_node_features '+str(dataset.num_node_features))
    data=dataset[0]
    print(data)
    print('data.is_undirected() '+str(data.is_undirected()))
    print('data.train_mask.sum().item() '+str(data.train_mask.sum().item()))
    print('data.val_mask.sum().item() '+str(data.val_mask.sum().item()))
    print('data.test_mask.sum().item() '+str(data.test_mask.sum().item()))
    print('data.num_nodes '+str(data.num_nodes))
    print('data.num_edges '+str(data.num_edges))
    print('data.contains_isolated_nodes() '+str(data.contains_isolated_nodes()))
    print('data.contains_self_loops() '+str(data.contains_self_loops()))
    print()

输出:

Cora()
dataset.num_classes 7
dataset.num_node_features 1433
Data(edge_index=[2, 10556], test_mask=[2708], train_mask=[2708], val_mask=[2708], x=[2708, 1433], y=[2708])
data.is_undirected() True
data.train_mask.sum().item() 140
data.val_mask.sum().item() 500
data.test_mask.sum().item() 1000
data.num_nodes 2708
data.num_edges 10556
data.contains_isolated_nodes() False
data.contains_self_loops() False

CiteSeer()
dataset.num_classes 6
dataset.num_node_features 3703
Data(edge_index=[2, 9104], test_mask=[3327], train_mask=[3327], val_mask=[3327], x=[3327, 3703], y=[3327])
data.is_undirected() True
data.train_mask.sum().item() 120
data.val_mask.sum().item() 500
data.test_mask.sum().item() 1000
data.num_nodes 3327
data.num_edges 9104
data.contains_isolated_nodes() True
data.contains_self_loops() False

PubMed()
dataset.num_classes 3
dataset.num_node_features 500
Data(edge_index=[2, 88648], test_mask=[19717], train_mask=[19717], val_mask=[19717], x=[19717, 500], y=[19717])
data.is_undirected() True
data.train_mask.sum().item() 60
data.val_mask.sum().item() 500
data.test_mask.sum().item() 1000
data.num_nodes 19717
data.num_edges 88648
data.contains_isolated_nodes() False
data.contains_self_loops() False

3. Planetoid官方数据处理方式

kimiyoung/planetoid: Semi-supervised learning with graph embeddings

(上帝知道他为什么要写成这种混乱的格式)

具体的我忘了,总之大概来说就是allx/y是x+tx和y+ty,分别是所有节点的特征和标签。
特征是CSR格式稀疏矩阵,关于稀疏矩阵的介绍可以参考这篇博文:稀疏矩阵的定义(COO、CSC、CSR) - 简书
标签是独热编码
graph是邻接列表(Adjacency List),关于Adjacency List的定义可以参考我写的另一篇博文:cs224w(图机器学习)2021冬季课程学习笔记1 Introduction; Machine Learning for Graphs
是测试节点索引列表(每个元素是索引数字),可以直接打开的文本文件

导入x的参考代码:

import pickle as pkl
x=pkl.load(open(ds_rn_map[0][0]+r'/Cora/raw/','rb'), encoding='latin1')

x是:

<140x1433 sparse matrix of type '<class 'numpy.float32'>'
	with 2647 stored elements in Compressed Sparse Row format>

x的type是:.csr_matrix

导入y的参考代码:

ally=pkl.load(open(ds_rn_map[0][0]+r'/Cora/raw/','rb'), encoding='latin1')

y是:

array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 1, 0, 0],
       [0, 0, 0, ..., 1, 0, 0],
       ...,
       [0, 1, 0, ..., 0, 0, 0],
       [0, 0, 1, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 1, 0]], dtype=int32)

导入graph的参考代码:

graph=pkl.load(open(ds_rn_map[0][0]+r'/Cora/raw/','rb'), encoding='latin1')

graph是:

defaultdict(list,
            {0: [633, 1862, 2582],
             1: [2, 652, 654],
             2: [1986, 332, 1666, 1, 1454],
             3: [2544],
             4: [2176, 1016, 2176, 1761, 1256, 2175],
             5: [1629, 2546, 1659, 1659],
             6: [1416, 1602, 1042, 373],
             7: [208],
             8: [281, 1996, 269],
             9: [2614, 723, 723],
             10: [476, 2545],
             11: [1655, 1839],
             12: [2661, 1001, 1318, 2662],
             13: [1810, 1701],
             14: [2034, 2075, 158, 2077, 2668],
             15: [2367, 1093, 1090, 1271, 1093],
             16: [2444, 1632, 970, 2642],
             17: [24, 2140, 1316, 1315, 927],
             18: [2082, 139, 1786, 1560, 2145],
             19: [1939],
             20: [1072, 2374, 2375, 2269, 2270],
             21: [1043, 2310],
             22: [1703, 1702, 2238, 39, 1234],
             23: [2159],
...
             996: [2248, 2518, 368, 1257, 1135, 428],
             997: [1837, 183, 182, 183],
             998: [978, 976, 1103, 2365, 1431, 1284, 1431],
             999: [1358, 346],
             ...})

4. 原始数据处理介绍

数据集来源:Datasets | LINQS

Cora数据集下载地址:/public/lbc/
CiteSeer数据集下载地址:/public/lbc/
PubMed数据集下载地址:/public/

Linux可以通过wget下载文件,并用tar解压。
tgz压缩包中都含有README文件,介绍数据情况。

参考终端代码:

wget -c /public/ -O 
tar -xzvf 

Cora压缩包里的README文件里面说数据集来源是这个网站:/data,我打不开这个网站就很离谱……

略。

5. CogDL的数据集调用接口

CogDL官网(中文版):CogDL工具包
THUDM/cogdl: CogDL: An Extensive Toolkit for Deep Learning on Graphs

cogdl/ at master · THUDM/cogdl

略。

6. 本文撰写过程中所使用的参考资料

  1. GCN使用的数据集Cora、Citeseer、Pubmed、Tox21格式_知行合一,止于至善-****博客_citeseer数据集
    对御三家数据集,主要介绍了Planetoid中数据格式的处理方法。
  2. 图数据集之cora数据集介绍- 用pyton处理 - 可用于GCN任务_kakazai.cn-****博客_cora数据集
    对原始数据的处理方法。
  3. Cora数据集介绍+python读取_小执着的博客-****博客_cora数据集
  4. GCN使用的数据集Cora、Citeseer、Pubmed、Tox21格式_tox21数据集-****博客:这篇介绍的也是Planetoid官方数据及其处理方式
  5. 稀疏矩阵:
    1. scipy的sparse官方文档
    2. SciPy稀疏矩阵模块简介 - 知乎
    3. 稀疏矩阵的存储方法(DOK、LIL、COO、CSR, CRS)_houzhizhen的专栏-****博客
  6. GCN代码中加载数据部分:gcn/ at master · tkipf/gcn
  7. 在linux中如何解压.tgz_漂洋过海的油条的博客-****博客_tgz解压

  1. 词干提取(stemming)和词形还原(lemmatization)比较_kaierlong的博客-****博客
    就stemming大概来说就是把一个词的各种形式归为同一。 ↩︎