Cora데이터셋으로 링크 예측이나 분류하는거 코딩해보기

민죵·2024년 8월 29일
0

GNN공부

목록 보기
2/12

https://data-newbie.tistory.com/820

본 게시글은 위 게시글을 필사하면서 공부한 내용입니다.

Objective

GNN 을 사용하여 어떻게 Link Prediction을 할 수 있는지에 대해서 알아보고자함

GNN을 사용한다? GNN이 뭔뎅 Graph Neutral Network 어떻게 동작하는건뎅?
Link Prediction: Edge를 예측하는것

Introduction

많은 예제들이 보통 node 분류를 하는데, GNN 많은 예제들이 있고, Link Prediction을 다루는 예제들은 많이 없다.
개인적으로 Node 분류도 관심이 있지만, Edge를 어떻게 예측하는지 관심이 있어 시작하게 되었고 여기서는 어떻게 예측하는지 알아보고자한다.

그렇다면 GNN은 node분류에 많이 사용된다는 거군.
Link Prediction이라는거는 어떤 Edge를 예측하는거지? Node와 Node가 있으면 그 Node사이에 어떤 Edge가 생길지 예측하는 것!?

Dataset

여기서는 자주 사용하는 Cora 데이터 세트로 진행하려고 한다.
이 데이터의 Node와 Edge 의 의미는 다음과 같다. 즉, 이 논문은 인용 그래프를 나타낸다고 할 수 있다.

______
Node머신러닝 논문
Edge논문 쌍 간의 인용
Node (Node Classification)논문 분류(7개의 클래스)
Edge (Link Prediction)인용 여부

Cora 데이터 셋이 뭔데? 어떻게 생겼는데?

Implementation

기존 코드를 활용하고 본 결과를 말씀드리자면, 직접적으로 예측한다기보다는, 임베딩 값을 계산하고 그 임베딩 된 값(노드)들끼리의 곱해서 합을 낸 결과에 sigmoid를 통해서 확률 값을 계산하는 것으로 확인했다.

논문을 어떤 값으로 임베딩하는건가?

Load Library

import os.path as osp

import torch
import torch.nn.functional as F
from sklearn.metrics import roc_auc_score
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import numpy as np
import random

from torch_geometric.utils import negative_sampling
from torch_geometric.datasets import Planetoid
import torch_geometric.transforms as T
from torch_geometric.nn import GCNConv
from torch_geometric.utils import train_test_split_edges

device = "cpu"

#전반적으로 파이토치를 쓰는 구만

Load Data

여기서는 기존 데이터를 trin_test_split_edges를 통해서 edge에 따라서 데이터를 분리해 주는 작업을 해야한다.

속성설명
xnode features(num nodes, num node features)
edge_indexedge feature (2, num deges)
pos_edge_index연결되어 있는 edge들을 의미하는 것으로 보인다. (추정)
# load the Cora dataset
dataset = 'Cora'
path = osp.join('../', 'data', dataset)
dataset = Planetoid(path, dataset, transform=T.NormalizeFeatures())
data = dataset[0]
print(dataset.data)

# Data(x=[2708, 1433], edge_index=[2, 10556], y=[2708], train_mask=[2708], val_mask=[2708], test_mask=[2708])

# use train_test_split_edges to create neg and positive edges
data.train_mask = data.val_mask = data.test_mask = data.y = None
data = train_test_split_edges(data)
print(data)

# Data(x=[2708, 1433], val_pos_edge_index=[2, 263], test_pos_edge_index=[2, 527], train_pos_edge_index=[2, 8976], train_neg_adj_mask=[2708, 2708], val_neg_edge_index=[2, 263], test_neg_edge_index=[2, 527])

Define Model

link prediction을 할 때 여기서는 encode와 decode로 나눠서 진행한다.

encode
: 다른 것들과 동일하게 기존 데이터의 node와 edge를 사용한다.
결과값으로는 해당 데이터에 뉴럴 네트워크를 거치고 나서 임베딩 된 값을 내본다. 마치 auto encoder에서 encoder와 같은 부분이다.

?

decode
: 학습을 하기 위해서는 연결되어 있는 edge와 연결되어 있지 않는 edge가 필요하고, 여기서 연결되어있지 않는 edge를 계산하기 위해서 negative_sampling 방법을 이용해서 추출한다. 그래서 decode에서는 negative sampling을 통해서 연결되지 않은 edge와 연결되어있는 pos_edge_index를 가지고 와서 각 edge별로의 해당하는 node들을 이용해서 dot product하여 logits값을 계산한다.

profile
빅데이터 / 인공지능 석사 과정 (살아남쨔 뀨륙뀨륙)

0개의 댓글