본문 바로가기
Study/개발자 블로그

[개발자 블로그 탐독] Factorization Machine 모델로 아이템 추천하기!

by 22 전우빈 2023. 12. 21.

안녕하세요 메이플스토리의 개발자 블로그 탐독에 대해 이야기할 CODE 1기 전우빈 입니다!

 

 

 

 추천을 받는다는 것은 이제 일상이 되었습니다. 주변을 둘러보면 생각보다 다양한 분야에서 추천이 제공되고 있는데, 이는 게임에서도 마찬가지입니다. 게임은 유저마다 취향과 플레이 방식이 다양하기 때문에 개인의 선호에 맞게 콘텐츠를 개인화하는 것은 효과가 높은 분야입니다.

 메이플 개발자 블로그 '인텔리전스랩스'에서는 게임 상점에서 유저의 취향에 맞는 아이템 추천 로직을 개발한 경험을 공유하고 있습니다.

 

 

 

1. 게임에서의 추천 서비스

 추천을 위한 방법론들엔 대체로 CBF, CF, MF 등이 있습니다. 이들 대부분은 유저, 아이템, 그리고 구매 여부 데이터를 활용하여 추천합니다. 추천을 할 땐 그 사람의 취향을 물어보거나 추천해 줄 아이템의 여러 특징을 고려해서 추천하는 것이 더 효과적입니다. 예를 들면, 게임 유저 및 아이템의 메타 정보를 고려하여 아이템을 추천할 수 있습니다. 메타 정보는 특정 아이템이 있다면 그 아이템의 색상, 장착 부위, 가격 등 특정 아이템에 대해 설명해 주는 데이터를 말합니다. 그런데 이런 메타 정보들은 추가할수록 데이터의 자료형이 다양해지고 메타 정보에 해당하는 경우보다 해당하지 않는 경우가 더 많아집니다. 즉, 유저가 구입한 아이템에 대해만 정보를 가지고 있기 때문에 가지고 있지 않은 아이템에 대한 정보를 0으로 처리한다면, 희소 데이터가 된다는 문제가 있습니다. 희소 데이터란 대부분의 값이 0인 데이터로, 이러한 희소 데이터들은 학습에 악영향을 주어 정확한 추천이 어렵습니다.

 

 

이러한 희소 데이터로 유저의 선호를 예측할 수 있는 알고리즘이 많겠지만 해당 블로그 글에서는 Factorization Model 모델을 소개하고 있습니다. FM은 SVM과 Factorization model의 장점을 결합한 모델입니다. SVM처럼 실수형의 피쳐 벡터를 입력할 수 있으며, 행렬 인수분해를 이용해 희소한 데이터 간에도 상호작용을 모델링 할 수 있습니다. 따라서, 희소 데이터의 문제를 해결하면서도 유저나 아이템 이외의 정보들을 활용하여 추천할 수 있는 것입니다.

 

 

 

2. FM의 컨셉 이해하기

영화 평점 시스템 데이터를 사례로 들어 FM에 대해 더 자세히 설명하고 있습니다.

 

희소한 데이터 즉, 유저가 특정 영화를 보지 않았을 때 데이터에서는 0으로 표기가 됩니다. 영화는 매우 많고 그 영화들을 다 보기 힘들기 때문에 0이 아주 많은 데이터일 것입니다. 이런 상황에서도 어떻게 유저가 아직 보지 않은 영화에 대한 평점을 예측할 수 있는지 FM 모델에 대한 논문에서 발췌한 예제가 있습니다.

 

이 데이터를 통해선 유저의 영화에 대한 평점을 예측할 수 있습니다. 한 행에는 하나의 유저, 하나의 아이템이 들어가는 것을 확인할 수 있고 모든 영화에 대한 평점 행렬은 행의 합이 1이 되도록 정규화 되었습니다.

위의 그림에서 파란색 영역은 유저를 의미하는 변수이고, 주황색 영역은 아이템(영화)를 나타내는 변수입니다. 노란색 영역은 유저가 다른 영화들에 평점을 매긴 변수이며, 녹색은 월 단위 시간을 나타냅니다. 마지막 붉은색 영역은 해당 영화를 평가하기 바로 직전에 평가한 영화를 의미합니다. 그리고 맨 오른쪽 열이 목푯값 y 입니다.

 

 

 

 

 

 

3. FM을 활용한 치장성 아이템 추천

인텔리전스랩스에서는 파이썬에서 xLearn 라이브러리를 통해 FM 모델을 구현하였습니다.

 

3-1. 데이터 세트

 치장성 아이템 구매 데이터를 활용하여 데이터 세트를 아래와 같이 만듭니다.

유저 ID와 아이템ID 외에 구매 유저의 캐릭터 성별과 치장성 아이템의 부위 정보 및 색깔 정보 메이터를 추가합니다. 구매한 데이터뿐 아니라 구매하지 않은 데이터도 포함해야 합니다. 구매하지 않은 아이템에 대해 구매할 확률을 추정해야 하기 때문입니다.

 

Target: 구매 여부(목푯값)

userID: 유저 ID

Gender: 유저의 인게임 캐릭터 성별

Item ID: 아이템 ID

itemCategory: 아이템의 장착 부위 카테고리

itemColor: 아이템의 색상 정보

 

위 데이터를 train과 test 데이터 세트로 분리합니다. 동일한 유저ID가 train과 test 데이터 세트 둘 모두에 포함되지 않도록 주의가 필요합니다. 

 

하지만, 구매하지 않은 데이터도 포함해 주면 비구매 데이터가 매우 많아집니다. 실제 train 데이터 세트에서도 구매 데이터가 전체 데이터 세트의 0.4% 비구매 데이터가 99.6%로 비구매 데이터가 대부분입니다. 극단적인 불균형 현상으로 예측값을 모두 0으로 판단할 수 있어 다운 샘플링을 통해 데이터가 많은 쪽을 더 적게 추출해야 합니다.

 

해당 데이터 세트에 모든 피처가 범주형이기 때문에 컴퓨터가 읽을 수 있도록 one-hot encoding을 해줘야 합니다.

그럼 위와 같은 결과가 나오고 이제 모델링을 진행하면 됩니다.

 

 

 

3-2. 모델링

# Training task
fm_model = xl.create_fm()         # Use field-aware factorization machine (fm)
fm_model.setTrain("train.txt")    # Set the path of training dataset
fm_model.setValidate("test.txt")  # Set the path of validation dataset

 

# Parameters:
#  0. task: binary classification
#  1. learning rate: 0.2
#  2. regular lambda: 0.002
#  3. evaluation metric: accuracy
param = {'task':'binary', 'lr':0.2, 'lambda':0.002, 'metric':'f1'}

 

다음의 코드를 통해 데이터 세트를 세팅하고, 파라미터를 설정합니다.

 

모델 성능 평가 지표로는 유저가 구매한 아이템을 모델이 구매할 것이라 예측하는지, 모델이 구매할 것이라 예측한 것을 유저가 구매했는지를 바탕으로 F1 스코어를 이용해서 모델의 성능을 평가합니다. F1 스코어란 정밀도와 재현율의 조화 평균으로, 정밀도와 재현율의 차이가 작을수록 높은 값을 가집니다. 데이터 세트의 특징상 분류 클래스 간 케이스 수의 불균형이 심하기 때문에 정밀도와 재현율을 모두 고려한 모델 성능 지표로서 판단하기 적합합니다.

 

 

3-3. 결과

 위 모델이 예측한 결과로 어떻게 추천 되었는지 샘플로 확인해 보았습니다. 캐릭터 성별이 여성인 A 유저는 2개의 아이템을 구매한 경험이 있는 유저입니다. 이 유저가 구매할 가능성이 높은 아이템 순으로 정렬하면 오른쪽과 같습니다.

 

 

 

4. 최종 결론

FM 모델의 간단한 개념을 살펴보고 직접 구현까지 해보았습니다. 예제 데이터로 진행한 모델링이라 성능이 좋지 않았던 점이 아쉽습니다. 실제 추천 결과에서 대중적으로 인기있는 투명 아이템을 추천해 주는 경우가 많았기 때문입니다.

 다양한 자료의 피처를 사용할 수 있는 자유도가 높은 모델이다 보니 항후 유의미한 피처들을 추가하고, 데이터 세트를 늘리고 하이퍼 파라미터 튜닝을 통해 모델을 고도화시키면 다양한 아이템을 추천할 수 있을 것이라 기대합니다.

 

 

 

이상 넥슨의 개발자 블로그 탐독이었습니다. 읽어주셔서 감사합니다.