[Recommendation system]Recommendation system이란?
ML 기반 추천 엔진: 추천 엔진이란?
추천 엔진 정의: 추천 엔진은 무엇인가?
- 사용자와 아이템
- 사용자: 서비스를 사용하는 사람
- 아이템: 서비스에서 판매하는 물품
- 다른 사용자가 물품이 될 수도 있음
- 보통 서비스가 성장하면 사용자/아이템의 수도 같이 성장함
- 특히 사용자의 성장도가 훨씬 커짐
- 아이템의 수가 커지면서 디스커버리 문제 -> 모든 사용자가 능동적으로 검색하지 않으며 수동적으로 추천을 받으려고 함.
- 추천 엔진의 정의
- 트위터의 알파 제인의 정의: 사용자가 관심있어 할만한 아이템을 제공해주는 자동화된 시스템(관심, 자동화가 중요!)
- 야후의 디팍 아그리왈의 정의: 비즈니스 장기적인 목표를 개선하기 위해 사용자에게 알맞은 아이템을 자동으로 보여주는 시스템(장기적인 목표, 즉 매출액과 자동화가 중요!)
- 왜 추천 엔진이 필요한가?
- 조금의 노력으로 사용자가 관심있어 할만한 아이템을 찾아준다. 특히 아이템의 수가 큰 경우 노가다를 해결해주므로 더 의미가 있다.(검색을 위한 수고를 덜어줌) 결국 개인화로 연결된다.
- 회사 관점에서는 추천 엔진을 기반으로 이메일 마케팅, 신상품 마케팅, 관련 상품 추천 등의 추가 기능을 넣을 수 있다.
- 추천은 결국 매칭 문제
- 아이템은 서비스에 따라 달라지며 아이템이 다른 사용자가 될 수도 있음(데이트 어플 등)
- 어떤 아이템을 추천할 것인가?
- 지금 뜨는 아이템 추천, 마지막에 클릭했던 아이템 추천, 내가 구매한걸 구매한 다른 사람이 구매한 아이템 추천(협업 필터링이라고 함!) 등등
- 추천 UI도 중요하다.
- 사용자와 아이템에 대한 부가 정보들이 필요
- 아이템 부가 정보
- 먼저 분류 체계를 만드는 것이 필요
- 태그 형태로 부가정보를 유지하는 것도 아주 좋음
- 사용자 프로파일 정보
- 개인정보: 성별, 연령대
- 아이템 정보:
- 관심 카테고리와 서브 카테고리(분류체계 기반), 태그
- 클릭 혹은 구매 아이템
- 무엇을 기준으로 추천을 할 것인가?
- 클릭/매출/소비/평점
- 클릭/매출/소비/평점
추천 엔진 예제
- 추천 엔진의 예: 아마존 관련 상품 추천
- 사용자: 멤버, 아이템: 상품
- 내가 산것과 비슷한 제품군의 상품 추천 등
- 추천 엔진의 예: 넷플릭스 영화/드라마 추천
- 사용자: 멤버, 아이템: 영화/드라마
- 추천하는 이유도 같이 보여줌(요즘 트랜드, 당신이~을 봤기 때문에 추천, 탑10 추천)
- 추천 엔진의 예: 구글 자동 검색어 완성
- 사용자: 검색자, 아이템: 검색어
- 추천 엔진의 예: 링크드인 혹은 페이스북 친구 추천
- 사용자: 멤버, 아이템: 멤버
- 같은 회사, 대학을 나온 사람들, 같은 지역에 사는 사람들 등 추천하며 왜 추천하는지 이유를 보여줌.
- 추천 엔진의 예: 스포티파이 혹은 판도라 노래/플레이리스트 추천
- 사용자: 멤버, 아이템: 노래/플레이리스트
- 날씨, 무드, 사회현상 등에 의한 추천
- 추천 엔진의 예: 헬스케어 도메인의 위험 점수 계산
- 사용자: 의사/간호사, 아이템: 환자
- 어느 환자가 더 위험한지 예측하여 치료시 우선순위를 주기 위함(위험점수)
- 환자별로 발병 확률과 발병시 임팩트를 계산하여 곱함 -> 발병 확률은 모델링을 통해 예측
- 추천 엔진의 예: 유데미 강좌 추천
- 사용자: 멤버, 아이템: 강좌
- 늘 보는 강좌와 관련된 것 뿐만 아니라 새로운 강좌들도 간혹 추천해준다.(노출을 시킴으로써 기회를 준다.)
- 관련 키워드 노출
- 앞서 살펴본 추천 엔진들의 공통점
- 격자 형태 UI를 사용(넷플릭스가 선구자!)
- 다양한 종류의 추천 유닛들이 존재
- 일부 유닛은 개인화(사람에 따라 다른 아이템 추천)
- 일부 유닛은 인기도 등의 비개인화 정보 기반(모든 사람들에게 동일한 아이템 추천)
- 추천 유닛의 랭킹이 중요해짐
- 모델링으로 개인화하는 추세
- 클릭 최적화 -> 데이터수집을 위한 실험(온라인 테스트)
추천 엔진의 종류
다양한 방식의 추천 알고리즘이 존재
- 컨텐츠 기반(아이템 기반): 가장 대표적인 알고리즘
- 개인화된 추천이 아님. 비슷한 아이템을 기반으로 추천이 이루어짐
- NLP 텍스트 처리가 필요하기도 함(원핫인코딩, td-idf 등…)
- 협업 필터링(Collaborative Filtering): 평점 기준, 가장 대표적인 알고리즘
- 기본적으로 다른 사용자들의 정보를 이용하여 내 취향을 예측
- 크게 사용자 기반/아이템 기반 존재
- 결국 행렬 계산
- 사용자 기반
- 나와 비슷한 평점 패턴을 보이는 사람들을 찾아서 그 사람들이 높게 평가한 아이템 추천
- 아이템 기반
- 평점의 패턴이 비슷한 아이템들을 찾아서 추천
- 기본적으로 다른 사용자들의 정보를 이용하여 내 취향을 예측
- 사용자 행동 기반
- 아이템 클릭, 구매, 소비 등의 정보를 기반으로 추천
- 사용자와 아이템에 대한 부가 정보가 반드시 필요(클릭, 구매 등의 레코드)
- 구현이 간단하지만 아주 유용
- 모델링을 통해 사용자와 아이템 페어에 대한 클릭 확률 등의 점수 계산 가능
- 의사 결정 트리, 딥러닝
- 아이템 클릭, 구매, 소비 등의 정보를 기반으로 추천
- 많은 경우 위의 알고리즘들을 하이브리드 형태로 사용
컨텐츠 기반 추천
- 아이템 간의 유사도를 측정하여 추천(비개인화 추천)
- 책이라면 타이틀, 저자, 책 요약, 장르 등의 정보 사용
- NLP 테크닉을 사용해 텍스트 정보를 벡터 정보로 변환
- 단어 카운트, TF-IDF 카운트, 임베딩도 사용 가능
- 비개인화 추천이므로 모든 이에게 동일한 아이템 추천
- 보통 아이템의 수가 사용자의 수보다 적어 구현이 상대적으로 간단함
협업 필터링(Collaborative Filtering) 기반
- 사용자 기반 협업 필터링(User-to-User Collaborative Filtering)
- 나와 비슷한 평점 패턴을 보이는 사람들을 찾아서 그 사람들이 높게 평가한 아이템 추천
- 나와 비슷한 사용자를 어떻게 찾을지가 중요
- 사용자 프로파일 정보 구축
- 프로팡일 정보간의 유사도 계산(KNN 알고리즘을 사용하기도 함)
- 나와 비슷한 사용자를 어떻게 찾을지가 중요
- 나와 비슷한 평점 패턴을 보이는 사람들을 찾아서 그 사람들이 높게 평가한 아이템 추천
- 아이템 기반 협업 필터링(Item-to-Item)
- 2001년에 아마존에서 논문 발표
- 아이템들간의 유사도를 비교하는 것으로 시작
- 사용자 기반 협업 필터링과 비교해 더 안정적이며 높은 성능(아이템의 수가 보통 사용자의 수보다 작기 때문에 사용자에 비해 평점의 수가 평균적으로 더 많고 계산량이 작음)
- 아이템 기반은 숫자가 작아져서 계산량이 작아진다.
- 아이템별 평균 평점의 수는 사용자별 평균 평점의 수보다 높다. 아이템이 사용자 수보다 작은데 같은 수의 평점을 공유하므로. -> 데이터가 더 많다! 따라서 sparsity가 덜하다.
유사도 측정 방법
- 두개의 비교대상을 N차원 좌표로 표현: 사용자와 사용자 혹은 아이템과 아이템
- 보통 코사인 유사도 혹은 피어슨 유사도 사용
- 코사인 유사도
- 두 벡터의 방향성이 비슷할 수록 1에 가까운 값이 계산됨(동일할 경우 1)
- 두 벡터가 반대방향을 향하는 경우 -1이 계산됨
- 피어슨 유사도는 코사인 유사도의 개선버전으로 각 벡터를 중앙으로 중심으로 재조정
- 코사인 유사도
협업 필터링 문제점
- Cold Start 문제
- 사용자: 아직 평점을 준 아이템이 없는 경우
- 아이템: 아직 평점을 준 사용자가 없는 경우
- 보통 컨텐츠 기반 혹은 사용자 행동 기반 추천과 병행하여 이 문제를 해결
- 리뷰 정보의 부족(sparsity)
- 업데이트 시점
- 사용자나 아이템이 추가될 때마다 다시 계산을 해주어야 함
- 확장성 이슈
- 사용자와 아이템의 수가 늘어나면서 행렬 계산이 오래 걸리게 됨
- Spark과 같은 인프라가 이런 이유로 인해 필요함
- 협업 필터링의 많은 문제들이 추천의 일반적인 문제이기도 함
협업 필터링 구현 방법
- 메모리 기반
- 사용자 기반과 아이템 기반 방식
- 사용자간 혹은 아이템간 유사도를 미리 계산
- 추천 요청이 오면 유사한 사용자 혹은 아이템을 K개 뽑아서 이를 바탕으로 아이템 추천
- 구현과 이해가 상대적으로 쉽지만 스케일하지 않음(평점 데이터의 부족)
- 모델 기반
- 넷플릭스 프라이즈 컨테스트 때 고안된 추천 방식
- 사용자 아이템 행렬에서 비어있는 평점들을 SGD를 사용해서 채우는 방식
- 이는 보통 SVD을 사용해서 구현됨
- 요즘은 딥러닝의 오토인코더를 사용하기도 함
- 평점을 포함한 다른 사용자 행동을 예측하는 방식으로 진화하고 있기도 함
- 넷플릭스 프라이즈 컨테스트 때 고안된 추천 방식
사용자 행동 기반
- 사용자의 행동을 보고 그에 맞춰 아이템을 추천
- 주로 암시적 정보(클릭, 구매, 소비)를 기반
- 크게 두 종류가 존재
- 사용자 행동 기반 간단한 추천 유닛 구성(머신러닝, 유사도 측정 필요없음)
- 사용자가 관심보인 특정 카테고리의 새로운 아이템이 속한 카테고리와 태그
- 사용자가 관심보인 특정 카테고리의 인기 아이템이 속한 카테고리와 태그
- 사용자 행동을 예측하는 추천(클릭 혹은 구매)
- 지도 학습 문제로 접근 가능
- 무엇을 학습/예측하는 모델인지 먼저 생각
- 사용자 행동 기반 간단한 추천 유닛 구성(머신러닝, 유사도 측정 필요없음)
지도학습 방식의 추천 엔진
- 어떤 기준으로 추천을 하느냐가 가장 중요
- 결국 머신 러닝의 레이블 정보!
- 크게 두 종류의 힌트를 사용
- 명시적인 힌트
- 리뷰 점수 혹은 좋아요
- 암시적인 힌트: 클릭, 구매, 소비
- 클릭보다는 구매가 더 좋은 힌트이고 소비 여부도 좋은 힌트
- 클릭은 노이즈가 있지만 장점은 관심없는 아이템들의 파악이 쉽다
- 자세한 사용자 행동 정보의 수집, 저장, 가공이 먼저 필요
- 명시적인 힌트