◈ 추천시스템에서 Binary Data 다루기
클릭, 좋아요, 읽기, 머무르기 등의 행동 데이터를 의미하며 implicit data에 해당된다.
Binary 데이터는 크게 두 가지 방향으로 사용될 수 있다.
1. Binary Data로 순서 예측
Markov Model을 기반으로 해서 이진 데이터가 나타내는 행동으로부터 사용자가 다음으로 할 행동을 예측한다.
A,B,C 페이지를 차례대로 방문한 사용자가 다음에 어떤 페이지를 방문할 지 예측할 수 있다. 하지만 클릭 로그가 굉장히 많아질 경우, 동일한 경로로 클릭을 한 다른 사용자가 존재하지 않을 수도 있다. 이러한 경우 가장 초기 기록부터(A부터) 없애가면서 동일한 사용자들을 비교한다. 하지만 이 방식은 많이 사용되지 않는다.
이진 데이터로 예측을 할 경우 한계점도 존재한다. 이진 데이터로 예측을 실시해서 해당 사용자가 다음 클릭 가능성이 높은 메뉴를 앞으로 당겨줄 수도 있다. 하지만 연산이 굉장히 많아지고 시스템이 무거워진다. 또한 사용자들이 매번 변화하는 페이지나 메뉴에 적응하기가 어려워서 불편함을 느낄 수도 있다.
또한, binary data에는 noise가 많다. 웹 상에서 일어나는 행동에는 수만은 오류가 포함되어 있다(ex. 새로고침, 잘못 클릭, 뒤로가기 등). 따라서 아직까지 클릭스트림의 이진 데이터를 통해서 구매 예측 등을 하는 것은 정확도가 높지 않다.
따라서 이진 데이터를 사용하는 것은 장단점이 확실하게 존재하기 때문에, 최근에는 선호도로 변환해서 사용하는 경우가 많다.
2. Binary Data를 선호도로 변환
이진 데이터가 유저의 선호도를 반영한다고 보고 적절한 가중치를 부여해서 평점으로 사용하는 것이다. 유저가 특정 페이지에 오래 머무른다는 것은 그 페이지에 관심이 많다는 것을 의미한다. 또한, 해당 페이지에서 유저의 다양한 행동을에 대해서고 점수를 부여할 수 있다. ex) 클릭=1, 북마크=2 등
따라서 이렇게 선호도로 변환한 데이터를 사용해서 CF, MF 등의 추천 알고리즘을 적용할 수 있다.
◈ 실습 : CI&T DeskDrop 데이터
73k 명의 회사 사용자들의 3k개의 article을 공유하고 그것을 읽은 로그를 기록한 데이터. 특정 사용자가 어떤 문서를 읽을지를 예측할 수 있다.
import pandas as pd
import numpy as np
from sklearn.utils import shuffle
# 데이터 읽기
articles = pd.read_csv('C:/Users/Yeong/Desktop/추천시스템 강의/W9/shared_articles.csv')
interactions = pd.read_csv('C:/Users/Yeong/Desktop/추천시스템 강의/W9/users_interactions.csv')
#필요없는 변수 삭제
articles.drop(['authorUserAgent', 'authorRegion', 'authorCountry'], axis=1, inplace=True)
interactions.drop(['userAgent', 'userRegion', 'userCountry'], axis=1, inplace=True)
article 데이터에는 문서의 기본적인 정보와 텍스트 내용이 포함되어 있다.
interaction 데이터에는 각 게시글에 대한 활동 내역들이 포함되어 있다.
데이터를 불러온 후에 필요하지 않은 열들을 삭제한다.
#eventtype='content removed'인 데이터 제거
articles = articles[articles['eventType'] == 'CONTENT SHARED']
articles = articles.drop('eventType', axis=1)
#data merge : contetnId 기준
data = pd.merge(interactions[['contentId','personId', 'eventType']], articles[['contentId', 'title']], how='inner', on='contentId')
기본적인 전처리를 실시한다. 데이터를 불러오고 삭제된 게시글에 대한 데이터는 제외한다.
그리고 두 데이터를 contentId를 기준으로 merge 한다.
# Event 종류별로 다른 가중치 부여
event_type_strength = {
'VIEW': 1.0,
'LIKE': 2.0,
'BOOKMARK': 1.0,
'FOLLOW': 2.0,
'COMMENT CREATED': 2.0,
}
#apply 적용
data['rating'] = data['eventType'].apply(lambda x: event_type_strength[x])
유저들의 행동에 대해서 점수를 부여하고 rating 변수에 저장한다.
# 현재 contentid 와 personid가 너무 긴 숫자로 되어있기 때문에 간단한 형태로 변경
grouped_data['personId'] = grouped_data['personId'].astype("category")
grouped_data['contentId'] = grouped_data['contentId'].astype("category")
grouped_data['user_id'] = grouped_data['personId'].cat.codes
grouped_data['item_id'] = grouped_data['contentId'].cat.codes
#유저, 상품 ID 와 rating 만 가져오기
ratings = grouped_data[['user_id', 'item_id', 'rating']]
현재 주어진 데이터의 유저와 아이템 ID가 복잡한 형태로 되어있기 때문에, 이를 일반 숫자 형태로 다시 정리한다.
그리고 무비렌즈 데이터와 동일한 형태로 ratings 데이터를 가져온다.
그 이후에 앞선 포스트에서 설명한 추천 시스템 알고리즘을 적용할 수 있다.
◈ Reference
• "Python을 이용한 개인화 추천시스템", 임일, 청람
'추천시스템' 카테고리의 다른 글
Matrix Factorization : 텐서플로우, 케라스로 구현 (0) | 2022.01.23 |
---|---|
추천 알고리즘 - Factorization Machines (0) | 2022.01.23 |
Surprise 라이브러리 (0) | 2022.01.21 |
추천 알고리즘 - Matrix Factorization (0) | 2022.01.14 |
컨텐츠 기반 추천(Content Based Filtering) (0) | 2022.01.10 |
댓글