Category Embedding 방식을 통해, 지정한 임의 차원의 벡터로 변환할 수 있다. Embedding Layer을 사용해야 한다.
물론 One-Hot Encoding 방식을 쓸 수도 있지만, 여기서는 벡터 임베딩 방식을 다룬다.
import numpy as np
import torch
from sklearn.preprocessing import LabelEncoder
from torch.nn import Embedding
# LabelEncoder를 사용해 위치 정보를 정수로 변환
le = LabelEncoder()
train_data['Location_encoded'] = le.fit_transform(train_data['Location'])
# 임베딩 레이어 초기화
embedding_layer = Embedding(num_embeddings=151, embedding_dim=25)
# 위치 정보를 25차원 벡터로 변환
location_embeddings = embedding_layer(torch.unsqueeze(torch.tensor(train_data['Location_encoded'].values, dtype=torch.long), dim=1))
# 결과를 NumPy array로 변환
location_embeddings = location_embeddings.detach().numpy().squeeze()
# 기존 user node feature matrix를 (num_users, num_features)형태라고 가정
previous_node_feature_matrix = np.random.rand(num_users, num_features)
# 위에서 만든 Location 임베딩 벡터와 기존 feature matrix를 연결
node_features_extended = np.concatenate((previous_node_feature_matrix, location_embeddings), axis=1)
train_data['Location'].nunique()의 결과가 151이라는 것은 151개의 다른 위치가 있다는 것이다.
따라서 input_dim을 151로 설정하는 것은 각각의 위치 정보를 고유한 방식으로 표현하기 위한 것이다.
참고로, 완성된 embedding의 shape는 [] 이다.