아이템 기반 협업 필터링 | 파이썬 머신러닝 강의 13-5 – 아이템 기반 협업 필터링 활용 영화 추천 엔진 만들기 실습 최근 답변 161개

당신은 주제를 찾고 있습니까 “아이템 기반 협업 필터링 – 파이썬 머신러닝 강의 13-5 – 아이템 기반 협업 필터링 활용 영화 추천 엔진 만들기 실습“? 다음 카테고리의 웹사이트 https://ppa.dianhac.com.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.dianhac.com.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 K-ICT 빅데이터센터 이(가) 작성한 기사에는 조회수 1,867회 및 296395 Like 개의 좋아요가 있습니다.

Table of Contents

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

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

d여기에서 파이썬 머신러닝 강의 13-5 – 아이템 기반 협업 필터링 활용 영화 추천 엔진 만들기 실습 – 아이템 기반 협업 필터링 주제에 대한 세부정보를 참조하세요

아이템 기반 협업 필터링 활용 방법 및 협업 필터링 기법으로 영화 추천 엔진을 만들어보는 실습 강의입니다.
강의자료 다운받기 : https://kbig.kr/board/fileMngr?cmd=down\u0026boardId=movie_python\u0026bltnNo=11583391803590\u0026fileSeq=3\u0026subId=sub06
실습 데이터 다운받기 : https://kbig.kr/upload/%EC%8B%A4%EC%8A%B5%EB%8D%B0%EC%9D%B4%ED%84%B0_%ED%8C%8C%EC%9D%B4%EC%8D%AC%20%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D.zip
주요내용
– 영화 간 유사도 행렬 계산
– 평가 예측 및 모델 성능 측정
– 실습 1 : 협업 필터링 기반 영화 추천 엔진 만들기

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

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

그래서 item을 얼마나 좋아할 것인지 수치적으로 예측한다. 협업필터링의 2가지 유형. 최근접 이웃기반 필터링 (nearest neighbor collaborative …

+ 더 읽기

Source: pearlluck.tistory.com

Date Published: 5/20/2021

View: 5382

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

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

+ 여기에 자세히 보기

Source: abluesnake.tistory.com

Date Published: 6/16/2021

View: 1530

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

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

+ 여기에 표시

Source: ko.wikipedia.org

Date Published: 10/7/2022

View: 5222

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

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

+ 여기에 보기

Source: blog.bizspring.co.kr

Date Published: 8/13/2022

View: 7476

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

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

+ 여기를 클릭

Source: scvgoe.github.io

Date Published: 1/6/2021

View: 507

추천-2 이웃 기반 협업 필터링(Nearest Neighbor … – 분석뉴비

2. 아이템 기반 협업 필터링. 타깃 아이템 B에 대한 추천을 만들기 위해. B와 유사한 아이템 집합 S를 결정; 특정 사용자 A …

+ 여기에 표시

Source: data-newbie.tistory.com

Date Published: 12/20/2022

View: 6267

협업필터링 – 아이템 기반(IBCF) – 벌꿀오소리의 공부 일지

협업필터링 – 아이템 기반(IBCF) … (1) UBCF(User-Based Collaborative Filtering) … 사용자를 기반으로 하기 때문에 데이터 변화에 민감함.

+ 여기를 클릭

Source: yeong-jin-data-blog.tistory.com

Date Published: 8/1/2021

View: 4408

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

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

+ 여기에 더 보기

Source: tech.kakao.com

Date Published: 8/18/2021

View: 9418

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

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

+ 더 읽기

Source: velog.io

Date Published: 2/17/2021

View: 4222

추천 시스템 04. User-based Collaborative Filtering 유저 기반 …

그리고 설명의 편의를 위해, 우리가 최종적으로 추천 아이템 리스트를 제공하는 대상, 즉 ‘타겟 유저’는 ‘수달이’라고 가정하겠습니다. 유저 기반 협업 …

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

Source: ai-with-sudal-ee.tistory.com

Date Published: 10/28/2021

View: 734

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

주제와 관련된 더 많은 사진을 참조하십시오 파이썬 머신러닝 강의 13-5 – 아이템 기반 협업 필터링 활용 영화 추천 엔진 만들기 실습. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

파이썬 머신러닝 강의 13-5 - 아이템 기반 협업 필터링 활용 영화 추천 엔진 만들기 실습
파이썬 머신러닝 강의 13-5 – 아이템 기반 협업 필터링 활용 영화 추천 엔진 만들기 실습

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

  • Author: K-ICT 빅데이터센터
  • Views: 조회수 1,867회
  • Likes: 296395 Like
  • Date Published: 2020. 3. 9.
  • Video Url link: https://www.youtube.com/watch?v=RMfslt0DiOc

추천시스템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 반응형

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

지난 추천시스템 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점이 최고점인 것을 생각하면 나름 높은 점수를 줄 것으로 예상한 거죠.

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

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

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

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

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

협업 필터링(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)를 계산하여 고객의 선호도를 예측하는 방법이다. 즉, 예측하고자 하는 상품과 비슷한 상품들에 대하여 고객이 높은 평가를 하였다면 그 상품도 높게 평가를 할 것이라고 예측하고, 낮은 평가를 하였다면 그 상품도 낮게 평가를 할 것이라고 예측하는 것이다. 아이템 기반 협동적 필터링 방법은 상품들간의 유사도를 계산하기 위하여 두 상품에 모두 선호도를 입력한 고객들의 선호도를 사용한다. 그러나 고객들간의 유사도가 전혀 고려되지 않기 때문에 만약 특정 고객과 전혀 선호도가 비슷하지 않은 사용자들의 평가를 기반으로 한다면 상품들간의 상관 관계의 정확도가 떨어지고, 아울러 추천 시스템의 예측 능력과 추천 능력이 저하될 수 있다.

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

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

추천-2 이웃 기반 협업 필터링(Nearest Neighbor Collaborative Filtering)

728×90

2022.01.15 – [관심있는 주제/Recommendation] – 추천-1 시스템의 목표

2022.01.19 – [관심있는 주제/Recommendation] – 추천-2 이웃 기반 협업 필터링(Nearest Neighbor Collaborative Filtering)

목차

Recommeder Systems라는 책을 기반으로 작성되었습니다.

1. 개요

이웃 기반 협업 필터링 == 메모리 기반 알고리즘

협업 필터링의 초기 알고리즘

가정

비슷한 이용자들이 평점을 주는 방식에 비슷한 패턴을 보이고 비슷한 아이템에는 유사한 평점을 준다는 사실을 기반

2가지 유형

1. 사용자 기반 협업 필터링

타깃 유저 A의 추천 제공을 위해 유사한 유저들의 평점을 이용

예측된 A의 평점은 “피어 그룹”의 각 아이템의 평점에 대한 가중 평균으로 산정

2. 아이템 기반 협업 필터링

타깃 아이템 B에 대한 추천을 만들기 위해 B와 유사한 아이템 집합 S를 결정 특정 사용자 A의 아이템 B에 대한 평점을 예측하기 위해서 A에 대한 평점 집합 S의 평점이 결정되어야 함. 평점들의 가중 평균은 사용자 A의 아이템 B에 대한 평점을 예측할 때 계산됨.

2가지 유형의 주요 차이점

사용자 기반 협업 필터링 평점은 이웃 사용자의 평점을 활용해 예측 사용자들 간의 유사도(평점 행렬의 열)으로 결정

아이템 기반 협업 필터링 평점은 사용자가 평가한 평점 중 가장 비슷한 아이템에 대한 평점을 활용해 예측 아이템 간의 유사도(평점 행렬의 행)으로 결정

상반되기 떄문에 상호 보완적임

2가지의 계산 방식

1. 유저-아이템 조합의 평점 값 예측하기

사용자 u에 대한 아이템 j의 누락된 평점을 예측

2. TOP-K 아이템 혹은 TOP-K 사용자 결정하기

현실적인 컨텍스트 현실적인 컨텍스트에서는 판매자가 유저-아이템 조합의 특정 평점 값을 찾는 것이 아님 특정 사용자의 가장 관련된 TOP-K 아이템을 찾거나 특정 아이템의 가장 관련된 TOP-K 사용자를 아는 것이 더 중요 TOP-K 아이템을 결정하는 문제가 TOP-K 사용자를 찾는 문제보다 더 흔함. 전통적인 추천 알고리즘 TOP-K 사용자보다 TOP-K 아이템을 찾는 과정이 언급됨. TOP-K 사용자는 판매자에게는 유용한 정보 누구에게 홍보할 지 정할 수 있기 때문

두 문제는 매우 밀접 특정 사용자의 TOP-K 아이템을 결정하기 위해서는 그 사용자의 아이템에 대한 평점을 예측해야 함. TOP-K 아이템은 예측된 평점을 기반으로 선택

효율성 개선 이웃 기반 방법론은 예측에 필요한 일부 데이터를 OFFLINE으로 먼저 계산 먼저 계산된 데이터는 순위를 매길 때 더 효율적으로 활용

2장 공부 목적

다양한 이웃 기반 방법론 소개 클러스터링 그래프 기반 표현 협업 필터링 알고리즘에서 평점 행렬이 미치는 영향과 추천에서의 효과 효율성 측면의 평점 행렬의 영향도 공부 이웃 기반 방법론과 회귀 모델링 테크닉의 관계 회귀 방법론은 이웃 기반 방법론의 최적화 구조를 제공함.

이웃기반 방법론은 LEAST SQUARE REGRSSION MODEL을 경험적 근사값으로 구할 수 있다.

잠재 요인 모델과 같이 이웃 방법론과 다른 최적화 모델의 결합의 방향을 잡아준다고 함.

2. 평점 행렬의 주요 특징

평점 행렬은 $R$ 사용자 m 아이템 n m x n 행렬 $r_{uj}$ : 사용자 u의 j에 대한 평점

엔트리 속하면 학습 데이터 속하지 않으면 테스트 데이터 지정되지 않은 엔트리는 클래스의 변수나 종속 변수 → 추천 문제는 분류와 회귀 문제의 일반화

→ 추천 문제는 분류와 회귀 문제의 일반화

평정 방법

1. 연속 평점

연속형

-10 ~ 10 : jester joke 추천 엔진

단점 사용자가 실제 값의 무한한 가능성에 대한 부담 굉장히 드문 방식

2. 인터빌 기간 평점

5점 스케일 7점 스케일

가정 숫자 값은 명시적으로 평점 사이의 거리를 정의하고 평점값 사이의 거리는 같다.

3. 서수 평점

인터벌 기간 평점과 유사 선수형의 범주형 값이 사용된다는 것이 차이점

예 Disagree / Neutral / Agree

인터벌 기간 평점과 차이점 평점 쌍 간의 거리가 동일하지 않다고 가정 바이어스를 고려해서 부정과 긍정을 골고루 배치 중립에 대한 옵션 제거 강제 선택 방법

4. 이진 평점

긍정 혹은 부정 2개의 응답만 존재

특이 케이스 인터벌 기간 평점과 서수 평점의 특별 케이스

5. 단항 평점

긍정 선호도를 지정할 수 있게 하지만 부정 선호도를 지정하는 구조는 없음.

예 페이스북 좋아요

고객 행동에서 파생 아이템 구매 행동은 아이템에 대한 긍정적인 한 표로 생각 아이템을 구매하지 않는다고 해서 불호를 표현한 것은 아님

고객이 명시적으로 피드백 제공 x 고객 행동에서 단항 평점을 간접적으로 유도하는 것은 암시적 피드백 이라 함. 암시적으로 고객의 행동을 통해 유추됨

명시적으로 평가하는 것보다 온라인에서 아이템과 더 활발하게 활동할 수 있기 때문에 쉽게 얻을 수 있음. 묵시적 피드백의 설정(단항 평점)은 분류 및 회귀 모델링에서 양의 미분류(positive-unlabeld) 학습 문제의 행렬 완성으로 간주할 수 있기 때문에 본질적으로 다름

아이템 분포

일반적으로 롱테일(long-tail) 형태 아이템 중 극히 일부만이 자주 평가 인기 있는 아이템 평점이 크게 치우쳐있는 상태

추천 프로세스에 중요한 영향을 끼친다.

1. 이득 방향

많은 경우 잦은 빈도를 보이는 아이템은 판매자에게 이익이 거의 없는 치열한 아이템인 경향이 있음

낮은 빈도를 보이는 아이템은 이윤이 크게 남을 수 있음. 이런 경우 판매자는 적은 빈도의 아이템을 추천하는 것이 이득 아마존 사례 롱테일에 위치한 아이템을 팔면서 이윤을 많이 나김

2. 추천 방향

롱테일에서의 관찰된 평점은 매우 드문 예측이 어려움

많은 추천 알고리즘이 유명한 아이템을 제안하는 경우 많음 다양함에 부정적 영향을 줄 수 있음. 사용자를 지루하게 할 수 있음.

3. 롱테일로 인해서 모델에게 주는 부정적 영향

롱테일 분포는 사용자가 자주 평가한 아이템의 수가 적음을 의미

이웃한 아이템이 종종 자주 평가된 아이템을 기반으로 정의하므로, 이웃 기반 협업 필터링에 큰 영향을 끼침

자주 등장하는 상품과 적게 등장하는 상품은 평점 패턴에 본질적으로 다른 차이를 갖고 있기 때문에 많은 평점을 받은 상품이 적은 평점의 상품을 대변할 수 없음 협업 기반 필터링에 해결 못하는 부분

3. 이웃 기반 방법론의 평점 예측

기본 아이디어 평점 행렬을 통해 추천을 진행하기 위해 사용자-사용자 유사도를 이용하거나 아이템-아이템 유사도를 이요함.

이웃 개념 예측을 위해 유사한 사용자 혹은 유사한 상품을 군집

2가지 원칙

1. 이웃 기반 모델

유사한 사용자들은 같은 상품에 대해 비슷한 평점을 줌

두 사용자가 유사했을 때 서로 보지 못한 것들에 대해서는 비슷하게 평점을 줄 수 있다

2. 아이템 기반 모델

유사한 상품은 동일한 사용자에게 비슷한 방식으로 평점이 매겨진다.

한 사용자가 유사한 상품을 평가한 기록이 있다면, 새로운 유사한 상품도 비슷한 평점을 줄 것이다.

1. 사용자 기반 이웃 모델

사용자 기반 이웃은 평점 예측이 계산되는 타깃 유저와 유사한 사용자를 찾기 위해 정의됨.

타깃 유저 i의 이웃을 찾기 위해서는 다른 모든 사용자의 유사도가 계산됨.

따라서 사용자가 평가한 평점간의 유사도 함수가 되어야 함.

유사도 계산은 평점 스케일이 다를 수 있기 때문에 까다로운 작업이 될 수 있음.

평균 계산

$$ u와 v에서의 u의 평균 = \frac{u와 v의 공통된 집합의 u의 평점}{전체 u의 집합의 개수} $$

유사도 피어슨 상관계수(Pearson(u,v) 전통적 정의 u 와 v의 값은 사용자 u와 v 모두가 평점을 매긴 아이템에 대해서만 계산됨. 방법 하나의 평균 사용 2 사용자들의 개별적 평균 사용 방법에 따라 누가 낫다고 주장하기는 어려움

피어 그룹 정의 유사도(피어슨 계수)가 가장 높은 k 사용자 집합을 이용 서로 다른 사용자가 평점에 각기 다른 스케일 부여 그래서 피어 그룹의 (가중) 평균 평점을 결정하기 전에 행에 대해서 평균을 중심으로 재배열되어야 함. 사용자 u의 아이템 j에 대한 평균 중심 평점 $s_{uj}은 초기 평점 r_{uj} 에서 사용자의 평균 평점을 뺴는 것$ $s_{uj} = r_{uj}-\mu_{u} \\ u \in {1,,,m}$

수식 나중에 //

예시

유사도 함수 변형

Pearson 바이어스 조정 효과 있음

RawCosine

DiscountedSim 유사도는 공통 평점 점수에 종종 영향을 받음. 공통적으로 평점을 부여한 수가 적다면, 중요도를 덜 강조하기 위해서 할인 요인(discount factor)를 적용해 낮춤. 중요도 가중(significant weighting) 할인 요인(discount factor) 두 사용자 간의 공통으로 부여한 평점 개수가 특정 임계점 $\beta$보다 작은 경우 사용 $DiscountedSim(u,v)=Sim(u,v) \frac{min(공통 상품 개수, \beta)}{\beta}$

예측 함수 변형

다양한 변형 존재 raw한 평점 한 평점의 평균 대신 $s_{uj}$를 사용한 u의 관측된 평점에 대해서 표준편차로 나눠서 표준화한 평점 가중 평균이 곱해짐 수식(//) 문제점 예측 평점이 실제 평점 범위의 밖에 있을 수 있음. 항목의 선호도 순위를 매길 때 사용됨. 서로 다른 평점에 대한 가중치 계산의 어려움

피어 그룹 필터링의 변형

다양한 방법으로 피어 그룹 정의 가능함.

간단한 방법 타깃 사용자의 TOP-K 유사 사용자 그룹을 이용 문제점 오류 추가- 약하거나 음의 상관관계 사용자도 포함할 수 있음.

약하거나 음의 상관관계 유저 잠재적인 평점 반점의 관점에서 예측가치가 크지 않음 필터링 하는 경우가 많음.

롱테일의 영향

실제 컨텍스트에서의 평점 분포는 롱테일 분포 유명한 영화는 다른 사용자들에게 반복적으로 평점 이런 평점은 사용자 간의 차별성이 적기 때문에 추천 품질을 악화시킬 수 있음. 문서 검색 적용 사례에서 비정보적 단어(A ,AN, THE)에서 야기된 검색 품질 저하와 유사 역문서의 개념 사용하여 가중치 적용(항목 가중치) $w_j = log(\frac{m}{m_j})$ 아이텀 j에 대한 평점 개수 $m_j$ / m은 총 사용자

가중치를 사용하여 피어슨 수식 고려

2. 아이템 기반 이웃 모델

피어 그룹이 아이템으로 구성됨.

아이템 간의 유사도가 계산되어야 함.

AdjusctedCosine 사용 유사 정도의 값을 계산하기 전 평점이 평균 중심이기 때문에 조정된 코사인 유사도라고 함.

단계 조정된 코사인 유사도를 기반으로 아이템 t와 가장 유사한 TOP-K 아이템 결정 평점들의 가중 평균 값을 예측값 유사한 항목에 대한 사용자 자신의 평점을 활용 아이템 피어 그룹은 전형적으로 유사한 장르

예시

효율적 구현 및 계산 복잡성

타깃 사용자의 가장 적절한 추천 항목을 결정하는 데 사용

타깃 아이템에 대한 사용자 추천을 결정하는데 쓰임

기본 방법

많은 사용자-아이템 조합에 대한 예측 과정이 중간 계산 과정에서도 재사용된다. 이 중간 계산을 저장하고 순위 과정에 사용하기 위해 오프라인 단계를 사용하는 것이 좋다.

이웃 기반 방법론 단계 오프라인 단계 사용자-사용자(아이템-아이템_ 유사도 값 사용자(아이템)의 피어 그룹 계산 계산을 해서 사전에 저장 온라인 단계 오프라인에서 계산한 유사도 값과 피어 그룹을 활용해 예측 수행

대체로 아이템보다 사용자가 더 많으므로, 사용자 기반 방법론이 공간 요구 사항이 더 큼

사용자 기반 방법론과 아이템 기반 방법론의 비교

아이템 기반 방법론 사용자 자체 평점을 추천에 활용하기 때문에 더 관련성이 높은 추천 제공 순서 유사 아이템 인지 유사 아이템에 대한 사용자가 지정한 평점 활용하여 타깃 평점 예측 쉴링(shilling) 공격에 강함 사용자 방법론보다는 다양성이 떨어짐 참신성, 다양성, 우연성 면에서 떨어진다. 평점 변화에 안정적 사용자 기반 방법론은 몇 개의 아이템이 추가 되면, 유사도 값이 크게 바뀔 수 있음. 사용자 기반은 주기적으로 바뀌기 때문에 모델 관리 어려움

이웃 기반 방법론의 장점과 단점

장점

단숨함과 직관성으로 문제 풀기 쉬움

상대적으로 안정

점증적 근사 가능

온라인 단계에서는 항상 효율적

단점

대규모 환경에서 오프라인 단계가 때로는 비효율적 사용자 기반 방법 오프라인 단계는 $O(m^2)$ 공간 필요

희박함에 생긴 제한된 커버리지 누군가는 평가를 해줘야지 사용할 수 있음. 두 사용자가 공통적으로 평가한 아이템의 숫자가 적다면 견고한 유사도 값 얻기 어려움

사용자 기반과 아이템 기반 방법론의 통합된 관점

사용자 기반 단점 평점 행렬의 행(column)간의 유사도를 무시

아이템 기반 단점 평점 행렬의 열(row)간의 유사도를 무시

2개의 정보를 고려하는 방식 고려

4. 클러스터링과 이웃 기반 방법론

주요문제점 오프라인 단게에서의 복잡성

클러스터링 기반 방법론 주요 관점 오프라인에서의 가장 근접한 이웃 단계를 클러스터링 단게로 대체 오프라인에서의 가장 근접한 이웃을 찾는 단계는 많은 피어 그룹을 생성하며, 가능한 타깃들의 중심이 되는 것처럼 클러스터링 단계는 각각의 타깃이 중심이 될 필요도 없고 더 작은 피어 그룹을 생성한다. 기존 방식보다 더 효율적

차이점 클러스터 안에서의 TOP-K 의 가장 근접한 동료가 예측에 활용됨. 정확성이 다소 떨어질 수 있음.

허들 평점 행렬이 불완전함.

협업 필터링 사용자 기반 협업 필터링 열을 클러스터링 아이템 기반 협업 필터링 행을 클러스터링

5. 차원 축수와 이웃 기반 방법론

장점 이웃 기반 방법론의 품질과 효율성을 높이는 데 쓰일 수 있음. 차원 축소는 잠재 요인에 있어 저차원이 가능하도록 함. 잠재 요인 모델 평점을 매긴 아이템이 매우 적다 하더라도, 저차원 잠재 벡터에서는 그 거리가 계산 가능 피어 그룹을 결정하는 데 더욱 효율적

잠재 요인 모델이 추천 시스템에 쓰이는 2가지 방법 데이터의 축소된 형태는 잠재 요인의 행과 열 형태로 만들 수 있음. 아이템 차원에서나 사용자 아이템 차원에서 줄일 수 있음. 축소된 형태의 희소성 문제를 완화 잠재 요인에서 어떤 차원이 축소되냐에 따라서 축소 형태는 사용자 기반 이웃 알고리즘에 쓰이거나 아이템 기반 이웃 알고리즘에 쓰임 행 공간과 열 공간의 잠재 형태가 동시에 결정 잠재 형태는 이웃 기반 방법론을 쓰지 않은 채 평점 행렬의 전체를 한 번에 재고숭 3장

예시) 사용자 기반 협업 필터링 저차원에서의 유사도 계산은 모든 차원이 완전히 지정돼있기 때문에 값이 흔들리지가 않음. 첫 번째 단계는 누락된 엔트리를 채우기 위해 MXN 의 불완전한 평점 행렬 R을 증가시키기 누락된 엔트리는 행렬 내의 열의 평균 누락된 엔트리는 행렬 내의 행의 평균 아이템 쌍 끼리의 NXN 유사도 행렬을 계산 ($S = R_f^T R^T)$ SVD PCA

5.1 바이어스 문제 처리

유의할 점 헁렬 $R_f$ 은 불특정 항목을 행 또는 열을 따라 평균 값으로 작성해 불완전행렬 R 에서 파생된다는 점 → 바이어스 문제를 야기함

잘못된 대체를 하게 되면, 바이어스가 발생함. 대부분의 항목이 지정되지 않을 때 바이어스는 희소 행렬에서 굉장히 중요한 역할 따라서 지정되지 않은 항목 대신 평균 평점을 사용해 발생하는 바이어스를 줄이기 위한 방법을 설계해야 함. 최대 우도 추정 불완전한 데이터 직접 행렬 인수 분해

최대 우도 추정

공분산 행렬 추정하기 위해 EM(Expectation-Maximization) 알고리즘과 같은 확률적 기술의 사용 제안

특정 항목 쌍에 대한 평점을 지정한 사용자만의 정보만을 공분산 추정하는 데 사용

불완전한 데이터 직접 행렬 인수 분해

위의 방식으로 바이어스 어느 정도 보정할 수 있지만 평점의 희소성 수준이 높을 떄 완전히 효과적이지 않음. 행렬이 희박하면 공분산 추정치가 통계적으로 신뢰할 수가 없다.

행렬을 인수분해 하는 방법 사용 SVD 사용 문제점 평점 행렬이 완전히 지정되지 않는다는 것

6. 이웃 방법론의 회귀 모델링 관점

사용자 기반 아이템 기반에서의 발견 이웃 사용자의 동일한 항목에 대한 평점 또는 이웃 항목의 동일한 사용자의 평점의 선형함수로 평점을 예측

기존 사용자 기반 이웃 방법 유사한 취향을 가진 사용자에게 속하는 항목만을 사용한 후 유사도를 이용하여 가중치로 적용함. 휴리스틱적이고 임의적임 → 최적화 방법론을 적용해서 가중치를 학습하는 것이 더 좋은 방법일 수 있음.

1. 사용자 기반 최근접 이웃 회귀

1. 바이어스

문제점

크기가 동일한 사용자와 다양항 항목 인덱스에 대해 크게 다를 수 있음 평점 행렬이 내재된 특별한 수준의 희소성 때문에 발생함

회귀 계수가 다른 아이템의 평점 예측에 노이즈를 추가할 수 있으므로 과적합 발생할 수 있음.

해결 방안

예측 함수를 변경하고, 아이템 J에 대한 회귀가 사용장 U의 아이템 J에 대한 평점의 분수만 예측한다고 가정 회귀 계수가 대상 사용자의 모든 피어를 기반으로 하며 불완전한 정보를 분수로 보간하기

새로운 해결 방안에 대한 문제점

계산량이 많음.

아이템 공간이 빠르게 변경되는 설정에 적합하지만, 사용자는 시간이 지남에 따라 상대적으로 안정적 (뉴스 추천 시스팀)

2. 아이템 기반 근접 이웃 회귀

아이템-아이템 상관관계를 학습하고 활용함.

3. 사용자 기반 및 아이템 기반 방법 결합

유사한 아이템 뿐만 아니라 유사한 사용자의 관계를 기반으로 평점 예측

4. 유사도 가중치를 이용하여 조인트 보간법(Joint Interpolation)

기존과는 다른 방법

사용자 기반 모델을 사용해 대상 사용자 u의 각 평점을 예측2 동일한 아이템의 관촬된 값과 비교하는 대신 해당 사용자의 다른 아이템의 관촬된 평점과 비교

주목할 점

아이템-아이템 유사도는 예측된 평점이 유사한 아이템의 관찰된 평점과 더 유사하도록 강제하기 위해 객관적인 함수에서 항의 곱셉 인자로 사용 사용자-사용자 유사도는 표적 사용자 u의 피어 그룹으로 회귀 계수를 제한함으로써 평점을 예측하는 데 사용된다.

5. 희소 선형 모델(SLIM)

정규화 방법을 사용해 회귀 계수의 희소성을 장려하기 때문에 희소 선형 모델이라고 한다고 함. 음수가 아닌 평점 값일 때 작동한다.

특이점 평점 행렬이 평균 중심이라고 가정하지 않음. 평균 중심은 싫어하는 것에 대해서 음수 평점을 자동으로 갱신하기 때문에 긍정적인 기본 설정만 표현하는 암시적 피드백 행렬에 가장 적합 클릭 정보 데이터 판매 데이터 누락된 값은 0으로 표현

회귀를 구축하는 데 대상 아이템의 주변만 사용된다.

주요 목표 일부 정규화 항과 함께 프로베니우스 노름(Frobenius norm)을 최소화

함수 L1,L2를 결합한 elastic-net을 사용

일반 선형 회귀 모델과 차이점 존재 SLIM은 최대한 많은 0이 아닌 계수를 사용 가능 과적합을 피하기 위해 0으로 설정 SLIM은 명시적 평점이 아닌 암시적 피드백 데이터 세트를 위해 설계됨. 평점이 양수 설정에만 나타내는 임의값인 경우 사용 가능 비음수 행렬 분해 암시적 피드백에 유용 임의적 피드백에 유용하지 않음. SLIM은 계수가 음수가 아닌 계수로 제한됨 암시적 피드백에 맞춰진 알고리즘 직관적이며 결과 해석 사용 회귀 계수는 양수 또는 음수일 수 있다. SLIM은 평점에 대한 예측 모델도 제안하지만 예측 값의 최종 사용은 예측 값의 순서대로 아이템 순위를 매김 평점이 없는 데이터 세트에 사용 예측 값 해석 예측 값을 사용해 평점을 예측하는 대신 아이템의 순위를 지정하는 것이 합리적 각 값을 평점 행렬에서 0이 아닌 평점을 0으로 대체하는 오류 오차가 클수록 평점의 예측 값이 커지게 되서, 아이템은 예측 값의 순서로 정렬될 수 있음. SLIM은 추론 조정 계수와 함께 지정된 다양한 평점을 명시적으로 조정되지 않음.

7. 이웃 기반 방법에 대한 그래프 모델

평점의 희소성은 이웃 기반 방법의 유사도 계산에 큰 문제 일으킴

구조적 전이성 또는 순위 기술을 사용해 이웃 기반 방법론에서 유사도를 정의하기 위해 여러 그래프 모델이 사용됨.

그래프 네트워크 도메인의 많은 알고리즘 도구를 가능하게 하는 강력한 추상화 작업임

그래프 다양한 사용자 또는 아이템 간의 관계에 관한 구조적 표현 제공 그래프는 아이템 또는 사용자 둘 다 생성할 수 있음.

1. 사용자-아이템 그래프

지역을 정의할 때 피어슨 상관계수가 아닌 사용자-아이템 그래프에서 구조 측정값을 사용할 수 있다. 가장 자리의 구조적 전이성을 사용할 수 있기 때문에 희소 평점 행렬에 더 효과적

사용자-아이템 그래프는 사용자를 나타내는 노드 집합과 아이템을 나타내는 노드들 사이에서 무방향 및 이중 분할 그래프로 정의됨. 모서리 수는 효용 행렬에서 관찰된 아이템 수와 같음.

장점 두 사용자 간의 짧은 경로가 많은 만큼 존재하므로, 두 사용자가 동일한 항목 중 많은 부분을 이웃으로 간주할 필요가 없다 노드 간의 간접 연결이라는 개념으로 이웃을 구성할 수 있음. 간접 연결의 개념 경로 또는 걷기 기반 정의가 사용

방법 랜덤 워크 카츠 측도

링크 예측 문제와 연관됨.

2. 랜덤 워크를 이용한 이웃 정의

사용자 이웃 정의 해당 사용자부터 시작되는 랜덤 워크에서 발생하는 사용자 집합에 의해 정의

예상 빈도를 어떻게 측정? 랜덤 워크 방법론과 밀접한 연관

사용자 기반 협업 필터링 유사 사용자 k 개인화된 PageRank SimRank

이 접근 방식이 희소 행렬에 효과적인 이유 2명의 사용자가 의미 있게 정의되기 위해서는 공통 항목 집합에 직접 연결되야 한다. 희소 사용자-아이템 그래프에서는 많은 노드에 대해 직접 연결이 존재하지 않음. 랜덤 워크 방법론을 사용하여 한 노드에서 다른 노드로의 워크가 임의의 단계를 사용할 수 있기 때문에 간접 연결을 고려.

3. 카츠 척도를 이용한 이웃 정의

사용자 이웃 저으이 노드 쌍 간의 가중치 개수를 사용해 노드간의 선호도를 결정 한 쌍의 노드 사이의 보행 가중치 개수를 카츠 척도라고 한다. 가중치 수는 종종 링크 예측 측정 값으로 사용됨. 두 사용자가 걷기 기반 연결을 바탕으로 동일한 이웃에 속하는 경우 둘 사이의 링크가 형성되는 점을 알 수 있다.

카츠 척도 정의 노드 사이의 길이 수식 (//)

사용자-사용자 그래프

사용자 간의 2-홉 연결을 기반으로 사용자-사용자 그래프를 직접 만들 수 있음.

사용자-아이템 대비 사용자-사용자 그래프 장점 그래프의 가장 자리가 더 유익

2-홉 연결이 가장자리를 만드는 동안 두 사용자간의 공통 아이템의 수와 유사도를 직접 고려할 수 있음.

두 사용자 간의 상호 지정된 평점 개수를 정량화하기 위해 호팅이라는 개념 사용

예측 가능성 개념을 사용해 공통 평점 간의 유사도 수준을 정량화

1. 호팅

2. 예측 가능성

공부가 필요(//)

아이템-아이템 그래프

아이템-아이템 그래프 = 상관관계 그래프 $G=(N,A)$ N의 각 노드가 아이템 A의 각 가장자리는 아이템 간의 관계에 해당

ItemRank

2022.01.15 – [관심있는 주제/Recommendation] – 추천-1 시스템의 목표

2022.01.19 – [관심있는 주제/Recommendation] – 추천-2 이웃 기반 협업 필터링(Nearest Neighbor Collaborative Filtering)

728×90

협업필터링 – 아이템 기반(IBCF)

◈ 참고자료 출처

• “Python을 이용한 개인화 추천시스템”, 임일, 청람

◈ 개념

(1) UBCF(User-Based Collaborative Filtering)

• 사용자간 유사도 사용 → 사용자별로 개인화된 추천 리스트

• 사용자를 기반으로 하기 때문에 데이터 변화에 민감함.

• 계산량이 많음 (아이템 보다 사용자 수가 많기 때문에)

(2) IBCF(Item-Based Collaborative Filtering)

• 아이템간 유사도 사용 → 사용자가 선택한 아이템이 같으면 동일한 추천리스트

• Robustness가 높음 = Coverage가 높음 → 사용자가 아이템 하나만 평가하면 추천이 가능함

• 계산량이 적고 데이터 변화에 덜 민감함

• 상대적으로 대규모 상업용 시스템에 더 많이 사용됨

• 예상 평점이 return 되는 것이 아니기 때문에, test set에서 해당 사용자를 얼마나 잘 맞췄는지 precision, recall 등으로 평가한다.

◈ 실습 : UBCF와 transpose 형태

• 아이템간의 유사도를 이용해서 각 아이템을 평가한 유저들의 rating을 가중평균하면, 각 유저에 대한 아이템의 예상 평점 도출 가능

✅ 데이터 불러오기

import numpy as np import pandas as pd #데이터 불러오기 i_cols = [‘movie_id’, ‘title’, ‘release date’, ‘video release date’, ‘IMDB URL’, ‘unknown’, ‘Action’, ‘Adventure’, ‘Animation’, ‘Children\’s’, ‘Comedy’, ‘Crime’, ‘Documentary’, ‘Drama’, ‘Fantasy’, ‘Film-Noir’, ‘Horror’, ‘Musical’, ‘Mystery’, ‘Romance’, ‘Sci-Fi’, ‘Thriller’, ‘War’, ‘Western’] #영화 정보 데이터 movies = pd.read_csv(‘u.item’, sep=’|’, names=i_cols, encoding=’latin-1′) movies = movies[[‘movie_id’, ‘title’]] movies = movies.set_index(‘movie_id’) #사용자들의 평점 데이터 r_cols = [‘user_id’, ‘movie_id’, ‘rating’, ‘timestamp’] ratings = pd.read_csv(‘u.data’, names=r_cols, sep=’\t’,encoding=’latin-1′) ratings = ratings.drop(‘timestamp’, axis=1)

데이터를 불러오고 column 이름을 별도로 설정한다.

✅ pivot 테이블 생성

from sklearn.model_selection import train_test_split # Rating 데이터를 test, train로 분리 x = ratings.copy() y = ratings[‘user_id’] x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, stratify=y, random_state=12) #full matrix 생성 #UBCF와 다른 부분 : movie_id를 인덱스로 매트릭스 생성 rating_matrix_t = x_train.pivot(values=’rating’, index=’movie_id’, columns=’user_id’)

rating_matrix_t

train/test 데이터를 나누고, 아이템 기반으로 유사도를 구해야 하기 때문에 영화 이름을 인덱스로 full_matrix를 생성함 (IBCF와 transpose 형태)

✅ Item matrix 생성

# RMSE 계산 def RMSE(y_true, y_pred): return np.sqrt(np.mean((np.array(y_true) – np.array(y_pred))**2)) def score(model, neighbor_size=20): id_pairs = zip(x_test[‘user_id’], x_test[‘movie_id’]) y_pred = np.array([model(user, movie) for (user, movie) in id_pairs]) y_true = np.array(x_test[‘rating’]) return RMSE(y_true, y_pred) # 아이템 pair의 Cosine similarities 계산 from sklearn.metrics.pairwise import cosine_similarity 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)

item_similarity

IBCF에서는 아이템을 기준으로 유사도 행렬을 생성함 (1631 * 1631) 형태

✅ IBCF 함수

def ibcf(user_id, movie_id): import numpy as np if user_id in rating_matrix_t: # 사용자가 train set에 있는지 확인 if movie_id in item_similarity: # 현재 영화가 train set에 있는지 확인 # 현재 영화와 다른 영화의 similarity 값 가져오기 : column sim_scores = item_similarity[movie_id] # 현 사용자의 모든 rating 값 가져오기 user_rating = rating_matrix_t[user_id] : column # 사용자가 평가하지 않은 영화 index 가져오기 non_rating_idx = user_rating[user_rating.isnull()].index # 사용자가 평가하지 않은 영화 제거 user_rating = user_rating.dropna() # 사용자가 평가하지 않은 영화의 similarity 값 제거 sim_scores = sim_scores.drop(non_rating_idx) # 현 영화에 대한 사용자의 예상 rating 계산, 가중치는 현 영화와 사용자가 평가한 영화의 유사도 mean_rating = np.dot(sim_scores, user_rating) / sim_scores.sum() else: mean_rating = 3.0 else: mean_rating = 3.0 return mean_rating #성과 평가 score(ibcf)

유저 기반 추천과 행과 열이 반대인 형태로 진행함.

✅ IBCF + KNN

#KNN 을 활용한 iBCF def ibcf_knn(user_id, movie_id, neighbor_size=20): import numpy as np if user_id in rating_matrix_t: # 사용자가 train set에 있는지 확인 if movie_id in item_similarity: # 현재 영화가 train set에 있는지 확인 # 현재 영화와 다른 영화의 similarity 값 가져오기 sim_scores = item_similarity[movie_id] # 현 사용자의 모든 rating 값 가져오기 user_rating = rating_matrix_t[user_id] # 사용자가 평가하지 않은 영화 index 가져오기 non_rating_idx = user_rating[user_rating.isnull()].index # 사용자가 평가하지 않은 영화 제거 user_rating = user_rating.dropna() # 사용자가 평가하지 않은 영화의 similarity 값 제거 sim_scores = sim_scores.drop(non_rating_idx) #KNN # Neighbor size가 지정되지 않은 경우 if neighbor_size == 0: # 현재 영화를 평가한 모든 사용자의 가중평균값 구하기 mean_rating = np.dot(sim_scores, user_rating) / sim_scores.sum() # Neighbor size가 지정된 경우 else: # 지정된 neighbor size 값과 해당 영화를 평가한 총사용자 수 중 작은 것으로 결정 neighbor_size = min(neighbor_size, len(sim_scores)) # array로 바꾸기 (argsort를 사용하기 위함) sim_scores = np.array(sim_scores) user_rating = np.array(user_rating) # 유사도를 순서대로 정렬 user_idx = np.argsort(sim_scores) # 유사도를 neighbor size만큼 받기 sim_scores = sim_scores[user_idx][-neighbor_size:] # 영화 rating을 neighbor size만큼 받기 user_rating = user_rating[user_idx][-neighbor_size:] # 최종 예측값 계산 mean_rating = np.dot(sim_scores, user_rating) / sim_scores.sum() else: mean_rating = 3.0 else: mean_rating = 3.0 return mean_rating # 정확도 계산 score(ibcf_knn)

중간에 KNN을 사용하여 가까운 이웃들만 추천한다. min() 함수 사용하는 이유는 설정한 이웃 크기보다 평가한 영화 수가 적을 수도 있기 때문.

◈ 개선된 IBCF

• 실제 IBCF가 이루어지는 방식은 아래 그림과 같다

위는 한 사용자에 대한 추천 과정을 보여주는 것. 앞선 사례에서는 Train / Test로 평점을 사용해서 RMSE로 평가했다.

하지만 위 그림에서는 Train Set으로 학습하고 가장 선호도가 높게 나타난 Item 4, Item 1과 유사한 항목을 Test Set에서 계산해서 추천한다. (Item 9, Item 7)

따라서 이 방식으로 하면 RMSE 계산이 불가능하기 때문에 Precision, Recall 등을 사용해야 함

< 고려해야 할 사항들 >

① Reference

• 한 사용자가 좋게 평가한 아이템의 수를 몇개로 사용할 것인가?

ex) Item 1 과 Item 4를 둘 다 사용할 것인가? 하나만 사용할 것인가?

• 정확도를 평가할 때 올바르게 추천했다고 판단한 기준을 어떻게 정할 것인가? (정확도에 직접적인 영향 줌)

ex) Test Set에서 Item 7은 평점이 낮다. 이 아이템이 최종적으로 추천되었을 경우 올바르게 추천되었다고 볼 수 있을 것인가?

② 추천할 아이템의 수

• 추천하는 아이템 수가 많으면 → Recall 이 높아짐

• 추천하는 아이템 수가 적으면 → Precision이 높아짐

: F1 score로 판단하는게 적절

카카오 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

함께 하면 좋은 글

협업 필터링 추천 시스템 (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을 이용한 개인화 추천시스템’을 바탕으로 정리하였습니다.)

추천 시스템 04. User-based Collaborative Filtering 유저 기반 협업 필터링

안녕하세요, 수달이입니다. 벌써 추천 시스템에 관한 세 번째 포스팅이네요! (👏👏 )

가장 고전적인 방법인 인구통계학적 필터링부터 시작하여, 선형대수를 활용(벡터의 내적)하여 조금 더 개인화된 추천을 제공해주는 컨텐츠 기반 필터링까지. 점점 추천 방법들이 고도화되고 있다는 것이 느껴지시나요? 오늘부터는, 우리의 머신러닝 지식을 한 단계 더 높여줄, 다소 복잡할 수 있지만 실제 산업에서 널리 쓰이고 있는 협업 필터링 Collaborative Filtering에 대해서 공부해보겠습니다.

너와 나의 콜라보

협업 필터링의 핵심 아이디어는 “나와 취향이 비슷한 사람들의 의견을 참고한다”는 것입니다. 너와 나의 취향이 “콜라보(협업)”하여 새로운 추천을 제시하는 것이죠. 음악 추천을 예로 들자면, 플레이리스트에 수록된 곡들이 평소 나와 비슷했던 친구에게 추천받는 것이 훨씬 성공 확률이 높은 것과 같은 이치이죠.

이렇게 간단한 논리에 기반하고 있는 방법론이지만, 너무나 많은 사랑을 받은 탓인지 그 안에서도 다양한 세부 알고리즘이 연구되었습니다. 앞으로 네 개의 포스팅에 나누어서 각 세부 접근법을 소개드릴 텐데요. 그 첫 번째로, 이번 글에서는 유저 기반 협업 필터링 User-based Collaborative Filtering에 대해 이야기해보도록 하겠습니다. 그리고 설명의 편의를 위해, 우리가 최종적으로 추천 아이템 리스트를 제공하는 대상, 즉 ‘타겟 유저’는 ‘수달이’라고 가정하겠습니다.

유저 기반 협업 필터링 (User-based Collaborative Filtering)

이름에서 알 수 있듯, 이 알고리즘의 주인공은 ‘유저’입니다. 그리고 우리는 이 ‘유저’를 단순히 이름으로 표현하는 대신, n차원의 벡터로 표현하여 더 많은 정보를 함축하도록 만들어줄 겁니다. 지난번 컨텐츠 기반 필터링에서는 아이템의 feature를 활용하여 유저를 n차원의 벡터로 표현했었는데요. (아직 안 읽으신 분들을 위해, 여기서 feature는 아이템에 대한 정보를 의미합니다. 영화를 예로 들면, 장르/감독/국가 등을 영화의 feature라고 할 수 있습니다. 😊) 이번에는 유저가 아이템에 대해 남긴 평점(또는 아이템 구매 기록)으로 벡터를 구성해보겠습니다. 아래 그림의 수달이 벡터처럼요.

STEP 1. 비슷한 유저 찾기

다음 단계는 수달이와 비슷한 유저들을 찾는 것입니다. 아이템 구매 기록을 활용하여 수달이를 n차원의 벡터로 표현했듯이, 타 유저들도 동일한 방식으로 표현해줍니다. 그러면 지난 시간에 공부했던 것처럼 벡터의 내적을 활용하여 어떤 유저가 수달이와 비슷한지 파악할 수 있습니다. 사실, 유사성(similarity)을 파악하는 방법에는 벡터의 내적 말고도 여러 방법이 있는데요. 특히, 유저 기반 협업 필터링의 경우에는 피어슨 상관계수(Pearson Correlation Coefficient)가 자주 활용된다고 합니다.

상관계수를 직접 손으로 계산할 일은 거의 없기 때문에, 복잡한 계산은 기계에게 맡기고, 우리는 공식 대신 그래프와 함께 상관계수가 의미하는 바를 이해해보도록 하겠습니다. 우선, 세 명의 유저가 각 영화에 대해 아래의 테이블과 같이 평점(5점 만점)을 주었다고 가정합니다.

평점 테이블을 보면 우리는 수달이와 보노보노는 취향이 비슷하고, 수달이와 해달이는 좀 다른 편이라는 것을 느낌적으로 알 수 있습니다. 이제 이 느낌적인 느낌을 평점 그래프로 정확하게 파악해볼까요?

우선 왼쪽의 수달이-보노보노 커플의 그래프를 보면, 점들 사이로 우상향 하는 직선을 그릴 수 있습니다. 오른쪽의 수달이-해달이 커플의 그래프는 우하향 하는 선을 그을 수 있겠네요. 우상향 하는 직선은 양(+)의 상관계수, 우하향 하는 직선은 음(-)의 상관계수에 해당합니다. 여기서 주의할 것은, 직선의 기울기와 상관계수를 동일시하면 안 된다는 점입니다. 예를 들어, 직선의 기울기가 같아도 아래의 그림처럼 상관계수가 다를 수 있습니다.

출처: Laerd Statistics

즉, 상관계수가 양수인지 음수인지는 직선의 기울기로 파악할 수 있지만, 상관계수의 절댓값은 직선의 기울기가 아니라 직선을 중심으로 점들이 얼마나 밀집 또는 분산되어 있는지를 파악해야 합니다. 직선을 중심으로 점이 밀집되어있을수록 서로 관계가 끈끈한 것이고 (위 그림의 왼쪽) 이는 높은 상관계수로 나타나는 것이죠.

자, 그럼 비슷한 유저를 찾는데 상관계수를 활용해볼까요? 앞의 예제에서 보았듯이, 취향이 비슷한 수달이-보노보노는 양의 상관계수를 가지고 있고, 취향이 다른 수달이-해달이 커플은 음의 상관계수를 가지고 있습니다. 유추하자면, 비슷한 유저일수록 상관계수가 높게 나타나고, 따라서 상관계수에 대한 내림차순으로 줄을 세우면 타겟 유저와 가장 비슷한 k명의 유저를 찾아낼 수 있습니다.

STEP 2. 타겟 유저의 평점 예측하기

이제 수달이와 비슷한 유저를 찾았으니, 그들을 활용해보도록 하겠습니다. 수달이와 가장 비슷한 세 명의 유저인 A, B, C가 영화 ‘비긴 어게인’, ‘킹스맨’, ‘반지의 제왕’에 아래의 왼쪽 테이블처럼 평점을 주었다고 가정해봅시다. 이 영화들은 수달이가 아직 보지 않은 영화인데, A, B, C가 남긴 평점으로 수달이의 예상해볼 수 있을까요? 우리가 가장 쉽게 써먹을 수 있는 방법은 이들 평점의 평균을 내는 것일 겁니다.

조금 더 섬세하게 예측을 하고 싶다면, 수달이와 A, B, C가 각각 얼마나 비슷한지를 (ex. 피어슨 상관계수) 가중치로 활용하여 가중평균을 계산할 수도 있습니다. 이렇게 평균 또는 가중평균을 활용하면 수달이가 보지 않은 모든 영화에 대해 수달이의 예상 평점을 채워 넣을 수 있습니다.

STEP 3. 예상 평점이 높은 아이템 추천하기

예상하셨겠지만, 마지막 단계는 간단합니다. 2단계에서 구해 놓은 예상 평점을 내림차순으로 줄을 세워 상위권에 랭크된 영화들을 수달이에게 추천 아이템으로 제시합니다.

장점 그리고 단점

이름만 들으면 무시무시해 보였는데, 생각보다 간단하지 않나요? 그렇습니다. 유저 기반 협업 필터링의 장점은 구현하기 쉽다는 겁니다. 그리고 산업에 대한 전문적 지식이 필요했던 컨텐츠 기반 필터링에 비해, 유저 기반 협업 필터링은 산업에 대한 깊은 이해가 없어도 구매 기록 또는 평점 기록만 있다면 손쉽게 적용할 수 있습니다. 어떤 산업인지 크게 구애받지 않는 셈이죠.

하지만 분명히 한계도 존재합니다. 우선, 대부분의 사람들은 리뷰를 잘 남기지 않습니다. 즉, 유저 기반 협업 필터링에 필요한 인풋인 평점 데이터는 굉장히 희소합니다. 평점 데이터 대신 구매 기록을 사용할 수 있지만, 엄밀히 말하자면 구매 기록이 유저의 선호도를 직접적으로 반영하지 않기 때문에 차선책일 뿐입니다.

또한 확장성면에서도 한계가 있습니다. 타겟 유저와 비슷한 유저를 더 많이 찾으면 찾을수록, 우리의 추천 결과는 더욱 정교해지겠지만 그만큼 계산비용이 많이 들게 됩니다. 특히, 아마존과 넷플릭스 같은 거대한 공룡 업체는 수백만명의 고객들을 보유하고 있는데, 한 명의 타겟 유저를 위해서 수백 번의 상관계수 연산을 한다는 것은 굉장히 비효율적일 수 있습니다.

마지막으로, ‘콜드 스타트 cold start’라는 유명한(?) 문제점이 있습니다. 콜드 스타트란, 어떤 대상에 대해 아무런 정보도 주어지지 않은 상황에서 추천 결과를 제공해야 되는 경우를 의미하는데요. 구체적으로 예를 들자면 신규 가입자가 생긴 상황이 이에 해당합니다. 이 유저는 이제 막 가입했기 때문에, 우리는 이 분에 대해 아무런 평점 또는 구매 기록을 가지고 있지 않습니다. 결과적으로, 앞서 설명한 방식으로 유저를 n차원의 벡터로 표현할 수가 없고 따라서 비슷한 유저도 찾을 수 없습니다. 뿐만 아니라, 새로운 아이템이 생긴 경우에도 콜드 스타트 문제를 겪게 됩니다. 아이템에 대한 타 유저의 평가 결과가 있어야 그 데이터를 활용하여 타겟 유저의 평점을 예측할 수 있는데, 그 정보가 전혀 존재하지 않으니 추천 결과에 포함될 수가 없습니다. 새로운 아이템임에도 불구하고 고객에게 노출되지 못하는 것이죠.

다음 포스팅: 초기 아마존의 성공 비결? 아이템 기반 협업 필터링

오늘 살펴본 유저 기반 협업 필터링과 떼놓을 수 없는 관계에 있는 알고리즘이 있습니다. 바로 아이템 기반 협업 필터링인데요. 유저 기반 협업 필터링에서 우리가 유저를 n개의 아이템으로 구성된 벡터로 치환했다면, 아이템 기반 협업 필터링은 아이템을 n명의 유저로 구성된 벡터로 표현합니다. 이 알고리즘은 특히 아마존이 사업 초기에 사용하여 톡톡한 효과를 본 알고리즘이기도 합니다. 아마존이 실제로 쓴 알고리즘이라니, 더 궁금해지시지 않나요? 그럼 그 궁금증을 고대로 가지고! 다음 포스팅에서 뵙도록 하겠습니다.

Happy Machine Learning! ت

유저 기반 협업 필터링 User-based Collaborative Filtering

1/ 유저를 n개의 아이템으로 구성된 벡터로 표현

2/ 피어슨 상관계수를 활용하여 타겟 유저와 가장 유사한 k명의 유저를 파악

3/ k명의 유저가 각 아이템에 준 평점을 평균하여 타겟 유저의 평점을 예측하고, 예측 평점이 높은 순으로 추천

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

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

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

사람들이 주제에 대해 자주 검색하는 키워드 파이썬 머신러닝 강의 13-5 – 아이템 기반 협업 필터링 활용 영화 추천 엔진 만들기 실습

  • 빅데이터
  • NIA
  • AI
  • 인공지능
  • 한국정보화진흥원
  • 머신러닝
  • K-ICT빅데이터센터
  • 파이썬
  • python
  • 추천시스템
  • 협업필터링

파이썬 #머신러닝 #강의 #13-5 #- #아이템 #기반 #협업 #필터링 #활용 #영화 #추천 #엔진 #만들기 #실습


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

주제에 대한 기사를 시청해 주셔서 감사합니다 파이썬 머신러닝 강의 13-5 – 아이템 기반 협업 필터링 활용 영화 추천 엔진 만들기 실습 | 아이템 기반 협업 필터링, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  다중 선형 회귀 | 빅분기 필기 다중 선형 회귀분석 Multiple Linear Regression [빅공남! 통계 같이 공부해요] 23971 좋은 평가 이 답변

Leave a Comment