Graph Machine Learning
그래프 머신 러닝(Graph Machine Learning)은 일반 머신 러닝 모델들과 매우 비슷하다. 가장 큰 차이점은 기존 테이블 형식의 정형 데이터들을 그래프 구조로 변환하여 Input 데이터로 재생성해야 한다는 것이다.
(최근 AWS Neptune 직원분들께서 설명해주러 왔었는데... 그분들 말에 의하면 테이블 데이터를 Graph DB로 바꿔주는 툴이 현재 존재한다고 한다)
일반적으로 머신러닝 알고리즘은 지도 학습(Supervised Learning), 비지도 학습(Unsupervised Learning), 반지도 학습(Semi-Supervised Learning)으로 세 가지 주요 범주로 나뉘며, 데이터가 제공되는 형태와 사용 목적에 따라 어떤 학습을 사용할지가 정해진다.
그래프 머신러닝은 그래프의 특성(Node, Edge로 구성된 점)에 의해 아래의 3가지의 레벨에서 지도, 비지도, 반지도 학습 알고리즘을 적용할 수 있다.
- 노드 단위 (Node Level): 노드를 예측하거나 분류
- Node Classification
- Node Prediction
- Node Regression
- 에지 단위 (Edge Level): 에지를 예측하거나 분류
- Edge Classification
- Edge Prediction (두 Node 간의 연결된 Edge가 무엇인지 예측)
- Edge Regression
- Link Prediction (두 Node 간의 Edge 생길지 말지 예측)
- 그래프 단위 (Graph Level): 그래프 전체를 예측하거나 분류
- Graph Classification
- Graph Prediction
- Graph Regression
일반 머신러닝 알고리즘은 학습 데이터의 특정 feature를 잘 선택하여 embedding/encoding을 한다. 하지만 Graph-Structured 데이터에는 그래프만이 가지고 있는 정보(ex: 노드와 노드 간의 어떤 연결 관계가 있는지, 어떤 노드와 다른 어떤 노드가 서로 연결이 되어 있는지에 대한 정보)들이 있기 때문에 그래프 정보를 고려하여 Embedding을 해주어야 한다.
Graph Embedding
대부분의 머신러닝 모델을 학습시킬 때, 각각의 학습 데이터들을 적합한 인코딩 방식을 적용하여 데이터를 변환한 후 학습 모델에 적용시킨다.
Graph-Structured 데이터에는 일반적으로 Node to Vector(Node2Vec), Edge to Vector(Edge2Vec), Graph to Vector(Graph2Vec)많이 사용하며, 이 외에도 Shallow Embedding, Graph Autoencoding, Neighborhood Aggregation 등 다양한 방법이 존재한다.
임베딩 결과를 비교해보기 위해 Node2Vec과 Edge2Vec을 간단히 구현해보았다.
#라이브러리 호출
import networkx as nx
import matplotlib.pyplot as plt
#그래프 생성
G = nx.barbell_graph(m1=7, m2=4)
#그래프 시각화
nx.draw(G, with_labels=True, font_size=15, node_size=400, edge_color='gray', arrowsize=30)
위 코드를 수행하고 출력하면, 아래 형태의 그래프가 만들어진다.
위의 그래프를 벡터 공간에 표현해주기 위해 Node2Vector와 Edge2Vector 적용한 결과를 비교해보았다.
#Node to Vector
from node2vec import Node2Vec
node2vec = Node2Vec(G, dimensions=2)
model = node2vec.fit(window=10)
fig, ax = plt.subplots(figsize=(8, 5))
for x in G.nodes():
v = model.wv.get_vector(str(x))
ax.scatter(v[0],v[1], s=1000)
ax.annotate(str(x), (v[0],v[1]), fontsize=12)
2차원 공간에서 각각의 노드들이 그래프 그림과 유사하게 임베딩된 것을 확인할 수 있다.
#Edge to Vector
from node2vec.edges import HadamardEmbedder
edges_embs = HadamardEmbedder(keyed_vectors=model.wv)
fig, ax = plt.subplots(figsize = (10, 8))
for x in G.edges():
v = edges_embs[(str(x[0]), str(x[1]))]
ax.scatter(v[0],v[1], s=1000)
ax.annotate(str(x), (v[0],v[1]), fontsize=12)
이 부분 역시, 2차원 공간에서 각각의 에지(노드와 이웃 노드들 간에 연결된 정보)들이 그래프 그림과 유사하게 임베딩된 것을 확인할 수 있다.
각각의 그래프 임베딩 알고리즘에 대해 나중에 따로 글을 작성해볼게요... ㅎㅎㅎㅎ

틀렸거나 수정이 필요한 부분이 있을 경우.. 댓글 부탁드리겠습니다~! :))
'Graph Neural Network' 카테고리의 다른 글
Intro to Graph (0) | 2022.11.13 |
---|