추천시스템에 대한 자세한 이론이나 정보는 구글링해보면 다른 전문가 분들의 글에서 많이 찾아볼 수 있습니다.
저와 같은 초보자나 입문자 분들은 다른 분들의 글을 참고 하시는 걸 추천드립니다.
블로그를 꾸미고 활용하는 것도 매우 미흡하여 보기 불편한 것도 사과의 말씀을 전합니다(ㅠㅠ)
사실 본론으로 들어가기 전에 저의 이야기를 조금 해보자면 나의 발자취나 공부에 대해 Notion 을 통해 기록을 남기고 있지만 많은 선배분들이 보고 feedback 을 남겨주셨으면 해서 이렇게 공개적으로 글을 쓰기로 마음먹었습니다. 처음에는 개발자들의 커뮤니티(?),자료소 격인 github를 시작해 보았으나 , 익숙해지는 것이 꽤나 힘들었습니다..ㅠㅠ
github를 하면 보통 hexo를 이용해서 블로그 운영을 한다고 하여 hexo도 해봤습니다. 입문자인 저로서는 , 또한 java경험이 전무한 저는 html과 css를 활용하여 글을 작성해야 하는 hexo는 글 한개한개 쓰는것이 챌린지였습니다.
github에서 1일 1잔디심기라는 것을 알고 hexo에 그날의 공부와 느낀점들을 기록하려 했으나 hexo에 기록하는 것은 매우 고된 일이었습니다. 개발자직군에 있는 분들은 네이버블로그 보다는 티스토리를 많이 이용한다는 것을 알게 되어 이렇게 저의 발자취를 티스토리를 통해 남겨보려 합니다. 모든것이 부족하지만 데이터직군으로 업을 정한 이상 우직하게 나아가려 합니다. 그래서 URL도 'Keep Calm and Carry on' 에서 따와서 carryon을 하려했으나 다른분의 선점으로 carryonn으로 정하였습니다. 물론 저만의 의미부여입니다ㅋㅋ
머릿속에 있는 내용을 정리하고 사진을 추가해서 글로 표현하는 일이 이렇게 많은 노력이 들어가는 일인지 몰랐습니다....ㅠㅠ 그 동안 블로그를 쉽게 생각했던 저를 반성합니다. 이 티스토리는 저의 일기장과 같은 느낌으로 방향을 잡으려 합니다. 위에서도 말씀드렸다시피 자세한 이론을 원하시는 분들은 시간낭비 하지마시고 다른 좋은글들을 읽으시길 추천드립니다. 우리들의 시간은 소중하니까요ㅎㅎ
제가 이쪽으로 업을 정한 것도 저의 시간이 가치있게 쓰이길 원해서입니다. 저의 능력과 열정을 인정하고 발휘되고 미래를 그릴 수 있는 일을 하고 싶었습니다. 저의 선택이 틀리지 않았기를 바랍니다
여담은 이쯤에서 마무리하고 본론으로 들어가겠습니다
추천시스템에 관련된 글을 읽어보면 제가 이해하고 정리한 내용은 다음과 같습니다.
기본적으로 두개의 기법이 있습니다.
협업필터링(Collaborative Filtering , 이하 CF)
많은 사용자들로부터 얻은 기호 정보에 따라 사용자들의 관심사들을 자동적으로 예측하게 해주는 방법입니다
CF 기본 전제는 사람의 취향은 과거가 미래를 대변하고, 그 사람의 취향은 변하지 않는다 입니다
밑에 두가지 방식은 크게 다르지 않습니다. 먼저 두 방식을 설명하고 정리해서 말하겠습니다
1 . 사용자 기반추천( user-based recommendation)
- 나와 비슷한 성향을 지닌 사용자를 기반으로 , 그 사람이 구매한 상품을 추천하는 방식.
- 예를 들어 유저a가 오뚜기피자와 샐러드를 샀고, b는 오뚜기 피자와 빙그레 메로나를 샀다.
- 유저a와 유저b는 오뚜기피자 라는 동일한(유사한) item을 구매했으므로, 유저a와 유저b는 동일한(유사한) 취향을 가졌다
- 유저b가 구매한 item은 유저a도 좋아할 것이다
- 그러므로 a에게 b가 구매한 이력이 있는 빙그레 메로나를 추천해준다
2. 아이템기반 추천(item-based-recommendation)
- 내가 이전에 구매했던 아이템을 기반으로 , 이번에 구매할 상품과 같이 구매된 이력이 있는, 유사한 아이템을 추천
- 예를 들어 콜라는 사이다와 같이 구매되는 경우가 많다(유사도가 높다) , 그러므로 콜라를 구매한 고객에게는 사이다를 추천해준다
두 가지 중에는 item-based 필터링이 더 성능이 좋다고 합니다.
CF의 문제점
1. 콜드스타트(Cold-Start)
위의 두가지 기법은 사용자들의 구매데이터를 통해 이루어지기 때문에 구매이력이 없으면 새로운 유저의 취향을 알수 없으며, 아이템이 구매이력이 없으면 아이템간의 유사도를 구할 수 없으므로 새로운 아이템은 추천이 될 수 없습니다
2. 계산 효율저하
협업 필터링(CF) 는 비교적 계산량이 많은 알고리즘으로 데이터가 쌓일수록 계산이 오래걸립니다
하지만 , 사용자가 일정 수준 이상이 되야 괜찮은 성능을 보여주므로 딜레마가 있습니다
3. 롱테일(Long Tail)
사용자들이 관심을 많이 보이는 소수의 컨텐츠가 전체 추천 컨텐츠를 대표 하게 되는 (전체 추천 컨텐츠로 보이는) 비율이 높은 '비대칭적 쏠림 현상' 이 발생한다는 뜻입니다. 다시말해서, 아이템의 수가 아무리 많아도 사용자들은 소수의 인기있는 항목에만 관심을 보이게 되고 이 데이터가 계속 반복되면서 이 제품들만 계속 반복되고 됩니다. 그리하여 나머지 비주류 아이템들은 계속 구매도, 추천도 되지않으므로 소수의 인기있는 아이템만 계속 추천이 됩니다.
4. sparse 한 rating 데이터
유저X책 형식의 pivot-table로 전환해보겠습니다 모든 유저가 모든 책을 읽고 평가를 남길 수 없으니 많은 None값이 있을 수 밖에 없습니다. 연습용으로 하고 있는 movie 데이터로 예시를 보여드리겠습니다.
대부분이 none 값입니다. none 값을 대체하거나 정확도 개선을 위해 차원축소나 matrix factorzation , 잠재요인 필터링 으로 개선을 하는 것입니다.
두번째 기본적인 기법이 Content-based Filtering( 컨텐츠 기반 필터링)입니다.
Content-based Filtering (컨텐츠 기반 필터링)
그 컨텐츠의 각종 정보를 이용해서 filtering하는 것입니다.
영화 광해를 예시로 설명하겠습니다. 영화 광해는 2012년에 개봉했고, 분야는 드라마 , 한국영화이고 , 감독은 추창민 , 출연으로는 이병헌, 류승룡,한효주 님이 주연으로 연기하였습니다. 저 정보들을 이용해서 filtering 하는 것입니다.
이 영화 감독이 찍은 다른 영화를 추천해준다던지 , 이 영화에 출연한 배우들이 출연한 다른 영화를 추천해준다던지, 같은 장르인 한국 드라마 영화를 추천해주는 것입니다.
제가 진행하는 책에서 예시를 들어보겠습니다. 히가시노 게이고의 '나미야 잡화점의 기적' 을 예로 들어보겠습니다.
이 책의 카테고리는 일본소설이고 저자는 히가시노 게이고 입니다. 번역은 양윤옥씨 입니다. 같은 책이라도 번역하신분에 따라 느낌이 다를 수 있으니 번역가도 sub자료로 활용할 수 있습니다. 키워드로는 답장,영화원작,감동,편지 등이 있습니다. 추가로 쪽수나 출간일도 이용할 수 있습니다. 읽는데 오랜 시간이 걸리는 책보다는 가볍게 읽을 책들은 선호하는 사람도 있을 수 있습니다. 또 새로 출간된 , 요즘 인기있는 책들은 선호하는 사람이 있을 수도 있습니다. 이러한 데이터들로 filtering 하는 것입니다
1.알고리즘이 매우 직관적이고 쉽기는 하지만, 추천되는 아이템이 너무 뻔하다는 단점이 있습니다. 비슷한 아이템이 추천되면 비교 하기 용이해서 좋을 때도 있지만, 비슷한 아이템이 추천되면 지겹다고 느낄 수 있습니다. 특히 책, 영화,음악 과 같은 소재에서는 이러한 것이 더 심하다고 생각됩니다. 처음에는 비슷한 내용과 같은 작가의 책을 선호하지만 이게 중복될수록 다른 내용의 책을 읽고 싶을 것입니다. 그래서 heavy유저들을 위해서 다양성도 고려해야 합니다. 추천시스템에서는 coverage라는 용어를 사용합니다. 추천시스템 모델의 성능확인을 위한 지표로 정확도 뿐만 아니라 다양성 또한 지표로 사용한다는 뜻입니다.
2. 정확한(세분화된) 추천이 힘들다.
예를들어, 나는 일본소설 중 배경이 특이하게 '시골 ' 이면서 '바닷가'인 걸 좋아하는데 , 이거는 플랫폼 관리자가 그 책을 해쉬태그 할 때 '시골&바닷가' 라고 붙여주지 않으면 그 책의 특징이 될 수 없습니다. 왜냐면 일반적인 책 정보는 보통 ' 일본소설 , 추리소설 , 장편소설 , 추리 , 히가시노 게이고' 등으로만 분류합니다. 다시 말해서, 디테일한 내용을 바탕으로 추천을 할 수가 없습니다. 그래서 추천시스템은 그냥 '시골'이 배경인 일본소설을 추천해주게 됩니다.
다른 예를 들어보면, 나는 트와이스도 좋아하지만 특히 트와이스 멤버 중 '미나' 를 좋아합니다. 그래서 '미나' 뉴스 기사를 찾아봅니다 . 뉴스 추천시스템은 이러한 나의 행동기록(내가 읽은 뉴스기사들의 text 분석)을 바탕으로 다른 뉴스를 추천해줍니다. 하지만 트와이스 기사와 미나가 나오는 기사는 text가 크게 다르지 않습니다. 그러다 보면 트와이스 다른 멤버의 기사들을 추천해주는데 나는 관심이 없습니다.
그래서 넷플릭스의 경우 50명의 tagger(태그다는사람) 들이 일일이 내용에 대해 디테일한 태그를 달아서 세분화된 추천이 가능하게 한다고 합니다.
이 추천시스템은 오로지 사용자의 개인 선호도 문제이기 때문입니다. 저는 내부데이터가 아니라 크롤링데이터로 모델을 구현하고 있기 때문에 지표에 대한 계속 고민중입니다. 실제 서비스를 위한 알고리즘을 개발했다면 A/B 테스트를 통해 성능(유저들의 만족도, 전환율, 이용시간 증감)을 테스트 할 수 있지만 저는 오로지 숫자(컴퓨터가 계산해주는 정확도 같은..)를 보고 판단해야 해서 성능을 검증하기란 매우 힘듭니다.
이런 기본적인 기법 두개의 장단점을 생각해 만들어 진 것이 Hybrid System 입니다
저의 목표도 좋은 성능을 내는 Hybrid System 입니다.
다음에는 각각의 기법을 알고리즘을 이용해서 구현해보겠습니다
부족한 글 읽어주셔서 감사합니다. 많은 분들의 feedback 환영입니다.
'빅데이터 > 추천시스템' 카테고리의 다른 글
Item-based 를 들어가기전에 (np.corrcoef, .corr 연습)- 추천시스템(5) (0) | 2020.03.18 |
---|---|
Content-based-filtering(컨텐츠기반 필터링) - 추천시스템(4) (0) | 2020.03.11 |
데이터 전처리 - 추천시스템(3) (0) | 2020.03.06 |
데이터크롤링(crawling) - 추천시스템(1) (0) | 2020.03.04 |
추천시스템 구현 방향 (0) | 2020.03.04 |