Ex12-간단한 Session을 정의하는 방법, apply로 적용하기

안 형준·2021년 9월 1일
3

Aiffel/Archives

목록 보기
11/12

0. Session이란?

User - Item based recommendation system은 사용자에게 비슷한 선호도를 가진 사용자가 좋아하는 Item을 추천합니다. 그러나 상품 구매의 경우, 사용자는 늘 같은 부류의 상품을 구매하는 것이 아니고, 더욱 효과적인 추천을 위해서는 사용자가 현재 어떤 상품을 원하는지 알아야 할 것 같습니다.

따라서 한 세션(짧은 기간의 행동을 저장한 시퀀스 데이터)을 기반으로 추천시스템을 만들면 적절할 것입니다.

1. 아이디어

UserId가 변하지 않은 채로, 액션이 지정된 시간 안에 연달아 이어지면 하나의 Session으로 판정합니다. 콤보가 이어지는 느낌입니다. 만약 연속된 액션 사이에 시간 간격이 N(초)를 넘어가거나, User가 다르다면 새로운 Session으로 판정합니다.

2. 코드

data를 불러와 정렬한 다음 진행합니다.

diff: 바로 위 행의 값과의 차이를 구합니다. Time에 적용하면 연속된 액션의 시간차가 되고, UserId에 적용하면 다른 사용자에 대한 액션으로 바뀌는 것을 잡아내는 flag로 작동합니다.

global : session_id를 local variable로 사용한다면, 앞으로 만들 함수는 1과 2만을 return하게 됩니다.
이는 매번 session_id=1로 초기화되기 때문인데, 그것을 방지하기 위해 전역변수를 함수 내에서 접근하도록 global을 달아줍니다.

make_sessions() :기준보다 큰 차이가 발견되거나, 유저의 변화가 감지되면 session_id를 1올립니다.

datatemp = data.copy()

datatemp['Time_diff'] = datatemp['Time'].diff().fillna(0)
datatemp['Change_User'] = datatemp['UserId'].diff().fillna(0)

session_id = 1
def make_sessions(x, max_diff):
    global session_id
    if x['Time_diff']>max_diff or x['Change_User']==1:
        session_id += 1
    return session_id

3. 적절한 N찾기

같은 유저에 대한 액션 중, 시간 차이에 대하여 시각화를 해봅니다.

effective_difference = datatemp[datatemp['Change_User']!=1]['Time_diff']
effective_difference[effective_difference<2000].plot.hist(bins=100)


N = 200정도면 적절해 보입니다.

4. 결과

N = 600에 대해 시도한 결과입니다

profile
물리학과 졸업/ 인공지능 개발자로의 한 걸음

0개의 댓글