12
10월Item Based Recommendation
추천 시스템에는 여러가지 접근방법이 있습니다. 본 chapter에서는 여러 추천 접근법들 중에서 아이템에 기반한 상품 추천중에서 기본이 될 수있는 알고리즘인 코사인 유사도를(Cosine Similarity)를 활용한 Item Base Recommendation 을 소개할려고 합니다.
패키지 import 하기
본 분석에 필요한 패키지들을 불러오겠습니다. 데이터 로드와 전처리를 위해 pandas, 행렬 처리를 위한 numpy , 코사인 유사도 계산을 위해 scikit-learn에 내장된 cosine_similarity를 import 합니다.
RecSys challenge 2015 데이터 읽기
본 데이터는 RecSys Challenge 2015에 제공된 데이터로 고객이 온라인 쇼핑몰에서 활동하면서 발생한 로그 데이터이중 일부를 발췌한 것입니다. 데이터의 각 관측치는 고객이 상품하나를 클릭했을 때 발생한 기록입니다. Text 파일에 저장된 데이터를 읽기위해 pd.read_csv를 사용합니다. 이때 Text파일에 데이터가 tab으로 구분되어 있기에 sep 옵션에 \t 을 넣었습니다.
데이터는 총 3개의 변수 SessionId, ItemId, Time으로 이루어져 있습니다. SessionId는 고객이 온라인 쇼핑몰에 접속하고 쇼핑몰에서 나갈때 까지 Item을 click 한 핸동단위라 할 수 있습니다. 예를 들어 SessionId 11265009는 고객이 쇼핑몰에 접속하여 나갈 때 까지 2개의 Item에대해서 click 했다고 할 수 있습니다. ItemId는 각 Item을 구별하는 고유 식별자이고 Time은 고객이 Item 을 click했을 당시 시간을 unix timestamp로 표현한 것입니다.
데이터 전처리 및 분할
본 실습에 사용되는 데이터는 전체 데이터의 샘플 데이터입니다. 곧 있을 행렬 연산을 용이하게 하기위해 현재 할당된 ItemId를 새롭게 할당해주는 전처리를 수행합니다.
pandas DataFrame에는 merge라는 method가 내장되어있습니다. merge를 사용하여 새롭게 부여한 Id를 원본 data set에 합쳐주는 작업을 수행합니다. Column ItemId를 기준으로 merge하도록 옵션을 주었습니다.
새로운 new_item_id가 잘 합쳐졌는지 확인해보았습니다.
다음으로 추천 모델링과 모델의 검증을 위해 훈련용,검증용 데이터를 분할하겠습니다. 추천 모델링 할때 데이터 분할은 시간을 기준으로 분할 하게됩니다. 따라서 특정시점을 기준으로 훈련기간 , 검증기간 두 분류로 나눠지게 됩니다.
실제로 추천 시스템이 적용될때는 이전 시점의 데이터를 바탕으로 학습된 모델을 새로운 기간에 적용하게 되기 때문에 위와 같은 방식으로 모델을 검증하게 되는 것입니다.
이에 위 코드를 사용하여 원본 데이터를 SessionId와 Time 기준으로 정렬하고 pandas DataFrame의 index 기능을 사용하여 앞의 70%는 훈련용 데이터로 나머지 30%를 검증용 데이터로 분할했습니다.
Item 간의 코사인 유사도 계산
Item 간의 코사인 유사도를 계산하기 위해 어떤 고객이 어떤 Item에 대해서 Click했는지에 대해서 행렬의 형태로 나타내줄 필요가 있습니다. User x Item 형태의 행렬을 만드는 것입니다. 각 행렬의 요소는 어떤 User가 어떤 Item을 click 했으면 1, 그렇지 않으면 0으로 binary 형태로 표기합니다.
먼저 np.zeros를 사용해 훈련 데이터의 User(Session) x Item socre 라는 영행렬을 정의했습니다. 다음으로 훈련 데이터의 각 SessionId를 기준으로 groupby를 사용해 각 Session별로 Click 한 Item들을 개별 list에 담아주는 작업을 수행하였습니다. train_item_lst를 보면 각 Session 별로 어떤 Item 들을 click 했는지에 대해서 list형태로 표현되어 있습니다.
다음으로 score 영행렬에 각 Session별로 click 한 Item에 대해서는 1을 할당해주는 작업을 수행합니다. 예를 들어 어떤 Session에서 3번과 5번 Item에 대한 click 기록이 있다면 Score 행렬의 한 행의 3번과 5번열을 1로 할당해주는 작업을 하는 것입니다.
반복문을 활용하여 위 작업을 수행합니다. 이 작업이 끝나면 score 행렬은 각 Session마다 어떤 Item을 Click 했는지에 대한 정보를 가지게 될 것입니다.
Leave A Comment