ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algorithms] 협업필터링(Collaborative Filtering)
    Data Analysis/Algorithms 2021. 10. 24. 19:24

    Table of Contents

    1. Introduction
    2. 협업필터링(Collarborative Filtering)이란?
    3. 협업필터링의 한계
    4. 기억 기반 협업필터링(Memory based Collaborative Filtering) in R
    5. 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 = predicted@items[[1]]
    predicted@itemLabels[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"

    댓글

Designed by Tistory.