아이템 기반 협업 필터링 | 추천 시스템 기본 – (콜라보레이티브 필터링, 컨텐트 베이스 필터링) 상위 109개 베스트 답변

당신은 주제를 찾고 있습니까 “아이템 기반 협업 필터링 – 추천 시스템 기본 – (콜라보레이티브 필터링, 컨텐트 베이스 필터링)“? 다음 카테고리의 웹사이트 you.1111.com.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.1111.com.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 Minsuk Heo 허민석 이(가) 작성한 기사에는 조회수 9,766회 및 좋아요 237개 개의 좋아요가 있습니다.

Table of Contents

아이템 기반 협업 필터링 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 추천 시스템 기본 – (콜라보레이티브 필터링, 컨텐트 베이스 필터링) – 아이템 기반 협업 필터링 주제에 대한 세부정보를 참조하세요

영화 추천을 예제로 기본적인 추천 알고리즘 세가지에 대해 알아봅니다.
1. user based collaborative filtering
2. item based collaborative filtering
3. content based filtering for resolving cold start problem
제가 만든 모든 머신러닝 관련 영상은 아래 재생목록에서 쉽게 찾으실 수 있습니다.
https://www.youtube.com/playlist?list=PLVNY1HnUlO241gILgQloWAs0xrrkqQfKe

아이템 기반 협업 필터링 주제에 대한 자세한 내용은 여기를 참조하세요.

추천시스템03. 아이템 기반 협업 필터링 (collaborative filtering …

사용자와 item간의 rating을 이용해서 사용자끼리 ‘유사도’를 찾는 방식. 특정 사용자와 유사한 사용자들이 남긴 평점, 상품구매 이력 등 행동양식 기반 …

+ 여기에 보기

Source: pearlluck.tistory.com

Date Published: 2/12/2022

View: 1428

협업 필터링 – 위키백과, 우리 모두의 백과사전

이것이 단순히 투표를 한 수를 기반으로 각 아이템의 관심사에 대한 평균적인 평가로 처리하는 방법과 차별화 된 것이다. 즉 고객들의 선호도와 관심 표현을 바탕으로 …

+ 여기에 보기

Source: ko.wikipedia.org

Date Published: 5/6/2022

View: 4321

[추천시스템] 4) 협업필터링 – 이웃기반 협업필터링

컨텐츠 기반 필터링은 아이템의 정보를 이용하여 과거에 사용자가 좋아했던 아이템과 유사한 다른 아이템을 추천하는 방식이죠. 본 포스팅에서는 컨텐츠 …

+ 여기에 자세히 보기

Source: abluesnake.tistory.com

Date Published: 6/28/2021

View: 8398

예시와 함께 넷플릭스 추천엔진 이해하기 : 사용자 기반 필터링 …

‘협업 필터링’ 기법은 ‘사용자 기반 필터링(User-based filtering)’ 과 ‘아이템 기반 필터링(Item-based filtering)’으로 나뉩니다. 두가지 세션으로 …

+ 여기를 클릭

Source: blog.bizspring.co.kr

Date Published: 9/12/2022

View: 8162

협업 필터링 추천 시스템 (Collaborative Filtering … – scvgoe

사용자 기반, 아이템 기반의 협업 필터링을 설명하기 앞서 간단한 예시 상황을 가정하도록 한다. 다음은 어떤 사용자들이 영화의 평점을 (0~5) 사이의 …

+ 여기를 클릭

Source: scvgoe.github.io

Date Published: 4/9/2022

View: 7831

[Algorithms] 협업필터링(Collaborative Filtering) :: Data & Graph

반대로 아이템 기반 협업필터링은 [그림 3]과 같이 추천 아이템을 기반으로 유사 아이템을 선정하고 추천 아이템을 구매하지 않은 사용자에게 추천한다. [ …

+ 자세한 내용은 여기를 클릭하십시오

Source: jaydata.tistory.com

Date Published: 5/28/2021

View: 1799

카카오 AI추천 : 협업 필터링 모델 선택 시의 기준에 대하여

협업 필터링(CF): 추천에서 가장 많이 사용되는 기술로, 유저-아이템 간 상호 작용 데이터를 활용하는 방법론. · 콘텐츠 기반 필터링(CB): 콘텐츠 자체를 …

+ 더 읽기

Source: tech.kakao.com

Date Published: 6/28/2021

View: 9854

3. 아이템 기반 최근집 이웃 협업 필터링

협업 필터링은 이 ratings.csv 세트와 같이 사용자와 아이템(영화) 간의 평점에 기반해 추천하는 시스템이므로, 먼저 로우(행) 레벨 형태의 원본 데이터셋 …

+ 여기에 표시

Source: big-dream-world.tistory.com

Date Published: 4/25/2021

View: 9256

협업 필터링 추천 시스템 (Collaborative filtering … – velog

반대로 아이템을 기준으로 하는 아이템 기반 CF(Item-Based CF: IBCF)도 가능하다. 이 둘 차이는 유사도를 계산하는 기준이 …

+ 여기에 더 보기

Source: velog.io

Date Published: 5/29/2021

View: 3217

추천 시스템 기본 – 협업 필터링(Collaborative Filtering) – ①

1) 협업 필터링(Collaborative Filtering). • Memory Based Approach. – User-based Filtering. – Item-based Filtering. • Model Based Approach.

+ 여기에 보기

Source: kmhana.tistory.com

Date Published: 9/7/2022

View: 3340

주제와 관련된 이미지 아이템 기반 협업 필터링

주제와 관련된 더 많은 사진을 참조하십시오 추천 시스템 기본 – (콜라보레이티브 필터링, 컨텐트 베이스 필터링). 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

추천 시스템 기본 - (콜라보레이티브 필터링, 컨텐트 베이스 필터링)
추천 시스템 기본 – (콜라보레이티브 필터링, 컨텐트 베이스 필터링)

주제에 대한 기사 평가 아이템 기반 협업 필터링

  • Author: Minsuk Heo 허민석
  • Views: 조회수 9,766회
  • Likes: 좋아요 237개
  • Date Published: 2019. 4. 6.
  • Video Url link: https://www.youtube.com/watch?v=_YndKkun2Sw

추천시스템03. 아이템 기반 협업 필터링 (collaborative filtering) 구현

728×90

협업 필터링(collaborative filtering)

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

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

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

협업필터링의 2가지 유형

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

잠재요인 기반 필터링 (latent factor collaborative filtering)

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

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

사용자 기반 협업 필터링 : 비슷한 고객들이 ~한 item을 소비했다.

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

사용자기반, 아이템기반

사용자기반 협업필터링

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

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

아이템기반 협업필터링

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

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

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

일반적으로 정확도, 사용빈도는 사용자기반 협업필터링 < 아이템기반 협업필터링 그래서 이번엔 아이템기반 협업필터링을 적용해볼 것이다. 데이터셋 : https://www.kaggle.com/sengzhaotoo/movielens-small rating.csv : user가 movie에 평가를 매긴 데이터 moives.csv : 영화정보 데이터 목적 : 아이템기반 협업필터링으로 사용자에게 유사한 영화를 추천해준다 1. 데이터준비 2. 데이터전처리 필요없는 컬럼 삭제 movie 데이터와 평점데이터를 merge해서 하나로 합침 피봇테이블 생성 아이템 기반 협업 핕터링을 적용하기 위해서 사용자-영화에 따른 평점 점수가 데이터로 들어가야한다. 사용자-영화는 아래와 같이 두가지경우가 있을수 있다. movie_usr_rating : 영화-사용자 피봇테이블 (index : 영화, column : 사용자) usr_movie_rating : 사용자-영화 피봇테이블 (index : 사용자, column : 영화) 그런데 우리는 아이템기반 협업 필터링이기니까, 인덱스가 영화인 movie_usr_rating : 영화-사용자 피봇테이블 (index : 영화, column : 사용자) 을 사용한다. 피봇테이블의 NaN처리 NaN은 아직 평점을 매기지 않은 것으로 볼 수 있는데, fillna를 사용해서 NaN 0으로 처리한다. 3. 아이템기반 협업 필터링 유사도값 추출 (코사인유사도) 유사한 아이템끼리 추천을 해주는 방식, 즉 평점이 비슷한 아이템(영화)를 추천해주는 것이다. 현재 평점이 data로 들어가있으니까, 이 상태에서 코사인 유사도값을 이용해 유사도를 계산한다. 유사도값을 가진 데이터프레임 생성 그럼 각 아이템(영화)끼리 서로 유사한 정보의 값을 가지게 된다. 그럼 서로 유사도가 가까운 영화일수록 1에 가깝고, 자기자신과 같은 영화이면 유사도값은 1이 된다(대각선은 자기자신) 4. 영화추천 사용자 함수 생성 이제 이 데이터프레임을 가지고, 영화추천 기능을 구현하는 사용자 함수를 생성한다. 만약 사용자가 어떤 영화를 보았을때(매개변수로 영화이름 입력), 그 영화와 비슷한 영화를 추천해주는 것이다. 실제로 toy story(1995)를 보았다고 했을때, 이와 유사한 영화에 대한 결과이다. 참고 https://lsjsj92.tistory.com/568 반응형

위키백과, 우리 모두의 백과사전

협업 필터링을 통한 사용자 선호도를 예측하는 방식을 나타낸 영상.

협업 필터링(collaborative filtering)은 많은 사용자들로부터 얻은 기호정보(taste information)에 따라 사용자들의 관심사들을 자동적으로 예측하게 해주는 방법이다. 협력 필터링 접근법의 근본적인 가정은 사용자들의 과거의 경향이 미래에서도 그대로 유지 될 것이라는 전제에 있다. 예를 들어, 음악에 관한 협력 필터링 혹은 추천시스템(recommendation system)은 사용자들의 기호(좋음, 싫음)에 대한 부분적인 목록(partial list)을 이용하여 그 사용자의 음악에 대한 기호를 예측하게 된다. 이 시스템은 특정 사용자의 정보에만 국한 된 것이 아니라 많은 사용자들로부터 수집한 정보를 사용한다는 것이 특징이다. 이것이 단순히 투표를 한 수를 기반으로 각 아이템의 관심사에 대한 평균적인 평가로 처리하는 방법과 차별화 된 것이다. 즉 고객들의 선호도와 관심 표현을 바탕으로 선호도, 관심에서 비슷한 패턴을 가진 고객들을 식별해 내는 기법이다. 비슷한 취향을 가진 고객들에게 서로 아직 구매하지 않은 상품들은 교차 추천하거나 분류된 고객의 취향이나 생활 형태에 따라 관련 상품을 추천하는 형태의 서비스를 제공하기 위해 사용된다.

방법론 [ 편집 ]

협업 필터링은 보통 2가지 단계로 운영된다.

기존의 어느 정도 예측이 가능한 고객들과 비슷한 패턴을 가진 고객들을 찾는다. 기존 고객들의 행동을 예측하기 위해 첫 번째 단계에서 찾은 비슷하다고 생각된 고객들의 행동을 수치화하여 사용한다.

아니면 그 대신에, 아마존 닷컴에서 유명해진 아이템 기반의 협력 필터링은 말 그대로 아이템 중심의 방법으로 아래와 같이 운영되기도 한다.

아이템 간의 상관관계를 결정하는 아이템 매트릭스(item-item matrix)를 만든다. 매트릭스를 사용하여 최신 사용자의 데이터를 기반으로 그 사용자의 기호를 유추한다.

또 다른 협력 필터링의 방법은 보통 사용자들의 행동에 대한 암시적인 관찰(implicit observation)을 기반으로 한 방법이다.(이것은 인기도 등의 평판 시스템으로 이용한 인위적인 행동과는 반대되는 개념이다.) 이 시스템에서는 모든 사람들이 한 행동들(예를 들어, 무슨 음악을 들었는지, 무슨 물건을 샀는지 등)과 사용자가 무엇을 했는지 에 대하여 관찰하여 미래의 사용자 행위를 예측하는 방법이다. 이 예측들은 비즈니스 로직(business logic)을 통하여 필터링 되고 이 예측들로 인하여 비즈니스 시스템이 무엇을 해야 하는지에 대하여 결정한다. 예를 들어, 만약 이미 어떤 음악을 가지고 있는 사용자에게는 그 음악에 대하여 구입 추천을 하는 것이 유용하지 않기 때문에 추천을 하지 않는 등의 시스템 기능을 결정한다.

요즘 같은 정보의 홍수 시대에 협력 필터링 같은 기술은 매우 유용함이 입증 되고 있다. 단지 한 가지 카테고리(음악, 영화 등) 내에서도 아이템의 수는 갈수록 방대해지고 있고 어떤 한 사람이 자신과 관련된 아이템을 선택하기 위하여 모든 아이템을 다 본다는 것은 불가능하기 때문에 이와 같은 기술은 더욱 유용해진다. 모든 사용자를 통한 평균화하는 스코어링또는 레이팅 시스템은 개인 사용자의 특정 관심사를 무시하고, 특히 요즘 같이 관심사가 다양해지고 있는 시대에서는 알맞지 않다. 정보의 홍수에 대항하기 위하여 또 다른 방법에는 웹서치, 데이터 클러스터링 등이 존재한다.

역사 [ 편집 ]

협력 필터링은 초기의 정보 필터링(information filtering: 특정 사용자의 프로필을 만들고 이전의 행동에 대해 패턴 관찰을 함으로써 특정 사용자의 관심사를 가지고 이와 관련된 정보를 만든다)과는 배치된다. 초기의 정보 필터링 시스템은 콜드스타트(cold-start) 문제를 겪게 될 뿐만 아니라 정보 홍수 시대에 대하여 도움이 되지 않는다. 즉, 필터링의 효력을 보기 전에 새로운 사용자는 경향을 형성 해야 하는 문제를 겪게 된다.

협력 필터링을 사용한 초기 시스템은 제록스 팔로 알토 리서치 센터(Xerox PARC)에서 개발한 정보 태피스트리 프로젝트이다.(the Information Tapestry project) 이 시스템에서는 다른 사용자가 이전에 코멘트한 것을 기반으로 사용자가 문서를 찾을 수 있게 해준다. 하지만 이 시스템에도 약점이 있는데, 첫째로 단지 작은 집단에서만 사용될 수밖에 없다는 것이고, 둘째로 협력적 필터링의 목적에 크게 배치되는 word specific queries을 통하여 접근하기 때문이다.

나아가 유즈넷 넷뉴스(USENET Net news)는 대중이 기사를 간단한 방법으로 접근하게 하면서 사용자들의 인기도를 기반으로 기사에 대한 평가(Rate)를 하게 하면서 다른 사용자들이 이 평가를 기반으로 검색을 할 수 있게 끔 한 협업 필터링이다.

종류 [ 편집 ]

능동적 필터링 [ 편집 ]

능동적 필터링은 최근에 인기가 증가한 방법이다. 그 이유는 WWW(World Wide Web)의 유저들이 사용할 수 있는 정보 기반이 계속 증가 하고 있기 때문이다. 하지만 인터넷을 통하여 기하급수적으로 증가하고 있는 정보의 양으로 인해 가치있는 정보의 검색 효율성은 갈수록 어려워 지고 있다. 최근에 WWW을 통한 기본적인 정보 검색은 수많은 결과를 찾아 주지만 그 결과의 검색방법이 효과적이지도 않고 관계도도 떨어지고 있다. 오늘날 시장에서 수많은 데이터와 검색 엔진들이 검색을 위해 사용되고 있지만 대부분의 사람들은 검색을 위한 모든 옵션의 사용에 대하여 익숙하지가 않다. 이런 환경에서 능동적 필터링이 효과적인 방법으로 대두되고 있는 것이다.

능동적인 필터링은 P2P 방식이기 때문에 다른 협업 필터링과도 차별화 된다. 이것은 비슷한 관심사를 가진 동료, 친구 등의 사람들이 상품 등을 평가하고 또한 웹에서 이런 정보들을 공유하고 서로 볼 수 있다. 이 시스템은 사람들이 다른 비슷한 사람들과 함께 구매한 물건에 대한 정보를 공유하기를 원한다는 사실에 기초로 하고 있다. 능동적인 필터링은 웹을 통하여 정보를 보낸 다른 사용자들의 상품의 평가를 볼 수 있고 그것을 기반으로 자신만의 구매 결정을 하게 해준다.

능동적인 필터링은 많은 경우에 많은 사람들에게 유용하다. 이 능동적인 필터링은 유도 웹 검색기반이 없는 경우(non-guided web search)에 가장 중요하고 효율적이다. 유도 웹 검색기반이 없는 것(non-guided web search)은 단지 수많은 정보만을 생산하기 때문에 정보에 정확하게 접근하려고 하는 사람에게는 효율적이도 유용하지도 않다.

장점 [ 편집 ]

능동적인 협업 필터링을 사용하는 것에는 여러 장점이 있다. 장점 중에 하나는 이 방법이 어떤 상품과 주제에 대한 관심사를 가진 사람들이 실제 평가를 했다는 것이다. 이 시스템은 근거있는 설명과 순위를 신뢰성 있는 정보로부터 생성한다. 다른 장점은 사람들이 궁극적으로 직접 그 문제를 고려하여 정보를 공급한다는 것이다.

단점 [ 편집 ]

능동적인 협업 필터링에는 여러 단점들도 있다. 그 중에 하나는 의견이 편견을 가질 수 있다는 것이다. 또한 피드백의 생성의 경우는 사용자의 직접적인 행동이 요구되기 때문에 수동적인 필터링에 비하여 적은 데이터만이 사용될 것이다. 그리고 사용자 기대가 맞아 떨어지지 않을 수도 있다. 협업 필터링의 주요 특징 중 하나는 콘텐츠 기반의 필터링과 비교하여 실제 아이템의 내용과 그것이 무엇에 관한 것인지에 관한 내용을 전혀 알지 못한 상태에서의 방법이라는 것이다. 이 의미는 단지 기호 가치들(preference values)에만 의존한다는 것이다. 이것은 각 상품에 대한 성능에 대한 통찰력이 다른 사람들의 평가에 높게 의존하게 되고 결국 평준화 효과를 가져 오게 된다. 평준화 효과는 전체적으로 가장 많이 추천된 상품에 결과적으로 사람들이 더욱 많이 소비하고 더 많이 평가를 하게 되면서 그 상품이 더욱 추천되는 결과를 가져온다.

일반적으로 잘 알려진 협력 필터링에 대한 두가지 이슈는 다음과 같다. 첫 번째는 초기 평가자 문제 (First-Rater Problem)이고 두 번째는 콜드 스타트 문제(Cold-Start Problem)이다. 초기 평가자 문제 (First-Rater Problem)는 어느 사용자에게도 평가받지 못한 새로운 아이템이 있을 경우에 일어난다. 이런 경우에는 시스템에서 이들의 아이템에서는 의미 상호작용 (semantic interconnection)을 생성 시킬 수도 없기 때문에 당연히 절대 추천 될 수 도 없다. 유사하게 콜드 스타트 문제(Cold-Start Problem)는 지금까지 한번도 평가를 하지 않은 사용자들이 있을 경우에 일어난다. 이런 경우에는 시스템은 사용자의 어느 정보도 없기 때문에 사용자의 기호도 예측과 추천을 할 수가 없다.

수동적 필터링 [ 편집 ]

미래의 가장 잠재력있는 협업 필터링 방법은 정보를 함축적으로 수집하는 수동적 필터링(passive filtering)이라고 여겨지고 있다. 여기서 웹 브라우저는 사람들의 행동을 추적하고(following) 평가에 의해 사용자들의 기호도를 저장하기 위하여 사용된다. 이 필터는 사용자들이 좋아할만하고 추천받을 만한 관심사 중의 다른 상품을 구매 결정하기 위하여 사용된다.

수동적인 협업 필터링의 중요한 특징은 사용자가 문서를 단순히 스캐닝 할 것인지 정독을 할 것 인지에 대한 결정을 하기 위한 측면에서 시간을 사용한다. 이 시스템의 가장 큰 장점은 능동적인 필터링에서 일반적으로 나타나는 분석들로부터 특정한 변화를 제거할 수 있다는 것이다. 예를 들어, 단지 특정한 종류의 사람만이 사이트의 평가를 하기 위해 시간을 보내는 것과는 달리 수동적 협업필터링에서는 모든 사람이 자동적으로 주어진 데이터를 가지고 접근할 수 있다.

아이템 기반 필터링 [ 편집 ]

아이템 기반 필터링은 협업 필터링의 또 다른 방법으로서 사용자들 대신에 평가된 아이템이 파라미터(parameter)로 사용된다. 아이템 기반 협동적 필터링은 대부분의 사람들이 과거에 자신이 좋아했던 상품과 비슷한 상품이면 좋아하는 경향이 있고 반대로 싫어했었던 상품과 비슷한 상품이면 싫어하는 경향이 있다는 점을 기반으로 하고 있다. 이 필터링 방법은 고객이 선호도를 입력한 기존의 상품들과 예측하고자 하는 상품과의 유사도(similarity)를 계산하여 고객의 선호도를 예측하는 방법이다. 즉, 예측하고자 하는 상품과 비슷한 상품들에 대하여 고객이 높은 평가를 하였다면 그 상품도 높게 평가를 할 것이라고 예측하고, 낮은 평가를 하였다면 그 상품도 낮게 평가를 할 것이라고 예측하는 것이다. 아이템 기반 협동적 필터링 방법은 상품들간의 유사도를 계산하기 위하여 두 상품에 모두 선호도를 입력한 고객들의 선호도를 사용한다. 그러나 고객들간의 유사도가 전혀 고려되지 않기 때문에 만약 특정 고객과 전혀 선호도가 비슷하지 않은 사용자들의 평가를 기반으로 한다면 상품들간의 상관 관계의 정확도가 떨어지고, 아울러 추천 시스템의 예측 능력과 추천 능력이 저하될 수 있다.

능동적 필터링과 수동적 필터링 [ 편집 ]

적극적 필터링과 소극적 필터링 내에는 사용자의 선호도를 결정하기 위한 명시적 방법과 암시적 방법이 있다. 사용자 선호도의 명시적인 수집은 평가자로 하여금 그 컨텐트에 대한 점수를 부여하게 만든다. 이는 협업 필터링에 인식적인 측면을 부여하지만, 피드백이 더욱 정확하다는 것을 의미할 수도 있다. 암시적인 수집은 사용자에 의한 직접적인 의견을 포함하지 않지만, 대신 그들의 의견이 행동에 의해 암시된다고 가정한다. 이는 사용자간의 다양성을 줄이고 사용자의 요구를 줄이며, 이는 곧 더 많은 데이터를 사용할 수 있다는 것을 의미한다. 하지만, 이러한 행동 데이터가 꼭 아이템에 대한 사용자의 진정한 의견을 정확히 대변한다고 할 수는 없다.

오늘 할 일: 끝내주게 숨쉬기 오늘 할 일: 끝내주게 숨쉬기

지난 추천시스템 3편에서는 컨텐츠 기반 필터링에 대해 알아보았습니다. 컨텐츠 기반 필터링은 아이템의 정보를 이용하여 과거에 사용자가 좋아했던 아이템과 유사한 다른 아이템을 추천하는 방식이죠. 본 포스팅에서는 컨텐츠 기반 필터링과 함께 널리 쓰이는 추천시스템인 협업필터링, 그 중 이웃기반 협업필터링에 대해 알아보겠습니다.

협업필터링(Collaborative Filtering)

먼저 협업 필터링이 무엇인지 다시 떠올려보겠습니다. 협업 필터링의 정의는 추천시스템 2편에서도 다룬 적이 있었는데요, ‘특정 상품에 대한 선호도가 유사한 고객들은 다른 상품에 대해서도 선호도가 비슷할 것이다’ 라는 가정하에 사용자의 아이템 평가 데이터를 이용해 비슷한 선호도를 갖는 다른 사용자가 선택한 아이템을 추천하는 방식을 협업 필터링이라고 했습니다.

예를 들어 영화 겨울왕국1에 대한 평가가 유사한 두 사람에게, 어느 한쪽이 아직 시청하지 않았지만 다른 사림이 좋은 평가를 내린 영화 겨울왕국2를 추천하는 식입니다.

출처: https://towardsdatascience.com/getting-started-with-recommender-systems-and-tensorrec-8f50a9943eef

협업 필터링은 잠재적인 고객 선호도를 추정하여 다양한 상품을 추천할 수 있게 합니다. 사용자가 본인도 몰랐던 새로운 취향을 발견할 수 있겠죠. 하지만 사용자나 아이템의 특징을 사용하지 않기 때문에 사용자와 아이템의 interaction 데이터가 충분히 갖춰져야 시도할 수 있습니다. 새로운 상품이나 고객이 추가되면 관련 정보가 없기 때문에 추천이 불가능한 cold-start 문제도 갖고 있고, 고객 수나 아이템 수가 너무 많으면 아이템을 구매한 고객 비율이 매우 적어져 추정된 선호도가 정확하지 않을 수도 있다는 단점도 있습니다.

협업 필터링은 크게 이웃기반 협업 필터링(또는 메모리기반 협업필터링)과 모델기반 협업필터링(또는 잠재요인 협업필터링)으로 나누어져있는데요, 이번 포스트에서는 이웃기반 협업필터링만 다루겠습니다.

이웃기반 협업필터링(Neighbor based Collaborative Filtering)

이웃기반 협업필터링은 사용자가 아이템에 대하여 남긴 평점 데이터를 이용하여 아직 평점을 남기지 않은 아이템들에 대해 예측을 수행하고, 예측 평점이 높은 N개의 아이템을 추천하는 방식입니다. 평점 데이터는 아래 그림과 같이 행은 사용자 인덱스, 열은 아이템 인덱스를 갖는 행렬로 구성할 수 있겠습니다. 사용자가 과거에 경험한 아이템에 대해 평가를 하고, 경험하지 않은 아이템은 빈 값으로 두는 것이죠. 이 빈 값을 채워서 예상 평점을 높게 받은 아이템을 추천합니다. 몇 개의 아이템을 추천할지는 추천 시스템을 적용할 플랫폼의 환경을 고려하여 결정하거나 혹은 비즈니스 관점에서 결정할 수 있겠죠.

이웃기반 협업필터링은 어떤 것끼리 유사도를 계산할 것인가?를 기준으로 사용자 기반(User-based) 협업필터링과 아이템 기반(Item-based) 협업필터링으로 나눌 수 있습니다.

(A) 사용자 기반 협업 필터링(User-based Collaborative Filtering)

사용자 기반 협업 필터링은 우선 사용자간 유사도를 계산합니다. 사용자간 유사도를 추정해보니 사용자 B와 사용자 D가 유사한 사용자로 판명이 났어요. 그럼 사용자 B가 사용했지만 사용자 D는 사용하지 않은 아이템 7번을 사용자 D에게 추천해주는 것입니다.

(B) 아이템 기반 협업 필터링(Item-based Collaborative Filtering)

아이템 기반 협업 필터링은 아이템간 유사도를 계산합니다. 아이템간 유사도를 추정해보니 아이템 2번과 아이템 4번이 유사하다고 나타난 거죠. 그럼 아직 아이템 4번을 사용하지 않은 사용자 E에게 아이템 4번을 추천해주는 것입니다.

사용자 기반 협업 필터링 계산 예시

아이템 1번 아이템 2번 아이템 3번 아이템 4번 아이템 5번 사용자 A 5 4 4 3 사용자 B 1 0 1 4 사용자 C 4 4 5 3 사용자 D 2 1 4 3 사용자 E 4 4 4 2 사용자 F 4 2 3 1

사용자가 아이템에 대해 평가한 데이터가 위와 같이 주어져 있다고 하겠습니다. 사용자 A ~ F가 아이템 1번 ~ 5번에 대해 0점에서 5점 사이의 점수를 주었습니다. 평가하지 않은 아이템은 빈 값으로 두었구요.

먼저, 사용자간 유사도를 계산합니다. 예를 들어 사용자 B와 사용자 D가 얼마나 유사한지를 코사인 유사도를 사용하여 계산하면 아래와 같이 계산이 되겠죠.

사용자 B와 사용자 D가 함께 평가한 아이템 2번, 3번 그리고 5번의 평점만을 이용하여 유사도를 계산한 결과, 0.84로 매우 유사하다고 나타났습니다. 이렇게 모든 사용자들끼리의 유사도를 계산하여 사용자 유사도 행렬을 완성합니다.

(💁‍♀️ 유사도의 종류를 알고 싶다면? -> 유사도의 종류와 파이썬 구현 포스트를 참고하세요)

사용자 A 사용자 B 사용자 C 사용자 D 사용자 E 사용자 F 사용자 A 1.00 0.84 0.96 0.82 0.98 0.98 사용자 B 0.84 1.00 0.61 0.84 0.63 0.47 사용자 C 0.96 0.61 1.00 0.97 0.99 0.92 사용자 D 0.82 0.84 0.97 1.00 0.85 0.71 사용자 E 0.98 0.63 0.99 0.85 1.00 0.98 사용자 F 0.98 0.47 0.92 0.71 0.98 1.00

전체 사용자 간의 유사도를 계산하면 위와 같이 사용자 유사도 행렬을 얻을 수 있습니다. 자기 자신과의 유사도는 1.0이고, 행과 열의 인덱스가 동일하기 때문에 대각원소를 기준으로 대칭인 것을 확인할 수 있습니다.

이제 이 사용자 유사도 행렬을 바탕으로 사용자 B가 아이템 4번에 내릴 평점을 예측해보겠습니다. 점수를 예측하는 방식에도 여러 방법이 있는데, 여기서는 모든 사용자의 점수를 이용해 가중합을 구하는 방식으로 계산해보겠습니다. 아이템 4번에 평가를 내렸던 사용자 A, C, D, E의 평점과 사용자 B와 A, C, D, E의 유사도를 이용하여 가중합을 구하면 아래와 같습니다. 사용자 F는 아이템 4번에 평가하지 않았기 때문에 계산에 이용하지 않습니다.

사용자 B는 아이템 4번에 대해서 3.92점을 줄 것으로 예측되었습니다. 5점이 최고점인 것을 생각하면 나름 높은 점수를 줄 것으로 예상한 거죠.

이런 방식으로 사용자-아이템 평가 행렬을 채우고, 높은 점수를 받은 아이템들을 선별하여 사용자에게 추천합니다. 높은 점수를 받은 아이템 중 사용자가 이미 경험했던 아이템은 제외하고 추천할 아이템을 줄세우기하여 사용자에게 제공하면 추천 시스템이 완성됩니다.

이상으로 협업 필터링 중 이웃기반 협업 필터링에 대해 알아보았습니다. 협업 필터링과 이웃기반 협업 필터링의 정의를 살펴보았고, 이웃기반 협업 필터링에 속하는 사용자 기반과 아이템 기반에 대해 알아보았습니다. 보통 사용자 수가 아이템 수보다 훨씬 많기 때문에 사용자 간의 유사도를 구하는 비용이 더 많이 든다고 해요. 그래서 사용자 유사도 행렬을 구하는 것보다 아이템 유사도 행렬을 구하는 아이템 기반 협업필터링이 널리 쓰인다고 알려져 있습니다. 실제로 세계 최대 온라인 쇼핑몰인 아마존은 아이템 기반 추천을 실행한다고 하네요. 각자의 비즈니스 상황을 파악하고 적절한 협업 필터링을 적용하면 빠르고 성능 좋은 추천 시스템을 구축할 수 있을 것 같습니다.

다음 포스트에서는 이웃기반 협업 필터링과 함께 협업 필터링에 속하는 모델기반 협업필터링에 대해 알아보겠습니다.

[Algorithms] 협업필터링(Collaborative Filtering)

반응형

Table of Contents

Introduction 협업필터링(Collarborative Filtering)이란? 협업필터링의 한계 기억 기반 협업필터링(Memory based Collaborative Filtering) in R Reference

Introduction

과거 유통 채널은 오프라인을 통해 판매자와의 소통을 통해 제품을 구매하였다면, 정보 기술의 발달은 이러한 채널의 변화를 가져왔다. TV를 켜도 홈 쇼핑이 방송이 되고, 컴퓨터와 스마트폰을 봐도 다양한 형태의 비대면 판매 채널이 존재한다. 채널의 다양화는 제품을 선택하는데 있어서 구매의 어려움을 야기한다. 따라서 판매자는 소비자의 선호도에 따라 제품을 추천하고 이를 구매로 연결시키는데, 적절한 추천을 하기 위한 다양한 연구가 진행되고 있다. 추천 시스템 기법 연구동향 분석(Son et al., 2015)에 따르면 1990년대부터 추천시스템에 관한 연구가 본격적으로 이루어진 것으로 나타난다. 추천 방법에는 베스트셀러기반 추천방법, 최소질의대상 상품결정 방법, 연관성 분석, 콘텐츠 기반 추천 방법, 협업 필터링, 하이브리드 추천 방법 등이 있다. 이번 편에서는 협업 필터링이 무엇인지 알아보고 협업필터링을 이용한 상품 추천을 R에서 재현한다.

협업필터링(Collaborative Filtering)이란?

지금의 협업필터링은 1992년 제록스 팰러앨토 리서치 센터의 데이비드 골드버그(David Goldberg), 데이비드 니콜스(David Nichols), 브라이언 오키(Brian Oki), 드글라스 테리(Douglas Terry)에 의해 제안된 개념이다. 협업필터링의 접근 방식은 군중의 심리(Wisdom of the crowd)를 바탕으로 상품을 추천하는 것이다. 즉, 협업필터링은 ‘아이템 선호도가 유사한 고객들 간의 아이템도 비슷한 선호도를 보인다’는 가정으로 사용자 또는 아이템간 유사도를 이용한 추천 방식이다. 협업필터링의 기본 아이디어를 살펴보면 사용자가 아이템에 대한 평가를 명시적으로 또는 암묵적으로 표현한다. 과거의 유사한 취향을 갖고 있는 고객은 미래에도 유사한 취향을 가질 것이라는 기본 전제가 있다는 점을 주목해야한다.

가장 기본적인 협업필터링의 입력 데이터를 살펴보면 사용자-아이템 평가 매트릭스만을 사용하여 2가지의 결과물을 추출한다. 첫 번째 결과물은 사용자의 선호도 또는 비선호도 점수를 예측하거나 Top-N개의 상품추천 목록을 추출할 수 있다.

[그림 1]은 협업필터링을 이용한 추천방식으로 협업필터링은 크게 기억 기반 협업필터링과 모델 기반 협업 필터링으로 구분되며, 기억 기반 협업 필터링은 다시 사용자 기반 협업필터링과 아이템 기반 협업 필터링으로 구분한다.

[그림 1] 협업필터링 추천 구분

모델 기반 협업필터링은 휴리스틱 기법을 바탕으로 추천을 하는 협업 필터링으로 사용자 선호도를 범주화하여 나타낸 데이터는 분류모델을 사용하고 연속형 데이터는 회귀모델이나 특이값 분해 기법을 사용한다. 반면, 기억 기반 협업필터링은 크게 사용자 기반 협업필터링과 아이템 기반 협업필터링으로 구분한다. 사용자 기반 협업필터링은 [그림 2]와 같이 구매 이력을 바탕으로 추천 대상 고객과 다른 사용가 간의 유사도를 측정하여 유사도가 높은 사용자를 이웃으로 선택하고 해당 사용자가 보유한 상품 중 미보유한 상품을 추천한다.

[그림 2] 사용자 기반 협업 필터링

반대로 아이템 기반 협업필터링은 [그림 3]과 같이 추천 아이템을 기반으로 유사 아이템을 선정하고 추천 아이템을 구매하지 않은 사용자에게 추천한다.

[그림 3] 아이템 기반 협업 필터링

협업필터링의 한계

협업필터링은 추천 대상 고객의 선호도를 예측하기 위해 사용자-아이템 행렬을 활용한다. 이 행렬의 기본적인 방식은 사용자별로 아이템에 평점을 부여하고 이 결과로 행렬을 구성하는 방식이다. 이때, 최OO의 경우 어떤 Item에도 평가를 하지 않았다. 이럴 경우 유사도를 구할 수 없으며 이를 ‘Cold Start’라고 부른다. 반면 Item4의 경우 아무도 구매를 하지 않아서 평가가 없거나 신규 아이템으로 평가가 없는 경우 유사도를 구할 수 없기 때문에 누군가 평가를 할 때까지 추천을 할수 없어 없는 상황을 ‘First Rater’라고 한다. 이처럼 데이터의 부족으로 발생하는 문제를 데이터 희소성(Data Sparsity)라고 하며, 이는 상품추천 품질의 저하를 야기하게 된다. 현재는 이를 해결하기 위해 클릭수, 페이지 조회수, 특정 페이지 대기 시간, 데모 다운로드 등 다양한 방식을 시도하고 있다.

Item 1 Item 2 Item 3 Item 4 김OO 5 ? 2 박OO 5 5 1 이OO 5 5 정OO 5 5 2 최OO

사용자가 늘어나고 판매하는 상품이 늘어날수록 사용자-아이템 행렬의 크기는 증가하고, 유사도를 계산하기 위한 계산 시간이 증가하게 된다. 보통 추천 시스템은 실시간으로 갱신되는 정보를 바탕으로 빠르게 추천해야 하는데 제약사항이 크며, 이를 확장성의 한계(Scalability)이라한다. 이는 유사도가 높은 순서 N개의 데이터만 필터하여 사용하여 한계를 극복하기 위한 방식을 시도하고 있다.

협업필터링의 또 다른 한계점으로는 Grey Sheep이 있다. 협업필터링의 기본적인 접근 방식은 사람들의 취향에는 경향성과 패턴이 존재한다고 가정하고 있으나 일관성 없는 의견을 제시할 경우 만들어진 사용자-아이템 행렬의 경우에는 왜곡을 불러일으킬 수 있다. 이 또한 해결하기 위해 콘텐츠 기반 필터링(Contents based Filtering)과 협업필터링을 모두 사용한 연구를 시도했다.

마지막 한계점으로는 강제로 평가지표를 왜곡하는 경우로 Shilling Attack이라 한다. 고객의 선호도를 기반으로 협업필터링을 하기 때문에 중요한 지표로 삼고 있으나 생산자가 의도적으로 본인 제품 선호도를 높게 작성하고 경쟁사 제품을 낮게 작성할 경우 발생할 수 있다. 이처럼 악의적으로 선호도를 조작하는 경우를 말하며 이를 막기 위한 다양한 방식을 시도하고 있다.

기억 기반 협업필터링(Memory based Collaborative Filtering) in R

R에서 협업필터링을 사용하기 위해 recommenderlab패키지를 활용할 수 있다. 특히, 해당 패키지에는 협업필터링을 이용한 추천시스템을 구현하기 위한 샘플 데이터 “MovieLense”가 있다. MovieLense를 불러오면 총 3개의 데이터가 나타난다. MovieLense는 영화에 대한 평점 데이터이고 MovieLenseMeta는 영화 장르, 개봉일, URL 정보가 있다. 마지막으로 MovieLenseUser는 고객 정보로 성별, 연령, 직업, 우편번호가 있다.

install.packages(“recommenderlab”) library(recommenderlab) data(“MovieLense”)

recommenderlab 패키지에는 이 MovieLense 데이터의 유사도를 계산하는 함수가 있다. 이때 사용하는 함수는 similarity() 함수로 코사인(Cosine) 유사도, 피어슨(Pearson) 유사도, 자카드(Jaccard) 유사도 등을 사용할 수 있으며, 아이템 기반 유사도 또는 유저 기반 유사도를 선택할 수 있다. 일반적으로 realRateMatrix인 경우 코사인 유사도를 사용하고, binaryRatingMatrix에서는 자카드 유사도를 사용한다.

similar_items = similarity(MovieLense[, 1:5], method = “cosine”, which = “items”)

전체 영화 평점 가운데 일부를 이용해서 아이템 기반 유사도를 측정한 결과 다음과 같다. 이 유사도 행렬을 살펴보면, Toy Story(1995)를 선호하는 사람들은 GoldenEye(1995)를 상당히 선호한다고 볼 수 있다.

Toy Story (1995) GoldenEye (1995) Four Rooms (1995) Get Shorty (1995) GoldenEye (1995) 0.9487374 Four Rooms (1995) 0.9132997 0.9088797 Get Shorty (1995) 0.9429069 0.9394926 0.8991940 Copycat (1995) 0.9613638 0.9426876 0.9424719 0.8919936

이와 같이 유사도를 이용한 상품추천 모델을 생성하기 위해서 먼저, 데이터를 7:3으로 분할해준다.

trainIndex = sample(x = c(TRUE, FALSE), size = nrow(MovieLense), replace=TRUE, prob=c(0.7, 0.3)) # 학습용 데이터 train = MovieLense[trainIndex, ] # 검증용 데이터 test = MovieLense[-trainIndex, ]

분할한 학습용 데이터를 이용해서 아이템 기반 협업필터링을 수행한다. 이때, method는 아이템 기반 협업필터링(IBCF)을 할 것인지, 사용자 기반 협업필터링(UBCF)을 할 것인지, 가장 인기 있는 상품을 추천(POPULAR)할 것인지 세팅할 수 있으며, parameter에서는 근접 이웃의 수를 결정하거나 유사도 계산 방식을 결정할 수 있다.

recommenderModel = Recommender(data = train, method = “IBCF”, parameter = list(k = 30, method = “cosine”))

이렇게 생성된 추천 모델을 바탕으로 상품을 추천하기 위해 검증용 데이터를 이용해서 10개의 영화를 추천해보도록 한다. predicted를 실행시키면 ‘Recommendations as ‘topNList’ with n = 10 for 942 users’라는 메시지가 나타난다. 942명의 사용자에게 10개의 상품추천 리스트가 추천되었다.

predicted = predict(recommenderModel, newdata = test, n = 10)

해당 추천 리스트를 살펴보기 위해서 첫번째 사용자부터 살펴보자. True Romance(1993), Akira(1988), Sphere(1998) 등 총 10가지의 영화를 추천한 것을 확인할 수 있다.

user1Recommend = [email protected][[1]] [email protected][user1Recommend] [1] “True Romance (1993)” “Akira (1988)” [3] “Sphere (1998)” “Miserables, Les (1995)” [5] “For Whom the Bell Tolls (1943)” “My Man Godfrey (1936)” [7] “Cape Fear (1962)” “Thirty-Two Short Films About Glenn Gould (1993)” [9] “Celluloid Closet, The (1995)” “Gay Divorcee, The (1934)”

Reference

David Goldberg at al, 1992, “Using Collaborative Filtering to Weave an Information Tapestry”

Paul Resnick at al, 1994, “GroupLens: An Open Architecture for Collaborative Filtering of Netnews”

Michael Hahsle, 2011, “recommenderlab: A Framework for Developing and Testing Recommendation Algorithms”

Son at al, 2015, “Review and Analysis of Recomender Systems”

Lee Bo Mi, 2020, “VIP 등급과 보안매체등급 정보를 이용한 협업필터링 기반 스마트뱅킹 금융상품 추천”

Michael Hahsle, 2021, “https://cran.r-project.org/web/packages/recommenderlab/recommenderlab.pdf”

반응형

카카오 AI추천 : 협업 필터링 모델 선택 시의 기준에 대하여

안녕하세요. 카카오 추천팀의 hee.yoon입니다.

여기에서는 협업 필터링(Collaborative Filtering, CF)이 무엇인지를 먼저 살펴 본 다음, 협업 필터링을 활용해 추천 시스템을 개발할 때 중요하게 고려해야 하는 항목에 대해 이야기하고자 합니다.

들어가며

협업 필터링(Collaborative Filtering, CF)을 활용하여 새로운 추천 모델을 만들어야 한다고 생각해 봅시다. 무엇부터 고민을 시작할 것 같나요?

어떤 모델을 쓸까? Matrix Factorization(행렬 분해)1 모델을 쓸까? 딥러닝 모델을 쓸까? ···

사실 이보다 더 중요하게 고민해야 할 부분은 “어떤 문제를 풀까”입니다. 어떤 문제를 푸느냐에 따라, 어떤 모델이 적합할지에 대한 답을 할 수 있게 되겠죠.

예를 들어, 이미 많은 유저가 사용하고 있어 충분한 피드백이 있는 서비스와, 그렇지 않은 서비스에서 사용할 수 있는 모델은 서로 다를 수 있습니다. 아이템을 1개만 추천하는 구좌와 30개를 추천하는 구좌에서도 차이가 있을 수 있습니다. 또한, 클릭 확률을 정확하게 예측하는 것이 중요한 경우도 있고, 그보다는 랭킹 자체가 더 중요한 경우도 있습니다.

이처럼 다양한 상황에서 활용할 수 있는 추천 모델은 각기 다를 수 있습니다. 먼저 추천 모델의 종류를 알아보고, 이중 추천 시스템에서 가장 많이 활용되고 있는 협업 필터링(CF)이 무엇인지를 살펴보겠습니다. 이어서, 이를 활용해 추천 시스템을 개발할 때 중요하게 고려해야 하는 점들에 대해 살펴봅시다.

1Matrix Factorization(행렬 분해) 모델: 사용자의 기호 데이터를 행렬로 만드는 방식. 모든 사용자가 모든 콘텐츠를 소비할 수는 없기 때문에, 비어있는(sparce) 행렬이 만들어지는데, 이렇게 행렬의 비어 있는 부분을 채우는 기술을 통틀어 Matrix Factorization(행렬 분해)이라고 함.

추천 모델

추천 모델은 크게 두 가지로 나눌 수 있습니다. 유저, 아이템 상호작용 데이터를 활용하는 협업 필터링(Collaborative Filtering, CF) 모델과, 유저 및 아이템의 텍스트 및 이미지 정보 등을 활용하는 콘텐츠 기반 필터링(Content-based Filtering, CB) 모델입니다.

협업 필터링(CF): 추천에서 가장 많이 사용되는 기술로, 유저-아이템 간 상호 작용 데이터를 활용하는 방법론. 즉, “이 영화를 좋아했던 다른 사람들은 또 어떤 영화를 좋아해요?”

추천에서 가장 많이 사용되는 기술로, 유저-아이템 간 상호 작용 데이터를 활용하는 방법론. 즉, “이 영화를 좋아했던 다른 사람들은 또 어떤 영화를 좋아해요?” 콘텐츠 기반 필터링(CB): 콘텐츠 자체를 분석해 유사한 콘텐츠를 찾는 기술로, 대상 자체의 특성을 바탕으로 추천하는 방법론. 즉, “라디오헤드를 좋아하는 사람은 콜드플레이도 좋아하지 않을까요?”

CF 모델의 핵심 가정은 나와 비슷한 취향을 가진 유저들은 어떠한 아이템에 대해 비슷한 선호도를 가질 것이라는 점입니다. 실제로 주위에서도 몇 가지 영화 취향이 비슷한 경우, 임의의 영화에 대한 평이 비슷할 가능성이 높습니다. 한편, CB 모델의 경우, 유저-아이템의 상호작용 데이터 없이도, 아이템 자체의 이름, 카테고리, 상세 설명, 이미지 등을 활용해 유사성을 판단하고 비슷한 아이템을 추천할 수 있습니다.

신규 아이템의 경우, 유저와의 상호작용 데이터가 없기 때문에 CF 모델에서는 추천되기 어렵지만, CB 모델에서는 텍스트 혹은 이미지 유사성 기반의 추천이 가능합니다. 한편, CF 모델은 유저-아이템의 상호작용을 바탕으로 하기 때문에, 꼭 텍스트/이미지 기반 유사성이 높지 않더라도, 실제로 함께 소비하는 경향이 높은 아이템을 발견하여 추천이 가능합니다. 이처럼 CF와 CB 모델은 서로 상호 보완적인 역할을 한다고 볼 수 있습니다.

이 중에서, 추천 시스템에서 가장 많이 사용되는 기술인 만큼 “CF 모델”에 초점을 맞춰 보겠습니다.

협업 필터링(Collaborative Filtering, CF) 모델

CF 모델은 크게 두 가지 접근 방법으로 나뉩니다. 메모리 기반의 접근 방식과 모델 기반의 접근 방식입니다.

메모리 기반의 접근 방식: 가장 전통적인 접근 방식입니다. 유저 간/아이템 간 유사도를 메모리에 저장해두고 있다가, 특정 유저에 대하여 추천이 필요할 때 해당 유저와 유사한 k 명의 유저가 소비한 아이템들을 추천하거나, 혹은, 특정 아이템에 대한 Rating 예측이 필요할 때 해당 아이템과 유사한 k 개의 아이템의 Rating을 기반으로 추정을 할 수 있습니다.

가장 전통적인 접근 방식입니다. 유저 간/아이템 간 유사도를 메모리에 저장해두고 있다가, 특정 유저에 대하여 추천이 필요할 때 해당 유저와 유사한 k 명의 유저가 소비한 아이템들을 추천하거나, 혹은, 특정 아이템에 대한 Rating 예측이 필요할 때 해당 아이템과 유사한 k 개의 아이템의 Rating을 기반으로 추정을 할 수 있습니다. 모델 기반의 접근 방식: Latent Factor 방식과 Classification/Regression 방식 및 딥러닝을 사용한 접근 등 다양한 접근 방식이 있습니다.

모델 기반의 접근 방식

Latent Factor2 방식: Matrix Factorization(행렬 분해)

모델 기반의 접근 방식 중에서도 Latent Factor 기반의 방식, 특히 아이템 Latent Vector(잠재 벡터)와 유저 Latent Vector 간 Inner Product로 아이템에 대한 유저의 선호를 모델링 하는 Matrix Factorization 방식의 접근은, 간단하지만 강력한 추천이 가능합니다. Autoencoder3를 추천에 활용하기도 하는데, 이는 Latent Factor 방식의 일반화(Generalization)4라고 볼 수 있습니다. (10번 레퍼런스 참조)

Classification/Regression(분류/회귀) 방식

Classification/Regression 방식은 콘텐츠 기반 추천 방식과 쉽게 융합이 가능합니다. 피처 X 가 주어졌을 때, 라벨 y를 예측하는 구조이기 때문에, 피드백 y를 예측하는 상황에서, X에 콘텐츠 관련 정보를 피처로 만들어서 추가하면, 피드백 데이터뿐만 아니라 콘텐츠 데이터를 활용한 추천이 가능합니다.

최신의 융합 모델 방식

최근에는 다양한 방식의 모델들이 제안되며, 단순하게 모델을 분류하기 어려운 부분도 있는데요, Latent Factor 모델과 Classification/Regression 모델의 특징을 모두 가지고 있는 Factorization Machine 계열의 모델들도 제안되어 왔고, 딥러닝을 활용하여 복잡한 Interaction을 모델링 하는 방향으로 Latent Factor 모델을 확장한 Neural Collaborative Filtering도 제시되었으며, 레이어 설계가 자유로운 딥러닝 모델 특성상 자연스럽게 콘텐츠 정보를 결합한 하이브리드 추천 방식의 모델도 많이 제안되었습니다.

이처럼, 다양한 CF 모델 중 어떤 CF 모델을 사용해야 할지는 크게 다음의 3가지 요소가 결정합니다.

2Latent Factor(잠재 인수) : 사용자와 아이템 데이터에 숨어있는 특징을 잠재적인 차원(Factor)을 사용해 나타내고자 하는 모델로, Matrix Factorization(행렬 분해) 방식이 대표적.

3Autoencoder : 학습 데이터에 레이블 데이터를 별도로 구축할 필요가 없는, 주어진 데이터만으로 학습이 가능한 비지도 학습 모델로, Encoder와 Decoder의 2개의 신경망으로 구성됨. Encoder는 입력 데이터에서 학습에 중요하다고 판단되는 정보만을 남기고 불필요하다고 판단되는 데이터는 제거함으로써 첫 입력 데이터보다 더 작은 크기의 데이터를 생성하는 역할을 하며, Decoder는 다시 처음의 입력 이미지로 복원하는 역할을 함. 이때, Encoder가 생성하는 더 작은 크기의 데이터를 Latent Vector(잠재 벡터)라고 칭함. 즉, Autoencoder가 학습하고 데이터를 생성하는 과정은 한 문장의 설명을 듣고 몽타주를 그리는 과정과 유사함.

4Generalization(일반화) : 모델이 특정 데이터에 과 적합(Overfitting) 되지 않고 다양한 데이터에 모두 적용 가능한 상태가 되는 것을 말함.

어떤 CF 모델을 선택할 것인가(1): 피드백(Feedback) 데이터

CF 모델은 유저, 아이템 상호작용 데이터를 활용한다고 언급하였는데요, 이 피드백 데이터의 종류에 따라서 모델의 선택이 달라질 수 있습니다.

카카오에는 다양한 서비스가 존재하는 만큼 다양한 형태의 피드백이 존재합니다. 예를 들어, 선물하기의 경우, “이 선물 좋아요”, 다음 영화 “평점”과 같이 유저의 콘텐츠에 대한 선호를 직접 수집할 수 있는 경우가 있습니다. 이러한 피드백은 Explicit Feedback(명시적 피드백)이라고 합니다. 유저의 선호를 유저가 직접 표현한 데이터이기 때문에 정확도가 높습니다. 그러나 이러한 피드백을 애써 남기는 유저는 많지 않습니다. 흔히 말하는 MovieLens(영화 평점) 데이터와 같은 유형의 데이터를 얻을 수 있는 서비스는 한정적입니다.

반면, 클릭, 콘텐츠 소비, 구매와 같은 행동 패턴은 유저도 모르는 사이에 자연스럽게 유저의 선호를 유추할 수 있게 합니다. 선물하기에서는 “클릭”, “구매”, 픽코마의 경우, “클릭”, “콘텐츠 소비”, “코인 사용”과 같은 피드백, 다음 뉴스의 경우에는 “클릭” 및 “체류 시간”에 관한 피드백을 수집하기도 합니다. 이러한 피드백의 경우, 유저가 이 콘텐츠에 대해 싫어하는지는 알 수가 없습니다(Unary Rating). 즉, 유저가 해당 콘텐츠를 여러 번 소비한 경우에는 선호가 높다고 가정할 수 있지만, 유저가 클릭하지 않은 아이템이 유저가 선호하지 않아서 소비하지 않은 것인지, 알고 보니 취향인데 소비하지 않은 것인지는 알 수 없습니다.

Implicit Feedback(암시적 피드백)의 이러한 특성을 잘 고려한 모델이 흔히 Alternating Least Squares(ALS)5라 불리는 모델입니다. 유저가 스스로 밝힌 취향 그 자체인 Explicit Feedback과 달리 Implicit Feedback은 유저가 해당 아이템을 소비하고 불만족하였을 수도 있고, 소비하지 않은 아이템을 꼭 싫어한다고 볼 수도 없기 때문에, 이러한 불확실성을 반영하기 위해 Confidence 개념을 도입했습니다. Implicit Feedback이 존재하는 경우는 “선호가 있다”라고 해석하고, 반대의 경우는 “선호가 없다”라고 해석합니다. 다만, 그러한 판단이 얼마나 확신할 수 있는지는 Implicit Feedback을 바탕으로 계산하게 됩니다. 아무래도 특정 아이템을 소비한 횟수가 많으면 많을수록, 실수로 소비했다거나, 소비 후 불만족했다고 보기 어렵겠죠. 또한, 한 번도 소비하지 않은 경우는 불확실성이 매우 높을 것이고요.

이처럼 ALS 모델은 단순히 관찰된 피드백뿐만 아니라 관찰되지 않은 제로 피드백의 경우에도 학습 과정에 반영 가능합니다. 이 과정에서 계산량이 많아지다 보니, alternating-least-squares optimization 방식을 사용하여 학습을 진행하기 때문에 위와 같은 이름이 붙게 되었습니다.

참고: Implicit Feedback의 특성을 고려하여 Confidence 개념을 도입한 ALS의 Cost 공식(2번 레퍼런스 참조)

5Alternating Least Squares(ALS) : 교대 최소 제곱법. 목적함수를 최적화하는 기법으로, 사용자와 아이템의 Latent Factor를 한 번씩 번갈아가며 학습시킴. 아이템의 행렬을 상수로 놓고 사용자 행렬을 학습시키고, 사용자 행렬을 상수로 놓고 아이템 행렬을 학습시키는 과정을 반복함으로써 최적의 Latent Factor를 학습시키는 방법.

어떤 CF 모델을 선택할 것인가(2): 메트릭(Metrics)

CF 모델을 어떤 기준으로 평가하느냐에 따라서도 모델의 선택이 달라질 수 있습니다. 우리가 추천 모델을 사용하게 되는 구좌의 맥락이 약간씩 다른데, 그때마다 우리가 최적화해야 하는 메트릭도 달라질 수 있습니다.

예를 들어, 광고 추천의 경우에는 광고를 클릭할 예상 확률(predicted click-through rate)이 광고 과금액 선정에 직접적인 영향을 미치기 때문에, 클릭할 확률을 정확하게 맞추는 게 중요합니다. 한편, Top N 개의 후보군을 추출하는 경우에는, 예측값 자체보다는 상위 추천 결과에 유저가 클릭할 만한 아이템이 얼마나 많이 추천되는지가 중요한 경우도 있습니다. 이러한 목적에 맞추어 최적화해야 하는 메트릭을 선택합니다.

하나의 모델을 학습할 때, 여러 가지 메트릭 중에서 어떤 메트릭은 개선이 되어도, 다른 메트릭에서는 개선이 일어나지 않는 경우도 종종 있습니다. 예를 들어, 예측값과 실제 클릭 여부(0, 1) 사이의 차이를 측정하는 지표인 Log Loss가 줄어들어도 랭킹은 그대로일 수 있고, 따라서 랭킹 메트릭은 개선이 되지 않을 수도 있습니다. 이처럼, 여러 메트릭을 측정하더라도, 현재 문제 상황에서 가장 중요한 개선 메트릭이 무엇인지를 파악하는 것이 매우 중요합니다.

예를 들어 보겠습니다. 예측값과 실제 클릭 여부의 차이를 측정하는 메트릭이 아닌, 클릭 확률로 줄을 세웠을 때, 클릭한 아이템이 클릭하지 않은 아이템보다 상위에 랭크될 확률을 계산한 AUC를 최적화하는 것이 중요한 태스크의 경우에는, Bayesian Personalized Ranking(BPR)6과 같이 AUC를 직접 최적화하는 모델을 사용하는 것이 적합할 수 있습니다.

많은 추천 모델들이 랭킹 문제를 풀고 있지만, 랭킹 자체를 최적화하기보다는, 아이템 한 개와 관련된 Pointwise Loss7의 최적화를 통해 랭킹 메트릭의 최적화 또한 기대합니다. 즉, 특정 아이템에 대해 예측한 값이 실제 값과 얼마나 다른지를 Loss로 정의하고, 그 Loss를 최소화하는 방식으로 작동합니다.

그러나 BPR의 경우, 단순히 아이템 한 개가 아니라, 선호하는 아이템과 선호하지 않는 아이템 페어8를 활용하여, 선호하는 아이템이 더 상위에 랭크되는지를 측정하는 메트릭인 AUC를 직접 최적화하는 학습 프레임워크를 제공합니다. 즉, 선호하는 아이템과 선호하지 않는 아이템의 예측값 사이의 차이를 최대한 벌리는 방식으로 작동합니다.

참고: BPR Maximization 함수(3번 레퍼런스 참고)

6Bayesian Personalized Ranking(BPR) : 아이템에 대한 사용자의 선호도를 확률 모형화한 모델로, 사용자가 선호하는 아이템을 단계별로 카테고리화(긍정적 아이템, 부정적 아이템) 해서 분석을 진행함. 아이템을 카테고리화할 때 사용자가 내재적 피드백을 제공했는지 안 했는지의 정보만을 이용하기 때문에 정보의 손실이 발생할 수 있지만, 기존의 기법 대비 우수한 성능을 보이는 모델.

7Point-wise: 손실 함수(Loss Function)에서 한 번에 하나의 아이템만을 고려하는 방법으로, 하나의 사용자에 대응하는 하나의 아이템만을 자기고 Score를 계산하고 이를 Label Score과 비교해서 최적화함. 아이템 간의 순서 관계를 무시하고 독립적인 개체로써 학습시키고 결과만을 정렬한다는 단점이 있으나, 그만큼 직관적인 모델이기도 함.

8Pair-wise: 손실 함수(Loss Function)에서 한 번에 2개의 아이템을 고려하는 방법. 1개의 긍정적 아이템과 1개의 부정적 아이템을 고려하기 때문에, 데이터 셋에 {사용자, 긍정적 아이템, 부정적 아이템}의 3가지 항목이 포함되어야 하고, 이로 인한 데이터 중복을 해결하기 위해 Sampling 기법이 활용됨.

어떤 CF 모델을 선택할 것인가(3): Bias & Feedback Loop

마지막으로 고려할 점은, 추천 시스템에서 학습에 활용하는 피드백 데이터는 본질적으로 실험 데이터가 아닌 관찰 데이터라는 점입니다. 즉, 통제된 환경이 아닌, 여러 가지 요인에 의해 데이터 수집에 영향을 받아 다양한 Bias가 끼어있는 데이터입니다. 대표적으로, 추천 시스템이 노출시키는 특정 아이템에만 노출이 된 아이템에 대한 유저의 피드백만을 관찰할 수 있습니다. 이와 같은 문제는 피드백 루프(Feeback Loop)로 더욱 강화됩니다. 즉, 추천 시스템이 추천한 결과를 다시 추천 시스템이 학습하여, 계속 모델 Bias가 강화되는 문제입니다.

이는 유저에게 더 큰 만족을 줄 수도 있는 아이템의 유입을 어렵게 하여, 장기적으로는 추천 시스템의 온라인 성능이 하락하는 문제로 이어질 수 있습니다. 동시에 Bias가 존재하는 데이터는 오프라인에서 신규 모델 개발에 있어 평가를 어렵게 합니다.

이러한 Bias가 존재하는 데이터 셋을 이용하여 평가가 이루어지면, 기존 모델에 더 유리하게 평가가 되기도 합니다. 특히, nDCG(normalized Discounted Cumulative Gain)9와 같은 메트릭의 경우, 이러한 Bias가 존재하는 데이터로 평가할 경우, 기존 추천 결과를 얼마나 모사하느냐를 평가하게 되기 때문에, 각별한 주의가 필요합니다.

이와 같은 Bias 및 피드백 루프 문제를 방지하는 가장 간단한 방법으로, 랜덤하게 추천된 데이터를 수집해 학습 및 평가에 활용하는 방법이 있지만, 랜덤 데이터 수집은 유저 경험에 상당한 악영향을 끼칠 수 있어 대규모로 수집하는 것은 어렵습니다. 그래서 Bias가 존재하는 데이터로도 최대한 공정한 평가를 하기 위한 Debiasing 방법들이 연구되고 있습니다. 평가뿐만 아니라, 모델 학습에 있어서도 Debiasing 방법론을 활용한 연구들이 진행되고 있습니다(7번 레퍼런스 참조).

9nDCG(normalized Discounted Cumulative Gain): 추천 시스템에서 랭킹 추천 분야에서 많이 쓰이는 평가 지표로, 특히 상위의 랭킹 리스트가 하위 랭킹 리스트보다 확연​​하게 중요한 도메인에서 유용한 평가 기준.

마치며

카카오에는 다양한 서비스가 존재하는 만큼, 다양한 문제도 존재합니다. 여러 가지 문제에 범용적으로 활용될 수 있는 솔루션을 개발할 수도 있고, 특수한 상황에 적합한 솔루션을 개발하는 것이 필요한 케이스도 있습니다.

이 글을 읽는 여러분과 함께, 단순히 정의된 문제를 푸는 것이 아니라, 문제를 찾고 문제를 정확히 정의하여, 문제에 적합한 모델, 메트릭, 데이터 수집 방법 등을 설계하여 문제를 해결하는 경험을 통해 함께 성장하는 경험을 할 수 있다면 좋을 것 같습니다.

참고

Charu C Aggarwal. 2016. Recommender Systems. Springer. Y. Hu, Y. Koren, and C. Volinsky. Collaborative filtering for implicit feedback datasets. In IEEE International Conference on Data Mining (ICDM 2008) S. Rendle, C. Freudenthaler, Z. Gantner, and L. Schmidt-Thieme. Bpr: Bayesian personalized ranking from implicit feedback. In UAI, 2009. P. Cremonesi, Y. Koren, and R. Turrin. Performance of recommender algorithms on top-n recommendation tasks. In RecSys 2010 Wei Chen, Tie-Yan Liu, Yanyan Lan, Zhi-Ming Ma, and Hang Li. 2009. Ranking Measures and Loss Functions in Learning to Rank. In NIPS. D. C. Liu, S. Rogers, R. Shiau, D. Kislyuk, K. C. Ma, Z. Zhong, J. Liu, and Y. Jing, “Related pins at pinterest: The evolution of a real-world recommender system,” in WWW Companion, 2017 Tobias Schnabel, Adith Swaminathan, Ashudeep Singh, Navin Chandak, and Thorsten Joachims. 2016. Recommendations as Treatments: Debiasing Learning and Evaluation. In International Conference on Machine Learning. Longqi Yang,Yin Cui, Yuan Xuan, Chenyang Wang, Serge Belongie, and Deborah Estrin. Unbiased Offline Recommender Evaluation for Missing-not-at-random Implicit Feedback. In RecSys 2018 Jiawei Chen, Hande Dong, Xiang Wang, Fuli Feng, Meng Wang, and Xiangnan He. 2020. Bias and Debias in Recommender System: A Survey and Future Directions. S. Li, J. Kawale, and Y. Fu. Deep collaborative filtering via marginalized denoising auto-encoder. In CIKM 2015. Xiangnan He, Lizi Liao, Hanwang Zhang, Liqiang Nie, Xia Hu, and Tat-Seng Chua. Neural collaborative filtering. In Proceedings of the 26th International Conference on World Wide Web 2017

함께 하면 좋은 글

3. 아이템 기반 최근집 이웃 협업 필터링

< 목차 >

용어정의 데이터 가공 및 변환 영화간 유사도 산출 최근접 이웃 협업 필터링을 이용한 개인화 영화 추천시스템 개발

1. 용어정의

피드백 후 작성예정입니다.

MovieLens 데이터셋은 데이터셋 자료실 에 있습니다.

데이터셋 자료실 전체코드는 https://github.com/pjh5672/Recommendation_System 에 올려두었습니다.

2. 데이터 가공 및 변환

협업 필터링 기반의 영화 추천을 위해서는 사용자가 영화 평점을 매긴 사용자ㅡ영화 평점 매트릭스 데이터셋이 필요하다. 이를 위해 MovieLens 데이터셋을 다운받아 pandas.DataFrame으로 로딩한다.

영화에 대한 정보인 movies.csv 파일은 9742개 영화에 대한 movieId, title, genres 등으로 구성되며, 영화 평점 정보인 ratings.csv 파일은 100836명의 사용자가 영화에 대해 평점을 준 것으로 userId, movieId, rating, timestamp 로 구성된다. 이때, 평점 범위는 0.5부터 5.0 사이이며, 0.5 단위로 평점이 부여된다.

import pandas as pd import numpy as np movies = pd.read_csv(‘./ml-latest-small/movies.csv’) ratings = pd.read_csv(‘./ml-latest-small/ratings.csv’) print(“movies shape : {}”.format(movies.shape)) print(“movies shape : {}”.format(ratings.shape)) display(movies.head(2)) display(ratings.head(2))

협업 필터링은 이 ratings.csv 세트와 같이 사용자와 아이템(영화) 간의 평점에 기반해 추천하는 시스템이므로, 먼저 로우(행) 레벨 형태의 원본 데이터셋을 아래의 형태와 같이 모든 사용자를 로우로, 모든 영화를 컬럼으로 재구성한다.

ratings = ratings[[‘userId’, ‘movieId’, ‘rating’]] ratings_matrix = ratings.pivot_table(‘rating’, index=’userId’, columns=’movieId’) ratings_matrix.head(3)

여기서, 알아보기 쉽게 위의 테이블에서 각 컬럼을 movieId가 아닌 movie title로 변경하고, NaN 값들을 0 으로 채운다.

# title 칼럼을 얻기 위해 movies와 조인 rating_movies = pd.merge(ratings, movies, on=’movieId’) # columns=’title’로 title 칼럼으로 피벗 수행 ratings_matrix = rating_movies.pivot_table(‘rating’, index=’userId’, columns=’title’) # NaN 값을 모두 0 으로 변환 ratings_matrix = ratings_matrix.fillna(0) ratings_matrix.head(3)

3. 영화간 유사도 산출

이제 변환된 사용자ㅡ영화 평점 매트릭스를 이용해 영화간의 평점 유사도를 계산할 수 있다.

ratings_matrix_T = ratings_matrix.transpose() ratings_matrix_T.head(3)

유사도는 코사인 유사도를 기반으로 하고 cosine_similarity() 를 이용해 측정하며 행 기준으로 서로 다른 행을 비교하여 유사도를 산출하기 때문에, 여기서는 영화가 행 기준이 되어야 하므로 매트릭스를 전치시킨다.

그리고 코사인 유사도를 계산해보면, 대각성분이 1.0 인 아래 매트릭스와 같이 나타난다.

from sklearn.metrics.pairwise import cosine_similarity item_sim = cosine_similarity(ratings_matrix_T, ratings_matrix_T) # cosine_similarity() 로 반환된 넘파이 행렬을 영화명을 매핑해 DataFrame으로 변환 item_sim_df = pd.DataFrame(data=item_sim, index=ratings_matrix.columns ,columns=ratings_matrix.columns) print(item_sim_df.shape) item_sim_df.head(3)

여기서 명작인 ‘인셉션(Inception)’ 가장 평점 유사도가 높은 영화를 5개 찾아보면 아래와 같이 나타난다.

‘다크나이트’가 가장 유사도가 높으며, 그 뒤를 이어 주로 스릴러와 액션이 가미된 영화들이 높은 유사도를 나타낸다.

이렇게 만들어진 아이템 기반 유사도 데이터는 사용자의 평점 정보를 모두 취합해 영화에 따라 유사한 다른 영화를 추천할 수 있게 해준다.

item_sim_df[“Inception (2010)”].sort_values(ascending=False)[1:6]

4. 최근접 이웃 협업 필터링을 이용한 개인화 영화 추천시스템 개발

위에서 계산한 아이템 기반 유사도 데이터는 개인적인 취향을 반영하지 않고 영화간의 평점 유사도만 가지고 추천한 것이다. 따라서, 위의 유사도 데이터를 가지고 개인에게 특화된(Personalized) 영화 추천 알고리즘을 아래와 같이 구현할 수 있다.

이는 특정한 개인이 아직 관람하지 않은 영화에 대해 아이템 유사도와 기존 관람한 영화의 평점데이터를 기반으로 해 새롭게 모든 영화의 예측 평점을 구한 후 높은 예측 평점을 가진 영화를 추천하는 방식이다.

아이템 기반 협업 필터링에서 개인화된 예측 평점은 다음 공식으로 구할 수 있다.

S_i,n 와 R_u,n에 나오는 N 값은 아이템의 최근접 이웃 범위 계수(item neighbor)를 의미하고, 특정 아이템과 유사도가 가장 높은 Top-N개의 다른 아이템을 추출하는 데 사용된다. 앞에서 생성된 영화 간의 유사도에 대한 DataFrame인 item_sim_df 와 사용자ㅡ평점 DataFrame 인 ratings_matrix 를 활용해 사용자별로 최적화된 평점 스코어를 예측하는 함수를 아래와 같이 만들어 새로운 예측 평점을 계산한다.

def predict_rating(ratings_arr, item_sim_arr ): ratings_pred = ratings_arr.dot(item_sim_arr)/ np.array([np.abs(item_sim_arr).sum(axis=1)]) return ratings_pred ratings_pred = predict_rating(ratings_matrix.values , item_sim_df.values) ratings_pred_matrix = pd.DataFrame(data=ratings_pred, index= ratings_matrix.index, columns = ratings_matrix.columns) ratings_pred_matrix.head(3)

이때 예측 평점이 사용자별 영화의 실제 평점과 영화의 코사인 유사도를 내적한 값이기 대문에 기존에 영화를 관람하지 않아 0에 해당했던 실제 영화 평점이 예측에서 값이 부여되는 경우가 많이 발생하므로, 예측 평점이 실제보다 다소 작을 수 있다.

예측 결과가 원래 실제 평점보다 얼마나 차이가 있는지 MSE(Mean Squared Error) 지표를 통해 확인할 수 있고, 9.89 정도 차이 남을 알 수 있다.

from sklearn.metrics import mean_squared_error # 사용자가 평점을 부여한 영화에 대해서만 예측 성능 평가 MSE 를 구함. def get_mse(pred, actual): # Ignore nonzero terms. pred = pred[actual.nonzero()].flatten() actual = actual[actual.nonzero()].flatten() return mean_squared_error(pred, actual) print(‘아이템 기반 모든 인접 이웃 MSE: ‘, get_mse(ratings_pred, ratings_matrix.values ))

MSE를 최소화 하는 방향으로 개선시키기 위해, 영화 전체에 대한 유사도를 계산하지 않고, 특정 영화와 가장 비슷한 유사도를 가지는 영화에 대해서만 유사도 벡터를 적용하여 MSE를 구하는 함수로 변경하면 아래와 같다.

이때 행, 열 별로 for 루프를 반복 수행하며 Top-N개의 유사도 벡터를 계산하기 때문에 수행시간이 꽤 오래 걸릴 수 있다.

def predict_rating_topsim(ratings_arr, item_sim_arr, n=20): # 사용자-아이템 평점 행렬 크기만큼 0으로 채운 예측 행렬 초기화 pred = np.zeros(ratings_arr.shape) # 사용자-아이템 평점 행렬의 열 크기만큼 Loop 수행. for col in range(ratings_arr.shape[1]): # 유사도 행렬에서 유사도가 큰 순으로 n개 데이터 행렬의 index 반환 top_n_items = [np.argsort(item_sim_arr[:, col])[:-n-1:-1]] # 개인화된 예측 평점을 계산 for row in range(ratings_arr.shape[0]): pred[row, col] = item_sim_arr[col, :][top_n_items].dot(ratings_arr[row, :][top_n_items].T) pred[row, col] /= np.sum(np.abs(item_sim_arr[col, :][top_n_items])) return pred ratings_pred = predict_rating_topsim(ratings_matrix.values , item_sim_df.values, n=20) print(‘아이템 기반 인접 TOP-20 이웃 MSE: ‘, get_mse(ratings_pred, ratings_matrix.values )) # 계산된 예측 평점 데이터는 DataFrame으로 재생성 ratings_pred_matrix = pd.DataFrame(data=ratings_pred, index= ratings_matrix.index, columns = ratings_matrix.columns)

이제 특정 사용자(userId=9)에 대해 영화를 추천해보면 다음과 같이 나열된다. 여기서 사용자가 이미 관람한 영화를 제외하고 추천을 해야하기 때문에 아래의 get_unseen_movies 함수를 통해서 사용자가 관람하지 않은 영화에 대해서만 추천을 수행하도록 한다.

user_rating_id = ratings_matrix.loc[9, :] user_rating_id[ user_rating_id > 0].sort_values(ascending=False)[:10]

def get_unseen_movies(ratings_matrix, userId): # userId로 입력받은 사용자의 모든 영화정보 추출하여 Series로 반환함. # 반환된 user_rating 은 영화명(title)을 index로 가지는 Series 객체임. user_rating = ratings_matrix.loc[userId,:] # user_rating이 0보다 크면 기존에 관람한 영화임. 대상 index를 추출하여 list 객체로 만듬 already_seen = user_rating[ user_rating > 0].index.tolist() # 모든 영화명을 list 객체로 만듬. movies_list = ratings_matrix.columns.tolist() # list comprehension으로 already_seen에 해당하는 movie는 movies_list에서 제외함. unseen_list = [ movie for movie in movies_list if movie not in already_seen] return unseen_list def recomm_movie_by_userid(pred_df, userId, unseen_list, top_n=10): # 예측 평점 DataFrame에서 사용자id index와 unseen_list로 들어온 영화명 컬럼을 추출하여 # 가장 예측 평점이 높은 순으로 정렬함. recomm_movies = pred_df.loc[userId, unseen_list].sort_values(ascending=False)[:top_n] return recomm_movies # 사용자가 관람하지 않는 영화명 추출 unseen_list = get_unseen_movies(ratings_matrix, 9) # 아이템 기반의 인접 이웃 협업 필터링으로 영화 추천 recomm_movies = recomm_movie_by_userid(ratings_pred_matrix, 9, unseen_list, top_n=10) # 평점 데이타를 DataFrame으로 생성. recomm_movies = pd.DataFrame(data=recomm_movies.values,index=recomm_movies.index,columns=[‘pred_score’]) recomm_movies

결과로 ‘슈렉’, ‘스파이더 맨’, ‘인디아나 존스-2편’, ‘매트릭스’ 등 다양하지만 높은 흥행성을 가진 작품이 추천되는 것을 알 수 있다.

728×90

반응형

협업 필터링 추천 시스템 (Collaborative filtering recommendation system)

협업필터링이란?

어떤 아이템에 대해서 비슷한 취향을 가진 사람들이 다른 아이템에 대해서도 비슷한 취향을 가지고 있을 것이라고 가정하고 추천을 하는 알고리즘

추천의 대상이 되는 사람과 취향이 비슷한 사람들(neighbor)을 찾아 이 사람들이 공통적으로 좋아하는 제품 또는 서비스를 추천 대상인에게 추천하는 것

협업 필터링의 원리

아래의 표는 영화(M1~M5)에 대한 5명의 사용자(U1~U5)의 평가에 대한 자료이다. 각 사용자는 영화를 본 후에 점수(5점 만점)로 영화를 평가한다. 만일 U1에게 협업 필터링 방법으로 영화를 추천한다면 다음과 같다.

1) 우선 U1과 비슷한 영화 취향을 가진 사용자를 찾는다. 각 사용자의 유사성(similarity)을 계산하면 된다. 맨 오른쪽 열에 U1과 다른 사용자의 상관계수가 표시되어 있다. U3와 U4가 U1과 가장 높은 상관관계를 보이므로 이 둘을 neighbor로 분류한다.

2) 다음으로 U1이 보지 않은 영화 중 U3와 U4가 좋은 평점을 준 영화를 찾는다. M4,M5에 대해 U3와 U4의 평점의 평균을 내어보니 각각 2와 5이다. 따라서 평점 평균이 높은 M5를 U1에게 추천 영화로 제시한다.

유사도 지표

CF에서 사용자 간의 유사도를 구할 때 사용하는 지표이다.

(1) 상관계수

상관계수는 협업필터링에서 좋은 성능을 내지 못한다.

(2) 코사인 유사도

(3) 타니모토 계수

데이터가 이진값일 경우 사용

타니모토 계수의 변형으로 자카드 계수(Jaccard coefficient)가 있음

기본 CF 알고리즘

가장 기본적인 CF 알고리즘은 neighbor를 전체 사용자로 한다. 즉, 현재 사용자와 취향이 비슷한 사용자 그룹을 따로 선정하지 않고 모든 사용자의 평점을 가지고 예측을 한다. 방법은 다음과 같다.

1) 모든 사용자 간의 평가의 유사도를 계산한다.

2) 현재 추천 대상과 다른 사용자의 유사도를 추출한다.

3) 현재 사용자가 평가하지 않은 모든 아이템에 대해 현재 사용자의 예상 평가값을 구한다. 예상 평가값은 다른 사용자의 해당 아이템에 대한 평가를 현재 사용자와 그 사용자간의 유사도로 가중 평균해서 구한다.

4) 아이템 중에서 예상 평가값이 가장 높은 N개의 아이템을 추천한다.

from sklearn . metrics . pairwise import cosine_similarity matrix_dummy = rating_matrix . copy ( ) . fillna ( 0 ) user_similarity = cosine_similarity ( matrix_dummy , matrix_dummy ) user_similarity = pd . DataFrame ( user_similarity , index = rating_matrix . index , columns = rating_matrix . index ) def CF_simple ( user_id , movie_id ) : if movie_id in rating_matrix : sim_scores = user_similarity [ user_id ] . copy ( ) movie_ratings = rating_matrix [ movie_id ] . copy ( ) none_rating_idx = movie_ratings [ movie_ratings . isnull ( ) ] . index movie_ratings = movie_ratings . dropna ( ) sim_scores = sim_scores . drop ( none_rating_idx ) mean_rating = np . dot ( sim_scores , movie_ratings ) / sim_scores . sum ( ) else : mean_rating = 3.0 return mean_rating

위의 방법으로 CF 추천을 한 결과 RMSE가 약 1.017로 계산되었다.

이웃을 고려한 CF

이웃을 전체 사용자로 하는 대신에 유사도가 높은 사람만 이웃으로 선정해서 추천을 한다.

고려해야 할 사항은 이웃을 정하는 기준이다. 첫 번째 방법은 KNN 방법이고, 두 번째 방법은 유사도의 기준을 정해놓고 이 기준을 충족시키는 사용자를 이웃으로 정하는 Thresholding 방법이다.

일반적으로 Thresholding이 KNN보다 정확하지만 정해진 기준을 넘는 사용자가 없어서 추천을 하지 못하는 경우가 발생할 수 있기 때문에 KNN이 무난하게 많이 쓰인다.

def cf_knn ( user_id , movie_id , neighbor_size = 0 ) : if movie_id in rating_matrix : sim_scores = user_similarity [ user_id ] . copy ( ) movie_ratings = rating_matrix [ movie_id ] . copy ( ) none_rating_idx = movie_ratings [ movie_ratings . isnull ( ) ] . index movie_ratings = movie_ratings . drop ( none_rating_idx ) sim_scores = sim_scores . drop ( none_rating_idx ) if neighbor_size == 0 : mean_rating = np . dot ( sim_scores , movie_ratings ) / sim_scores . sum ( ) else : if len ( sim_scores ) > 1 : neighbor_size = min ( neighbor_size , len ( sim_scores ) ) sim_scores = np . array ( sim_scores ) movie_ratings = np . array ( movie_ratings ) user_idx = np . argsort ( sim_scores ) sim_scores = sim_scores [ user_idx ] [ – neighbor_size : ] movie_ratings = movie_ratings [ user_idx ] [ – neighbor_size : ] mean_rating = np . dot ( sim_scores , movie_ratings ) / sim_scores . sum ( ) else : mean_rating = 3.0 else : mean_rating = 3.0 return mean_rating

위의 방법으로 CF 추천을 한 결과 RMSE가 약 1.011로 이전보다 개선되었다.

다음은 실제 추천을 받는 기능을 구현한 코드이다. 추천을 받을 사용자 ID, 추천 아이템 수, 이웃 크기를 파라미터로 넘겨주면 이 사용자를 위한 추천 영화 리스트를 리턴한다.

rating_matrix = ratings . pivot_table ( values = ‘rating’ , index = ‘user_id’ , columns = ‘movie_id’ ) from sklearn . metrics . pairwise import cosine_similarity matrix_dummy = rating_matrix . copy ( ) . fillna ( 0 ) user_similarity = cosine_similarity ( matrix_dummy , matrix_dummy ) user_similarity = pd . DataFrame ( user_similarity , index = rating_matrix . index , columns = rating_matrix . index ) def recom_movie ( user_id , n_items , neighbor_size = 30 ) : user_movie = rating_matrix . loc [ user_id ] . copy ( ) for movie in rating_matrix : if pd . notnull ( user_movie . loc [ movie ] ) : user_movie . loc [ movie ] = 0 else : user_movie . loc [ movie ] = cf_knn ( user_id , movie , neighbor_size ) movie_sort = user_movie . sort_values ( ascending = False ) [ : n_items ] recom_movies = movies . loc [ movie_sort . index ] recommendations = recom_movies [ ‘title’ ] return recommendations recom_movie ( user_id = 2 , n_items = 5 , neighbor_size = 30 )

최적의 이웃 크기 결정

아래 그림처럼 일반적으로 이웃 크기가 증가하면서 추천의 정확도는 증가하다가 어느 시점 이후로 감소한다. 즉, 추천의 정확도를 최대로 하는 최적의 이웃의 크기를 사용하면 된다.

더불어 이웃의 크기를 고를 때는 추천을 하려는 분야와 도메인에 맞게 적절하게 정해야 한다.

사용자의 평가경향을 고려한 CF

CF의 정확도를 더 개선시키는 방법은 사용자의 평가경향(user bias)를 고려하여 예측치를 조정하는 것이다. 사용자에 따라 평가를 전체적으로 높게 하는 사람이 있는 반면, 평가를 전체적으로 낮게 하는 사람이 있다.

다음은 사용자의 평가 경향을 고려하지 않고 예측한 평점이다.

a: 사용자, u: 이웃 사용자, n: 이웃 사용자의 수

p(a,i): 아이템 i에 대한 사용자 a의 예상 평점

w(a,u): 사용자 a와 u의 유사도

r(u,i): 아이템 i에 대한 사용자 u의 평점

사용자의 평가 경향을 고려하여 평점을 구하는 방법은 다음과 같다.

1) 각 사용자의 평점평균을 구한다.

2) 각 아이템의 평점을 각 사용자의 평균에서의 차이(평점-해당 사용자의 평점 평균)로 변환한다. 편의상 평점과 평균의 차이를 평점편차로 부르기로 한다.

3) 평점편차를 사용해서 해당 사용자의 해당 아이템의 편차 예측값을 구한다. 이 때, 해당 사용자의 이웃을 구하고 이들 이웃의 해당 아이템에 대한 평점편차와 유사도를 가중평균한다.

4) 이렇게 구한 편차 예측값은 평균에서의 차이를 의미하기 때문에 실제 예측값으로 변환하기 위해 현 사용자의 평균에 이 편차 예측값을 더해준다.

5) 예측값을 구할 수 없는 경우는 사용자의 평점평균으로 대체한다.

rating_mean = rating_matrix . mean ( axis = 1 ) rating_bias = ( rating_matrix . T – rating_mean ) . T def CF_knn_bias ( user_id , movie_id , neighbor_size = 0 ) : if movie_id in rating_bias : sim_scores = user_similarity [ user_id ] . copy ( ) movie_ratings = rating_bias [ movie_id ] . copy ( ) none_rating_idx = movie_ratings [ movie_ratings . isnull ( ) ] . index movie_ratings = movie_ratings . drop ( none_rating_idx ) sim_scores = sim_scores . drop ( none_rating_idx ) if neighbor_size == 0 : prediction = np . dot ( sim_scores , movie_ratings ) / sim_scores . sum ( ) prediction = prediction + rating_mean [ user_id ] else : if len ( sim_scores ) > 1 : neighbor_size = min ( neighbor_size , len ( sim_scores ) ) sim_scores = np . array ( sim_scores ) movie_ratings = np . array ( movie_ratings ) user_idx = np . argsort ( sim_scores ) sim_scores = sim_scores [ user_idx ] [ – neighbor_size : ] movie_ratings = movie_ratings [ user_idx ] [ – neighbor_size : ] prediction = np . dot ( sim_scores , movie_ratings ) / sim_scores . sum ( ) prediction = prediction + rating_mean [ user_id ] else : prediction = rating_mean [ user_id ] else : prediction = rating_mean [ user_id ] return prediction

위의 방법으로 CF 추천을 한 결과 RMSE가 약 0.9417로 이전보다 개선되었다.

CF 정확도 개선을 위한 신뢰도 가중 방법

공통 아이템이 많은 사용자와의 유사도에 공통 아이템이 적은 사용자와의 유사도보다 더 큰 가중치를 주는 방법이다.

예측값을 구하는 계산식을 수정하기보다 신뢰도가 일정 이상인 사용자만을 예측치 계산에 사용하는 것이 좋다. 즉, 신뢰도(공통으로 평가한 아이템의 수)가 기준값 이상인 사용자만 이웃 사용자로 활용하는 것이다.

비슷한 원리로 예측값을 계산하는 대상 아이템에 대해서도 평가한 사용자가 일정 수준 이상이 되는 아이템만 예측치를 계산하도록 하는 것도 가능하다.

rating_binary1 = np . array ( ( rating_matrix > 0 ) . astype ( float ) ) rating_binary2 = rating_binary1 . T counts = np . dot ( rating_binary1 , rating_binary2 ) counts = pd . DataFrame ( counts , index = rating_matrix . index , columns = rating_matrix . index ) . fillna ( 0 ) def CF_knn_bias_sig ( user_id , movie_id , neighbor_size = 0 ) : if movie_id in rating_bias : sim_scores = user_similarity [ user_id ] movie_ratings = rating_bias [ movie_id ] no_rating = movie_ratings . isnull ( ) common_counts = counts [ user_id ] low_significance = common_counts < SIG_LEVEL none_rating_idx = movie_ratings [ no_rating | low_significance ] . index movie_ratings = movie_ratings . drop ( none_rating_idx ) sim_scores = sim_scores . drop ( none_rating_idx ) if neighbor_size == 0 : prediction = np . dot ( sim_scores , movie_ratings ) / sim_scores . sum ( ) prediction = prediction + rating_mean [ user_id ] else : if len ( sim_scores ) > MIN_RATINGS : neighbor_size = min ( neighbor_size , len ( sim_scores ) ) sim_scores = np . array ( sim_scores ) movie_ratings = np . array ( movie_ratings ) user_idx = np . argsort ( sim_scores ) sim_scores = sim_scores [ user_idx ] [ – neighbor_size : ] movie_ratings = movie_ratings [ user_idx ] [ – neighbor_size : ] prediction = np . dot ( sim_scores , movie_ratings ) / sim_scores . sum ( ) prediction = prediction + rating_mean [ user_id ] else : prediction = rating_mean [ user_id ] else : prediction = rating_mean [ user_id ] return prediction SIG_LEVEL = 3 MIN_RATINGS = 2

위의 방법으로 CF 추천을 한 결과 RMSE가 약 0.9413로 이전보다 개선되었다.

사용자 기반 CF와 아이템 기반 CF

지금까지 설명한 CF 알고리즘은 사용자를 기준으로 비슷한 취향의 이웃을 선정하는 방식을 사용하였다. 이런 방식을 사용자 기반 CF(User-Based CF: UBCF)라고 부른다.

반대로 아이템을 기준으로 하는 아이템 기반 CF(Item-Based CF: IBCF)도 가능하다. 이 둘 차이는 유사도를 계산하는 기준이 사용자인가 아이템인가 하는 것이다.

UBCF는 취향이 비슷한 이웃 사용자를 알아내고, 이 그룹에 속한 사용자들이 공통적으로 좋게 평가한 아이템을 추천하는 방식이다.

IBCF는 반대로 사용자들의 평가 패턴을 바탕으로 아이템 간의 유사도를 계산하여 사용자의 특정 아이템에 대한 예측 평점을 계산하는 방식이다. 즉, 예측 대상 사용자가 평가한 아이템의 평점과, 다른 각 아이템과의 유사도를 가중해서 평균한 값을 그 아이템에 대한 예측값으로 사용한다.

다음은 IBCF를 구현한 코드이다.

from sklearn . metrics . pairwise import cosine_similarity rating_matrix_t = np . transpose ( rating_matrix ) matrix_dummy = rating_matrix_t . copy ( ) . fillna ( 0 ) item_similarity = cosine_similarity ( matrix_dummy , matrix_dummy ) item_similarity = pd . DataFrame ( item_similarity , index = rating_matrix_t . index , columns = rating_matrix_t . index ) def CF_IBCF ( user_id , movie_id ) : if movie_id in item_similarity : sim_scores = item_similarity [ movie_id ] user_rating = rating_matrix_t [ user_id ] non_rating_idx = user_rating [ user_rating . isnull ( ) ] . index user_rating = user_rating . dropna ( ) sim_scores = sim_scores . drop ( non_rating_idx ) mean_rating = np . dot ( sim_scores , user_rating ) / sim_scores . sum ( ) else : mean_rating = 3.0 return mean_rating

UBCF와 IBCF 장단점

UBCF의 장점은 각 사용자별로 맞춤형 추천을 하기 때문에 데이터가 풍부한 경우 정확한 추천이 가능하다.

IBCF의 장점은 정확도는 떨어지지만 사용자별로 따로따로 계산을 하지 않기 때문에 계산이 빠르다는 장점이 있다. 또한, UBCF는 정확할 때는 매우 정확하지만 터무니없는 추천을 하는 경우도 상당히 있는데 IBCF는 그럴 위험이 적다. 더불어 UBCF는 데이터가 조금 바뀔 때마다 업데이트를 해야 하지만 IBCF는 데이터가 조금 바뀌어도 추천 결과에는 영향이 크지 않기 때문에 업데이트를 자주 하지 않아도 된다.

정리하자면, 데이터 크기가 적고 각 사용자에 대한 충분한 정보(구매나 평가)가 있는 경우에는 UBCF, 데이터가 크거나 각 사용자에 대한 충분한 정보가 없는 경우에는 IBCF가 알맞다고 할 수 있다.

둘 중 어느 쪽이 정확한지는 분야마다 다르기 때문에 일률적으로 말하긴 어렵지만, 데이터가 충분하다면 UBCF가 IBCF보다 다소 정확하다고 알려져 있다. 대신, IBCF가 계산이 빠르기 때문에 아마존과 같은 대규모 데이터를 다뤄야 하는 상업용 사이트에서는 IBCF에 기반한 알고리즘이 사용된다.

추천 시스템의 성과 측정 지표

데이터를 train set, test set으로 나누어 정확도를 측정한다.

아래의 지표들은 예측값과 실제값의 차이가 적을수록, 즉 측정 지표가 작을수록 정확하다.

n: test set에 있는 사용자의 수

m: test set에 있는 아이템의 수

r(i,j): 사용자 i의 아이템 j에 대한 실제 평점

p(i,j): 사용자 i의 아이템 j에 대한 예상 평점

k: 정확도 계산에 포함된 총 아이템 수 (null이 아닌 평점의 개수)

MSE와 RMSE가 많이 사용된다.

위의 지표는 모두 사용자의 평점이 연속값인 경우에 사용한다.

데이터가 이진값인 경우에는 정밀도(precision)과 재현율(recall) 등을 사용한다. 정확도 (accuracy) = 올바르게 예측된 아이템의 수 / 전체 아이템의 수 정밀도 (precision) = 올바르게 예측된 아이템의 수 / 전체 추천된 아이템의 수 재현율 (recall) = 올바르게 추천된 아이템의 수 / 사용자가 실제 선택한 전체 아이템 수 정밀도와 재현율의 조화평균(F1 score) = 2x정밀도x재현율/(정밀도+재현율) 범위(coverage) = 추천이 가능한 사용자의 수(혹은 아이템 수) / 전체 사용자의 수(혹은 아이템 수)

정밀도와 재현율은 trade-off 관계이다.

범위는 정밀도와 trade-off 관계이다.

Accuracy = (TP+TN) / (TP+TN+FP+FN)

Precision = TP / (TP+FP)

TPR(True Positive Rate = Recall) = TP / (TP+FN)

FPR(False Positive Rate) = FP / (FP+TN)

추천시스템에서 TN은 매우 큰 숫자가 되는 것이 보통이다. 그렇기 때문에 아이템이 많은 경우에는 현실적으로 TN을 사용하지 않는 측정 지표인 TPR(재현율)와 정밀도를 사용한다.

(해당 포스팅은 ‘Python을 이용한 개인화 추천시스템’을 바탕으로 정리하였습니다.)

협업 필터링(Collaborative Filtering)

*크롬으로 보시는 걸 추천드립니다*

우리 일상생활에 녹아있는 “인공지능(AI)”에는 추천 시스템이 있다는 것을 소개해 드렸습니다

https://kmhana.tistory.com/30

이제 부터는 조금 더 알고리즘 측면에서, 추천이 이루어지고 있는지 차근차근 뜯어 보겠습니다

가장 추천 알고리즘의 기본은

1) 협업 필터링(Collaborative Filtering)

• Memory Based Approach

– User-based Filtering

– Item-based Filtering

• Model Based Approach

– 행렬 분해(Matrix Factorization)

2) 콘텐츠 필터링(Contents-Based Filtering)

가 있습니다.

이번 파트에서는 ” 협업 필터링(Collaborative Filtering) – Memory Based ” 부터 소개해 드리겠습니다!

(* 언제든지 부족한 부분 알려주시면 반영하겠습니다 ㅎㅎ 함께 공부해 나아가봐요)

협업 필터링 이란 ?

영화를 추천받고 싶을때 우리는 어떻게 할까요?

1. 내가 좋아하는 감독, 장르, 키워드의 영화를 찾아본다

2. 나랑 성향이 비슷한 친구들이 본 영화를 찾아본다

가 대표적인 방법일 것입니다.

이 것은

1. 내가 좋아하는 감독, 장르, 키워드의 영화를 찾아본다

▶ Content Based Filtering

2. 나랑 성향이 비슷한 친구들이 본 영화를 찾아본다

▶ 협업 필터링(Collaborative Filetering)

라고 할 수 있습니다!

○ 협업 필터링(Collaborative Filtering ) 특징

• 가정 : 나와 비슷한 취향의 사람들이 좋아하는 것은 나도 좋아할 가능성이 높다

→ 많은 사용자로 부터 얻은 취향 정보를 활용

• 핵심 포인트 : ” 많은 사용자들 “로 부터 얻은 취향 정보를 활용

– 사용자의 취향 정보 = 집단 지성

– 축적된 사용자들의 집단 지성을 기반으로 추천

– 예를 들어 : A 상품을 구매한 사용자가, 함께 구매한 다른 상품들

협업 필터링 종류

○ 협업 필터링(Collaborative Filtering) 대표 접근법

[https://towardsdatascience.com/various-implementations-of-collaborative-filtering-100385c6dfe0]

1) Memory-Based Approach

• 유사한 사용자(Users)나 아이템(Item)을 사용

– 특징 : 최적화 방법이나, 매개변수를 학습하지 않음. 단순한 산술 연산만 사용

– 방법 : Cosine Similarity나 Pearson Correlation을 사용함, ( * KNN 방법도 포함됨)

– 장점 : 1. 쉽게 만들 수 있음

2. 결과의 설명력이 좋음

3. 도메인에 의존적이지 않음

– 단점 : 1. 데이터가 축적 X or Sparse한 경우 성능이 낮음

2. 확장가능성이 낮음 ( ∵ 데이터가 너무 많아지면, 속도가 저하됨)

2) Model-Based Approach

• 기계학습을 통해 추천

– 특징 : 최적화 방법이나, 매개변수를 학습

– 방법 : 행렬분해(Matrix Factorization), SVD, 신경망

– 장점 : 1. Sparse한 데이터도 처리 가능

– 단점 : 1. 결과의 설명력이 낮음

Memory-Based Approach 협업 필터링

○ Memory-Based Approach의 대표 방법론

협력 필터링 대표 방법론 – [https://medium.com/@toprak.mhmt/collaborative-filtering-3ceb89080ade]

• 대표 방법론 1) User-based Filtering 2) Item-based Filtering

• User-based Filtering

– 특정 사용자(User)를 선택

– 예시 : SNS에서의 친구 추천 서비스

1. ” 평점 유사도 “를 기반으로 나와 유사한 사용자(Users)들을 찾음

2. 유사한 사용자가 좋아한 Item을 추천

→ 해석 : 당신과 비슷한 사용자 “ㄱ”은, “B”영화도 좋아했습니다

• Item-based Filtering

– 특정 아이템(Item)을 선택

– 예시 : 함께 구매한 경우가 많은 상품 – ‘사이다’와 ‘콜라’

1. 특정 Item을 좋아한 사용자들을 찾음

2. 그 사용자들이 공통적으로 좋아했던 다른 Item을 찾음

→ 해석 : 이 아이템을 좋아한 사용자는, “B”영화도 좋아했습니다

○ 유사도 측정 방법

• 두 방법 모두 유사도(거리)를 측정하여 사용함

• 거리 측정 방법은 다양함

– 사용자(행) – 아이템(열) 행렬을 사용함

• 일반적인 거리 측정 방법론

– Cosine Similarity

– Pearson Similarity

– Euclidean Distance

‘클라우디아’와의 거리 – [책 ‘알고리즘이 당신에게 이것을 추천합니다’]

• Cosine Similarity

$$ sim(u, u’) = cos(\theta) = \frac{R_{u} \cdot R_{u’}}{\left \| R_{u} \right \|\left \| R_{u’} \right \|} = \frac{\sum_{i=1}^{n}R_{ui}\times R_{u’i}}{\sqrt{\sum_{i=1}^{n}(R_{ui})^{2}} \times \sqrt{\sum_{i=1}^{n}(R_{u’i})^{2}}} $$

– 사용자 \(u\)와 사용자 \(u’\)가 같은 방향성을 보고 있지는를 평가함

– 일반적으로 사용되는 유사도

• Pearson Correlation Similarity

$$ sim(u, u’) = \frac{\sum_{i=1}^{n}(R_{ui} – \bar{R_{u}})( R_{u’i} -\bar{R_{u’}} ) }{\sqrt{\sum_{i=1}^{n}(R_{ui} – \bar{R_{u}})^{2}} \times \sqrt{\sum_{i=1}^{n}(R_{u’i} – \bar{R_{u’}})^{2}}} $$

– 평균적인 경향성에서 얼마나 차이가 나는지를 기반으로 함

– Centered Cosine Similarity 라고도 함

– 평균을 빼므로, 사용자 \(u\)와 사용자 \(u’\)가 함께 사용한 아이템이 꽤나 있어야 함

○ 유사도를 활용한 추천 Flow

• “유사도를 계산한 후 우리는 어떻게 아이템(Item)을 추천할 수 있을까?”에 대한 설명 드립니다

https://medium.com/@toprak.mhmt/collaborative-filtering-3ceb89080ade

– 위에 사이트를 참고했습니다

• User Based Fitering을 기준으로 설명 드립니다. Item Based와의 차이는 유사도(Similarity) 측정에서만 차이가 남

1) User-Item 행렬(Matrix)를 구축

User-Item 행렬 구축

– 목표 : 4번째 사용자(User)에게 영화를 추천해주기 위해서, 4번째 사용자가 아직 보지 않은 영화의 평점을 예측

2) User간의 유사도 계산

사용자 기반 유사도 측정

* 유사도 값에 대한 예시는 대략적인 값으로 정확하지 않습니다

3) 예상 아이템의 평점 추론

– ① 4번째 사용자가 보지 않은 영화들을 본 사용자의 평점을 추출

– ② 4번째 사용자와의 “유사도” 계산

– ③ 각 사용자 별 “유사도 x 평점” 계산

$$ sim(u,u’) \times R_{u’i} $$

– ④ 유사도가 반영된 “가중치 평점을 합산”

$$ \sum_{u’}sim(u,u’) \times R_{u’i} $$

– ⑤ 가중치를 나누어 “평균 평점”을 계산하여, 4번째 사용자의 보지 않은 영화의 평점을 추론

$$ \hat{R_{ui}} = \frac{\sum_{u’}sim(u,u’) \times R_{u’i}}{\sum_{u’}\left | sim(u,u’) \right | } $$

○ Memory-based Approach의 장단점

• 장점

– 최적화(Optimization)나 훈련(Train)이 필요 없음

– 쉬운 접근 방식

• 단점

– 희소(Sparse)데이터 경우 성능 저하 ( ∵ 비교 대상이 적으면, 성능저하)

– 확장성에 제한 ( ∵ 비교 대상이 많아지면, 계산량이 증가)

마치며

○ Part1 에서 다룬 추천 시스템

• 협업 필터링(Collaborative Filtiering)의 종류와 그 중 대표 접근법 Memory-Based 을 알아봤습니다

– 유사도 측정 방법

– User Based Filtering

– Item Based Filtering

앞으로 ” 협업 필터링 Part2 ” 에서는

○ Part2 에서 다룰 예정인 추천 시스템

• 협업 필터링(Collaborative Filtiering)의 대표 접근법 Model-Based 을 알아볼 예정입니다

– Matrix Factorization(행렬 분해)

– Neural Network(신경망)

• 협업 필터링(Collaborative Filtiering)의 한계

• 그 밖의 방법론 소개

다룰 예정입니다!

키워드에 대한 정보 아이템 기반 협업 필터링

다음은 Bing에서 아이템 기반 협업 필터링 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 추천 시스템 기본 – (콜라보레이티브 필터링, 컨텐트 베이스 필터링)

  • 추천 시스템
  • 머신러닝
  • 머신러닝 추천시스템
  • 콜드 스타트
  • 영화 추천
  • collaborative filtering
  • content based filtering

추천 #시스템 #기본 #- #(콜라보레이티브 #필터링, #컨텐트 #베이스 #필터링)


YouTube에서 아이템 기반 협업 필터링 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 추천 시스템 기본 – (콜라보레이티브 필터링, 컨텐트 베이스 필터링) | 아이템 기반 협업 필터링, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  용 신운 변화 | 모든 복은 용신운에 달려있다 10021 명이 이 답변을 좋아했습니다

Leave a Comment