PyG lesson2: 벤치마크 데이터셋 (train/test분리)

pyg
Author

신록예찬

Published

July 7, 2023

summary

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

Download notebook

!wget https://raw.githubusercontent.com/miruetoto/yechan3/main/posts/2_Studies/PyG/ls2.ipynb

Ref

벤치마크 데이터셋

- 데이터셋은 아래의 모듈안에 정리되어 있음

dir(torch_geometric.datasets)[:5]
['AMiner', 'AQSOL', 'Actor', 'AirfRANS', 'Airports']

데이터셋1: TUDataset

- 다운로드

dataset = torch_geometric.datasets.TUDataset(root='/tmp/ENZYMES', name='ENZYMES')
!ls /tmp
Cora
ENZYMES
Rtmp0d0w4u
Rtmp1uvosb
Rtmp3D2vcG
Rtmp44FGCf
Rtmp4ekp1G
Rtmp5zQZ7f
Rtmp6Aqjn9
Rtmp8SRqeA
Rtmp8iV8GY
Rtmp9RDC4h
RtmpBOkgTD
RtmpDr9n3o
RtmpEgYVqu
RtmpEl7QTm
RtmpFeImCs
RtmpFmhp1e
RtmpL7P0uL
RtmpLcdCbN
RtmpMpEHD4
RtmpOBjmj9
RtmpOldkCG
RtmpPL5aqG
RtmpPPPXuL
RtmpQdjXXP
RtmpTnWgqy
RtmpUu8TkG
RtmpVZ8b1G
RtmpWPuxY0
RtmpXaQxuK
RtmpZQXbWV
RtmpZVl5wD
RtmpZbltsD
Rtmpf3XUWv
Rtmphh0IeU
RtmpiMl5X7
RtmpiYetgv
RtmpkuWMxJ
RtmpnEvGCG
RtmpnhtMSB
Rtmpp50EUq
RtmptUcaRd
Rtmptfuzcf
RtmpudULKs
RtmpuyoGfm
RtmpveCzOk
Rtmpw3VuI5
Rtmpy89nyf
RtmpyQeKId
__autograph_generated_file430lm2pd.py
__autograph_generated_file52srl_jv.py
__autograph_generated_file6_nk4ksw.py
__autograph_generated_fileamhf1l7g.py
__autograph_generated_filegjdd1fac.py
__autograph_generated_filemy63yhq6.py
__autograph_generated_filenb5xfoyk.py
__autograph_generated_fileyzbye00x.py
__autograph_generated_filezr0_2k4f.py
__pycache__
pymp-4hbgfo48
pymp-595nrv8o
pymp-71z0yfzn
pymp-lkwub_4z
pymp-nk_fy8vp
pymp-v_psr5y6
pymp-vs8hkilv
quarto-session152a4cba
quarto-session1686cca4
quarto-session2a43de6f
quarto-session2a944a7b
quarto-session534bf3db
quarto-session9f442f6c
quarto-sessiona3c0156c
quarto-sessionb632f660
quarto-sessionbcbd8145
quarto-sessionbf2ff88d
quarto-sessionda8525d4
quarto-sessionec0b2ed4
quarto-sessionf3d60c95
snap-private-tmp
systemd-private-39daab962ea2479c8b8ce3f60ea86a38-ModemManager.service-cB7j4i
systemd-private-39daab962ea2479c8b8ce3f60ea86a38-colord.service-YdaPNi
systemd-private-39daab962ea2479c8b8ce3f60ea86a38-switcheroo-control.service-2a7hSg
systemd-private-39daab962ea2479c8b8ce3f60ea86a38-systemd-logind.service-FATPQg
systemd-private-39daab962ea2479c8b8ce3f60ea86a38-systemd-resolved.service-oRk1Ei
systemd-private-39daab962ea2479c8b8ce3f60ea86a38-systemd-timesyncd.service-rxKFnh
systemd-private-39daab962ea2479c8b8ce3f60ea86a38-upower.service-z0HyVh
tfhub_modules
tmp_h0vghma.json
tracker-extract-files.1000
tracker-extract-files.125
  • /tmp 에 다운로드되어있음

정보

- 기본정보: ENZYMES dataset

(ChatGPT) ENZYMES는 그래프 분류를 위한 벤치마크 데이터셋 중 하나입니다. 이 데이터셋은 600개의 그래프로 구성되어 있으며, 6개의 클래스로 분류됩니다. 각 그래프는 효소(enzyme) 분자의 구조를 나타내며, 그래프의 노드는 원자(atom)를 나타내고, 엣지(edge)는 원자 간의 연결을 나타냅니다. ENZYMES 데이터셋은 화학 및 생물 정보학 분야에서 그래프 분류 알고리즘의 성능을 평가하기 위해 사용될 수 있습니다. 그래프 분류 알고리즘은 주어진 그래프를 특정 클래스 레이블로 분류하는 작업을 수행하는데 사용됩니다. 예를 들어, ENZYMES 데이터셋의 그래프는 특정 효소 종류를 나타내며, 그래프 분류 알고리즘은 주어진 효소 그래프가 어떤 종류의 효소인지 예측할 수 있습니다. PyG를 사용하여 ENZYMES 데이터셋을 초기화하면 해당 데이터셋을 다운로드하고 필요한 전처리를 자동으로 수행할 수 있습니다. 그래프 데이터를 다루는 머신 러닝 모델을 구축하고 훈련시키기 위해 ENZYMES 데이터셋을 사용할 수 있습니다.

dataset # 데이터셋 이름
ENZYMES(600)
len(dataset) # 이 데이터셋에는 600개의 그래프가 있음
600
dataset.num_classes # 6개의 클래스
6
dataset.num_node_features # 각 노드에는 3개의 피처가 있음
3

- 600개의 그래프중 첫번째 그래프에 접근

dataset[0]
Data(edge_index=[2, 168], x=[37, 3], y=[1])
  • x=[37, 3]: \(|{\cal V}|=37\), \(f \in \mathbb{R}^3\)
  • edge_index=[2, 168]: \(|{\cal E}|=168\)

Train/Test 분리

- 600개의 그래프중 540를 train으로, 60개를 test로

train_dataset = dataset[:540]
test_dataset = dataset[540:] 

데이터셋2: Cora

- 다운로드

dataset = torch_geometric.datasets.Planetoid(root='/tmp/Cora', name='Cora')

정보

ChatGPT: Cora는 그래프 분류를 위한 벤치마크 데이터셋 중 하나로, PyG에서도 사용할 수 있습니다. 이 데이터셋은 기계 학습 및 정보 검색 분야에서 널리 사용되는 학술 논문들의 인용 네트워크를 나타냅니다. Cora 데이터셋은 컴퓨터 과학 분야의 논문을 대상으로 합니다. 각 논문은 그래프의 노드로 표현되며, 노드는 논문을 나타냅니다. 노드 간의 엣지는 논문들 사이의 인용 관계를 나타냅니다. 따라서 Cora 데이터셋은 논문의 텍스트 기반 정보와 인용 관계에 대한 그래프 구조를 제공합니다. Cora 데이터셋은 7개의 클래스로 분류되며, 각 논문은 특성 벡터(feature vector)로 표현됩니다. 이 특성 벡터에는 논문의 단어 등 다양한 정보가 포함될 수 있습니다. PyG를 사용하여 Cora 데이터셋을 초기화하면 해당 데이터셋을 다운로드하고 전처리를 자동으로 수행할 수 있습니다. 이를 통해 머신 러닝 모델을 훈련시켜 Cora 데이터셋의 논문을 분류하거나 다양한 작업을 수행할 수 있습니다.

- 기본정보

len(dataset) # 하나의 그래프가 있음
1
dataset.num_classes # 7개의 클래스가 있음
7
dataset.num_node_features # 각 노드는 1433개의 특징이 있음. (논문에 포함된 단어등 다양한 특성이 담겨있을 수 있음) 
1433

- 그래프에 접근

dataset[0] # 기본정보
Data(x=[2708, 1433], edge_index=[2, 10556], y=[2708], train_mask=[2708], val_mask=[2708], test_mask=[2708])
  • x=[2708, 1433]: 2708개의 논문이 있고, 각 논문은 1433개의 특징벡터들로 이루어져 있음.
  • edge_index=[2, 10556]: 논문간의 인용은 약 10556.
  • y=[2708]:
dataset[0].x.shape # 2708개의 논문이 있고 1433개의 특징벡터를 가짐
torch.Size([2708, 1433])
dataset[0].y.unique() # 논문이 7개의 카테고리로 분류되는듯
tensor([0, 1, 2, 3, 4, 5, 6])

Train/Test (이미 분리되어 있음)

dataset[0].train_mask 
# dataset[0].train_mask 는 True, False로 이루어져 있는 길이가 2708(=노드수=논문수)인 벡터
# 여기에서 True인 노드만 훈련함
tensor([ True,  True,  True,  ..., False, False, False])
dataset[0].train_mask.sum() # 140개의 노드만 훈련함? 
tensor(140)
dataset[0].val_mask.sum() # val은 500개의 노드?
tensor(500)
dataset[0].test_mask.sum() # test set은 1000?
tensor(1000)
dataset.edge_index
tensor([[   0,    0,    0,  ..., 2707, 2707, 2707],
        [ 633, 1862, 2582,  ...,  598, 1473, 2706]])
pd.DataFrame(dataset[0].train_mask)[0].eq('True')
0       False
1       False
2       False
3       False
4       False
        ...  
2703    False
2704    False
2705    False
2706    False
2707    False
Name: 0, Length: 2708, dtype: bool