본문 바로가기
Programming_Collective Intelligence/2.추천시스템 만들기

무비렌즈(MovieLens) 데이터 셋을 활용한 추천 시스템

by 볼록티 2019. 12. 29.
728x90
반응형

영화 평가에 대한 실제 데이터셋인 무비렌즈를 살펴본다. 무비렌즈는 미네소타 대학의 그룹렌즈(FroupLens)프로젝트에 의해 개발되었다.

https://grouplens.org/datasets/ 사이트에서 데이터를 다운받을 수 있다.  tar.gz나 zip포맷 중에 하나를 골라서 100,000개의 데이터셋을 다운 받는다.

이 영화 평점데이터는 보니까 imdb 사이트에 있는 자료를 바탕으로 수집이 된 것으로 보여진다.

 

 

 

나는 위 그림처럼 10만개의 데이터셋을 다운 받았다. zip을 받았다. 압축을 풀면 u.item과 u.data가 있는데 모두 data파일로 되어 있어서 나는 편하게 하기 위해서 txt파일로 옮겨서 불러와 사용하였다. 파일을 각각 아이템에 관한 내용과 평점에 관한 데이터이다.

 

 

u.data

 

u.item

다음의 코드를 통해서 딕셔너리형태로 만들어준다.

import codecs
def loadMovieLens(path='data/movielens'):
    
    #영화제목을 얻음
    movie={}
    for line in open(path+'/u.item.txt','r', encoding='ANSI'):
        (id,title) = line.split('|')[0:2]
        movie[id] = title
        
    #데이터를 로드함
    prefs={}
    for line in open(path+'/u.data.txt'):
        (user,movieid,rating,ts)=line.split('\t')
        prefs.setdefault(user,{})
        prefs[user][movie[movieid]] = float(rating)
    return prefs

 

함수를 실행시켜 보면 아래와 같은 결과를 얻게 된다.

imp.reload(rating)
prefs = rating.loadMovieLens()
prefs['87']

87번 사람이 영화에 대해 평점을 준 것. 이전에 우리가 했던 것보다 사이즈만 커졌을 뿐 별 다를건 없다.

 

 

 

사용자 기반 추천을 해보면 아래와 같다.

rating.getRecommendations(prefs,'87')[:30]

 

 

이제 항목 기반 추천 기법을 적용해보자. 이제 행렬 연산을 하게 되는데, 이 유사도를 구하는 작업이 좀 오래걸린다. 하지만 한번 해놓으면 추후에 좋다.

itemsim=rating.calculateSimilarItems(prefs, n=50)

 

이제 항목기반으로 추천을 하게 된다.

rating.getRecommendedItems(prefs, itemsim,'87')[:5]

결과가 보면은 동일한 수치가 참 많다. 왜냐하면 내가 생각했을 때, 항목들이 가지는 특징들이 많지 않고 오직 평점에만 의존하기 때문이라 생각이 든다. 항목 간의 특징을 구분짓는 유의미한 변수들이 많다면 항목 간의 유사도에 조금더 좋은 의미를 부여할 수 있을 것이라 생각이 된다.

 

 

 

사용자기반 필터링과 항목 기반 필터링의 정리

 

 항목 기반 필터링은 큰 데이터 셋의 경우 추천 목록을 얻을 때 사용자 기반 필터링에 비해 훨씬 빠르다. 다만 항목 유사도 테이블을 유지하기 위해 추가 부담을 해야한다. 데이터셋의 sparse한 정도에 따라 정확도에 차이가 있다. 영화 예제를 다뤘을 경우 모든 평론가들이 거의 모든 영화에 평가를 했기에 sparse하지 않았다. 만약 sparse한 데이터 셋이였다면 동일한 항목에 대해 평가한 두 사용자를 찾기가 힘들어 질 것이다.

 sparse한 데이터셋의 경우 항목 기반 필터링 기법이 사용자 기반 필터링 기법보다 더 잘 동작한다. sparse하지 않다면 두 기법에 대해 둘 다 비슷하게 동작한다.

 

 사용자 기반 필터링 기법은 구현하기가 용이하고 추가 단계가 없어, 자주 변경되는 보다 작은 메모리 안에 들어가는 데이터 셋에 적당하다. 몇몇 서비스에서는 같은 취향을 가진 사용자들을 보여주는 것도 있다. 쇼핑몰에선 별로라고 할 수 있지만 음악이나 링크 추천과 같은 사이트에서는 가능하다.

 

 

728x90
반응형

'Programming_Collective Intelligence > 2.추천시스템 만들기' 카테고리의 다른 글

항목 기반 필터링/추천 생성  (0) 2019.12.29
제품 매칭  (0) 2019.12.28
항목추천/제품매칭  (0) 2019.12.26
유사 사용자 찾기  (0) 2019.11.29

댓글