마지막 예로, 영화 등급의 실제 데이터셋을 살펴보자. MovieLens는 미네소타 대학의 GroupLens 프로젝트에 의해 개발되었다. 데이터 세트는 et에서 다운로드할 수 있다. 여기 두 개의 데이터 세트가 있다. 플랫폼에 따라 tar.gz 형식 또는 zip 형식으로 100,000개의 데이터 세트를 다운로드하십시오.


아카이브에는 여러 개의 파일이 있지만 관심 있는 파일은 동영상 ID와 제목 목록을 포함하는 u.item과 이 형식의 실제 등급이 포함된 u.data이다.


196 242 3 881250949

186 302 3 891717742

22 377 1 878887116

244 51 2 880606923

166 346 1 886397596

298 474 4 884182806


각 행에는 사용자 ID, 동영상 ID, 사용자가 동영상에 부여한 등급, 타임스탬프가 있다. 동영상 제목을 얻을 수 있지만 사용자 데이터는 익명이므로 이 섹션에서 사용자 ID로 작업하십시오. 이 세트에는 943명의 이용자들이 각각 최소 20편의 영화를 평점한 1,682편의 영화가 포함되어 있다.


recommendations.py에서 loadMovieLens라는 새로운 방법을 생성하여 이 데이터 집합을 로드하자.


def loadMovieLens(path='/data/movielens'):

 # Get movie titles

 movies={}

 for line in open(path+'/u.item'):

 (id,title)=line.split('|')[0:2]

 movies[id]=title

 # Load data

 prefs={}

 for line in open(path+'/u.data'):

 (user,movieid,rating,ts)=line.split('\t')

 prefs.setdefault(user,{})

 prefs[user][movies[movieid]]=float(rating)

 return prefs


파이썬 세션에서 데이터를 로드하고 임의의 유저에 대한 순위를 찾아보자


>>> reload(recommendations)

>>> prefs=recommendations.loadMovieLens( )

>>> prefs['87']

{'Birdcage, The (1996)': 4.0, 'E.T. the Extra-Terrestrial (1982)': 3.0,

 'Bananas (1971)': 5.0, 'Sting, The (1973)': 5.0, 'Bad Boys (1995)': 4.0,

 'In the Line of Fire (1993)': 5.0, 'Star Trek: The Wrath of Khan (1982)': 5.0,

'Speechless (1994)': 4.0, etc...


이제 유저기반 추천을 확인할 수 있다.


>>> recommendations.getRecommendations(prefs,'87')[0:30]

[(5.0, 'They Made Me a Criminal (1939)'), (5.0, 'Star Kid (1997)'),

 (5.0, 'Santa with Muscles (1996)'), (5.0, 'Saint of Fort Washington (1993)'),

 etc...]


컴퓨터 속도에 따라 이런 방식으로 권장 사항을 받을 때 일시 중지되는 것을 볼 수 있다. 이는 현재 훨씬 더 큰 데이터셋을 사용하고 있기 때문이다. 사용자가 많을수록 사용자 기반 권장 사항이 더 길어질 것이다. 이제 항목 기반 권장 사항을 대신 수행해 보자.


>>> itemsim=recommendations.calculateSimilarItems(prefs,n=50)

100 / 1664

200 / 1664

etc...

>>> recommendations.getRecommendedItems(prefs,itemsim,'87')[0:30]

[(5.0, "What's Eating Gilbert Grape (1993)"), (5.0, 'Vertigo (1958)'),

 (5.0, 'Usual Suspects, The (1995)'), (5.0, 'Toy Story (1995)'),etc...]


항목 유사성 사전을 만드는 데는 오랜 시간이 걸리지만, 사전을 만든 후에는 거의 즉각적으로 추천할 수 있다. 게다가, 추천을 받는 데 걸리는 시간은 사용자 수가 증가함에 따라 늘어나지 않을 것이다.


이것은 서로 다른 채점 방법이 결과에 어떻게 영향을 미치는지, 그리고 항목 기반 필터링과 사용자 기반 필터링이 어떻게 다르게 수행되는지 이해하기 위해 실험할 수 있는 훌륭한 데이터 세트다. GroupLens 웹 사이트에는 책, 농담, 그리고 더 많은 영화를 포함한 몇 가지 다른 데이터 세트가 있다.



사용자 기반 필터링 또는 항목 기반 필터링?

항목 기반 필터링은 대규모 데이터 세트에 대한 권장 사항 목록을 가져올 때 사용자 기반 필터링보다 훨씬 빠르지만 항목 유사도 표를 유지하는 데 드는 추가 오버헤드가 있다. 또한 데이터셋이 얼마나 "스파스(sparse)"인가에 따라 정확도의 차이가 있다. 영화 예에서 모든 평론가가 거의 모든 영화에 대한 평점을 매겼기 때문에 데이터 세트가 밀도가 높다(스스로는 희박하지 않다). 반면, del.icio.us 북마크가 같은 집합을 가진 두 사람을 찾기는 어려울 것이다. 대부분의 북마크는 소수의 사람들에 의해 저장되어 희박한 데이터 집합으로 이어진다. 항목 기반 필터링은 대개 희박한 데이터 세트에서 사용자 기반 필터링을 능가하며, 두 가지는 밀도가 높은 데이터 세트에서 거의 동등하게 수행된다.


이러한 알고리즘 간의 성능 차이에 대한 자세한 내용은 Sarwar et al.의 "Item-based Collaborative Filtering 권장 알고리즘"이라는 문서를 참조하십시오. http://citeser.ist.psu.edu/sarwar01itembased.html


사용자 기반 필터링은 구현이 더 간단하고 추가 단계가 없으므로 자주 변경되는 메모리 내 데이터 세트가 더 적합할 수 있다. 마지막으로, 어떤 애플리케이션에서 다른 사용자들이 자신의 것과 유사한 선호를 가지고 있는 사람들에게 보여주는 것은 그 자체의 가치를 가지고 있다. 쇼핑 사이트에서 하고 싶은 것이 아니라 링크 공유나 음악 추천 사이트에서 하고 싶은 것일 수 있다.


이제 유사성 점수를 계산하는 방법과 사람과 항목을 비교하는 방법을 배우셨습니다. 이 장에서는 사람들의 선호도를 유지하고 링크 추천 시스템을 구축하기 위해 del.icio.us API를 사용하는 방법과 함께 사용자 기반과 항목 기반 두 가지 권장 알고리즘을 다루었다. 2장에서는 관리되지 않는 클러스터링 알고리즘을 사용하는 유사한 사용자 그룹을 찾아 이 장의 아이디어를 기반으로 하는 방법을 살펴보십시오. 9장에서는 이미 그들이 좋아하는 종류의 사람들을 알고 있을 때 사람들을 매칭할 수 있는 다른 방법들을 살펴볼 것이다.

  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기