본문 바로가기
🌿 Data Engineering/Data Analysis

추천시스템01. 추천 시스템(Recommendation)이란? 유형 알아보기

by 카프리썬_ 2021. 8. 26.
728x90
728x90

이전 프로젝트에서 거리기반 알고리즘을 이용해서 음악을 추천해주는 프로젝트를 진행했다.

가장 단순하고 쉽게 유사도를 계산했는데, 어느정도 유사한 결과가 나와서 엄청 신기했다.

그래서 추천알고리즘을 더 알아보고 싶었고, 또한 다양한 데이터를 다루어보고 싶었다.

해보고 싶은 나만의 과제? 처럼 keep해두고 있던것 중 하나였는데 시간이 남아서 한번 도전~!


추천 시스템(Recommendation)이란?

추천 시스템을 통해 사용자의 취향을 파악하고, 그 취향에 따라 상품 등을 추천해줄 수 있다. 

그래서 사용자가 해당상품을 구매할 확률이 높아져서 친사용자이며 친기업 서비스가 될 수 있는 강력한 시스템.

 

대표적으로 유튜브나 왓챠,넷플릭스에서 적용하고 있는 추천시스템, 나도 몰랐던 내 취향을 알려준다는 점에서 소름돋음

이런 추천 시스템을 경험한 사용자는 높은 확률로 충성고객이 되며,

사용자 유입도 많아지게 되서 점점 더 견고해지는 추천서비스가 될 수 있다. 

 

추천시스템의 기본유형 

  • 콘텐츠 기반 필터링(content based filtering)방식
  • 협업 필터링(collaborative filtering)방식
    • 메모리기반 (memory based) 혹은 최근접 이웃기반 필터링 (nearest neighbor collaborative filtering)
    • 잠재요인 기반 필터링 (latent factor collaborative filtering)

초반에는 콘텐츠 기반 필터링을 많이 썻는데, 넷플릭스 사례 이후 협업 필터링을 많이 사용하게 되었다. 

특히 잠재요인 기반 필터링을 많이 사용하게 되었다. 

 

1.콘텐츠 기반 필터링(content based filtering)

사용자가 특정 아이템을 선호하는 경우, 그 아이템과 비슷한 콘텐츠를 가진 다른 아이템을 추천해주는 방식

굉장히 단순한 아이디어. 요즘엔 자주 사용하지 않는 방식 

 

예를 들어 사용자가 a가 itemA 영화에 높은평점을 주었을떄,

그 영화가 스릴러 영화고, 봉준호 감독이라면 

이와 깉이 봉준호 감독의 다른 스릴러 영화를 추천해주는 것이다. 

 

2. 협업 필터링(collaborative filtering)  

사용자와 item간의 rating을 이용해서 사용자끼리 '유사도'를 찾는 방식.

특정 사용자와 유사한 사용자들이 남긴 평점, 상품구매 이력 등 행동양식 기반으로 '예측'해서 '추천'해준다

그래서 item을 얼마나 좋아할 것인지 수치적으로 예측한다. 

 

유사도는 유클리드 거리기반, 코사인 유사도기반, 피어슨 상관관계수 기반 등 수학적 유사도 계산방법 이용.

그래서 유사도가 높은 사용자 집단에서 각 사용자들이 남긴 평점을 weighted sum으로 계산해서 평점을 예측한다 

 

예를 들어 사용자a와 유사도가 높은 사용자 집단에서

각 사용자들이 남긴 평점을 가중치 합으로 계산해서 

사용자a가 itemA 영화에 평점을 얼마나 줄지, 얼마나 좋아할지 수치적으로 예측한다. 

 

하지만, 첫 방문한 사용자는 유사한 사용자가 없기 때문에 추천이 잘 되지 않는 문제가 있다 (cold start problem)

그래서 왓챠나 넷플릭스에서 첫 방문시 일정개수 이상의 영화에 평점을 남기도록 유도하고 있따. 

그리고 항상 평점을 남겨야 추천을 할 수 있는 데이터가 수집이 된다는 점도 한계점이 될 수 있따. 

 

2.1 최근접 이웃기반 필터링 (nearest neighbor collaborative filtering)

사용자-아이템 행렬에서 사용자가 아직 평가하지 않은 아이템을 예측하는 것이 목표

  ItemA ItemB ItemC ItemD
USER 1 4   3  
USER 2 3 2 ? 5
USER 3   3 2 2

예를 들어, USER2가 아직 ItemC에 대해서 평가를 내리지 않았으니 이떄 어떻게 평가를 할지 예측하는 것

 

즉, 사용자-아이템 행렬과 같은 모습을 가지고 있어야하기 때문에 column은 item, row는 user 형식이여야한다 

그래서 pandas의 pivot table로 변환하는 작업이 필요하다. 

참고 https://lsjsj92.tistory.com/563?category=853217

그리고 최근접 이웃기반 협업 필터링은 아래와 같이 또 두가지로 나뉠 수 있다

  • 사용자 기반 협업 필터링 : 비슷한 고객들이 ~한 item을 소비했다.
  • 아이템 기반 협업 필터링 : ~한 item을 소비한 고객들은 다음과 같은 상품도 구매했다.  

2.1.1 최근접 이웃기반 필터링 - 사용자 기반 협업 필터링

colums은 user, row는 item 행렬을 가지고 있다. (user-item)

user1과 user2는 itemA,itemB,itemC까지 평점이 비슷하기 때문에 user1과 user2는 비슷하다고 판단

 

2.1.2 최근접 이웃기반 필터링 - 아이템 기반 협업 필터링

colums은 item , row는 user 행렬을 가지고 있다. (item-user)

 

itemA와 itemB는 비슷한 평점분포를 가지고 있기 때문에 itemA와 itemB는 비슷하다고 판단.

그래서 결국 user4에게 ItemA를 추천해준다. 

일반적으로 정확도, 사용빈도 :  사용자기반 협업필터링 < 아이템기반 협업필터링

 

2.2 잠재요인 필터링 (nearest neighbor collaborative filtering)

 

행렬분해를 기반으로 사용한다. 

대규모 다차원 행렬을 SVD와 같은 차원감소 기법으로 분해하는 과정에서 '잠재요인'을 찾아내서 뽑아내는 방법

일반적으로 정확도, 사용빈도 :  아이템기반 협업필터링 < 잠재요인 필터링

 

user-item 행렬 데이터를 이용해 잠재요인을 찾아낸다. 

즉 user-item 행렬을 user-잠재요인, item-잠재요인 행렬로 분해는 것이다.

이때 잠재요인이 무엇인지 명확하게 알 수는 없다. 

하지만 예를 들어 영화 item인 경우 코미디, 액션 등 장르가 될 수 있다. 

그래서 사용자-장르(행렬P), 장르-아이템(행렬Q) 이렇게 행렬이 분해가 될 수 있는 것이다. 

그래서 전체 사용자-아이템(행렬 R)에서 나온 값을 기반으로 잠재요인이 값을 매길 수 있게 된다.

그리고 이 값을 이용해서 사용자가 평가하지 않은 콘텐츠의 점수를 예측하는 것이다.  

R[1,2] : 1번째 유저가 매긴 2번째 아이템에 대한 평가

분해된 p와 q행렬에서 R[1,2]값은 2라고 예측할 수 있다. 

 

잠재요인 필터링의 장점 : 저장공간의 절약

만약, 1000개의 item에 대한 2000명의 user가 있다면 1000 * 2000 개의 파라미터가 필요하다.

그런데 matrix factorization을 잠재요인을 뽑아낸다면

예를 들어 1000개의 item,  2000명의 user, 100개 잠재요인이라면

item-잠재요인은 1000 * 100 = 100,000 

user-잠재요인은 2000 * 100 = 200,000 

으로 총 300,000 개의 파라미터가 필요하다.

 

결국 행렬분해는 아래와 같이 적용된다. 

 

 

참고자료

 

추천시스템 유형

https://lsjsj92.tistory.com/563?category=853217 

https://lsjsj92.tistory.com/563?category=853217

Kaggle의 영화데이터

 

넷플릭스 데이터

  • 피어슨 상관관계수기반 추천 알고리즘  
  • Kdd 유사도 기반 추천 알고리즘  
  • 코사인 유사도 기반 추천 알고리즘  

https://diane-space.tistory.com/90

 

[추천시스템] 넷플릭스 영화 추천 시스템 구현 파이썬 코드

데이터 필요한 데이터만 첨부 코드 import pandas as pd import numpy as np # 데이터 읽어오기 movies=pd.read_csv("movies.csv") ratings=pd.read_csv("ratings.csv") # 아이템 기반 협업 필터링 data=pd.merg..

diane-space.tistory.com

 

728x90
반응형