AI/Machine Learnig

추천 시스템(Recommender System)

Jonghee Jeon 2020. 5. 1. 14:09

추천 시스템에 대해 정리해봅니다.

 

먼저 "추천"이라는 단어에 대해서 알아봅니다.

국립국어원에서 검색을 해보면 아래와 같은 뜻을 확인해 볼 수 있다.

 

추천(推薦)

 - 추천 「003」 「명사」 어떤 조건에 적합한 대상을 책임지고 소개함.

https://www.korean.go.kr/front/search/searchAllList.do

 

국립국어원

통합검색

www.korean.go.kr

즉, 추천을 한다는 것은 본인이 확신을 가지고 상대방에게 특정 제안을 하는 것과 비슷한 맥락이라 볼 수 있다.

 

추천 시스템(推薦system)은 정보 필터링 (IF) 기술의 일종으로, 특정 사용자가 관심을 가질만한 정보 (영화, 음악, 책, 뉴스, 이미지, 웹 페이지 등)를 추천하는 것이다. 추천 시스템에는 협업 필터링 기법을 주로 사용한다. 소셜 북마크 사이트에서 링크를 사람들에게 추천하고 무비렌즈 데이터 세트에서 영화를 추천하는 방법등이 이에 속한다.

추천 시스템 개발을 위한 일반적인 알고리즘은 아래와 같다.

Collaborative filtering

Collaborate filtering은 사용자 행동, 활동 또는 선호도에 대한 많은 정보를 분석하고 모으고 다른 사용자와의 비슷함에 기초를 두고 사용자들이 무엇을 좋아할 지를 예측하는 것에 기초를 두고 있다. Collaborative Filtering 접근법의 한 중요한 장점은 machine analyzable content에 의존하고 있지 않다는 것이다. 그래서 정확하게 아이템 그 자체를 이해하지 않고도 영화와 같은 복잡한 아이템들을 추천 할 수 있다. 많은 알고리즘은 추천 시스템에서 사용자나 아이템의 비슷함(similarity)을 측정하는 데 사용되고 있다. 예를 들어, KNN과 Pearson correlation이 있다.

  •  KNN

분류할 때, 분류 대상과 가까운 k개를 뽑아 그 중 가장 많은 비율을 차지 한 쪽으로 분류

  • Pearson correlation

연속형 두 변수간의 선형관계(관련성)를 구하기 위해 사용된다. -1에서 +1사이의 범위값

Collaborate filtering은 과거에 동의한 사람들이 미래에도 동의하고 그들이 그들이 과거에 좋아했던 것들을 좋아할것이라는 가정에 기초를 두고 있다.

사용자의 행동으로부터 모델을 만들 때, 특징(차이점)은 종종 data collection의 뚜렷하기도하고 암시적이도한 형태 사이에서 만들어진다.

  • Explicit data collection의 예

사용자에게 item을 평가하게 하기, 검색하게 하기, 가장 선호하는 것과 가장 덜 선호하는 것을 순위매기게 하기 등

  •  implicit data collection의 예

사용자가 본 item을 관찰하고 분석하기, 사용자가 구매한 item을 기록하기, 사용자의 SNS를 분석하고 비슷한 likes와 dislikes를 찾아내기

이 추천 시스템은 모아진 데이터를 다른 사람들로부터 모아진 비슷하고 안비슷한 데이터와 비교하고, 사용자의 추천된 items 목록을 계산한다.

Linkedin, facebook과 같은 SNS는 collaboprative filtering을 친구 추천 등에 사용한다.

 

Content-based filtering

또 다른 잘 알려진 접근법은 content-based filtering이다. 이는 item에 대한 설명(description)과 사용자 선호에 대한 profile을 기반으로 한다.

Content-based 추천 시스템에서, 키워드는 item을 설명(describe)하는데 사용되고 사용자의 프로필은 이 사용자가 좋아하는 류(type)의 item을 가리키게(indicate) 만들어진다. 다른 말로하면, 이런 알고리즘들은 과거에 사용자가 좋아했던 것들(또는 현재 보고 있는 것들)과 비슷한 items을 추천하려고 한다. 구체적으로 말하면, 다양한 후보 items은 사용자에 의해 현재 평가되는 (rated) items과 비교되고 best-matching items은 추천된다. 이 접근법은 information retrieval과 information filtering에 뿌리를 두고 있다.

  • Information retrieval

집합적 정보로부터 원하는 내용이나 관련되는 내용을 가져오는 것

  •  Information filtering

필요 없는 정보를 제거하는 것

         Items의 특징을 끌어내기 위해, tf-idf 알고리즘이 많이 사용된다.

  •  Tf-idf: Term frequency-inverse document frequency

여러 문서로 이루어진 문서군이 있을 때 어떤 단어가 특정 문서 내에서 얼마나 중요한 것인지를 나타내는 통계적 수치이다.

TF(term-frequency 단어 빈도)가 높을 수록 문서에서 중요하다고 생각될 수도 있지만 단순히 흔하게 등장하는 것일 수도 있음. 이를 DF(document frequency 문서 빈도)라고 하며, 이 값의 역수를 IDF(inverse)라고 한다. TF-IDF는 TF와 IDF를 곲한 값이다.

 

사용자의 profile을 만들기 위해서, 그 시스템은 대게 두가지 정보에 집중한다:

1.    사용자의 선호의 model

2.   추천시스템과 사용자의 상호작용 정보(history)

기본적으로 이런 방법들은 시스템 안에서 item에 특성을 부여하면서 item profile(이산적 features와 attributes)을 사용한다. 그 시스템은 item특성의 weighted vector을 기반으로 한 사용자의 content-based profile을 만든다. Weights는 사용자에게 각각의 feature의 중요도를 나타내고 개별적으로 점수 매겨진(rated) content vectors로부터 다양한 방법으로 계산될 수 있다. 사용자가 좋아할것 같은 확률(probability)을 계산하기 위해 다른 복잡한 방법들해 베이지안 분류, 클러스터 분석, 결정 트리 그리고 인공 신경망 네트워크와 같은 머신러닝 기술을 사용하는 반면에, 간단한 접근법들은 그 점수 매겨진 item vector의 평균 값을 사용한다.

보통 ‘좋아요’와 ‘싫어요’와 같은 형태로 사용자로부터 직접적인 피드백은 특정한 속성(attribute)의 중요도에 대한더 높거나 낮은 weight를 할당하는데 사용될 수 있다.

Content-based filtering의 중요한 문제점은, 한 content source에 관련된 사용자들 행동으로부터 사용자 선호도를 배울 수 있고 다른 content 종류(type)을 넘어서 그것들을 사용할 수 있을지 아닌지이다. 그 시스템이 사용자가 이미 사용한 것과 같은 종류의 content를 추천하는 것에 한정돼 있을 때, 다른 서비스의 다른 종류의 content가 추천될 수 있을 때보다 추천 시스템의 가치는 상당히 낮다. 예를들어, news browsing에 기반한 추천 뉴스 기사는 유용하지만, news browsing에 기반해 추천될 수 있는 다른 서비스의 음악, 비디오, 제품 토론에서 더 유용하다.

Pandora Radio는 첫 seed와 같이 사용자에 의해 제공된 노래와 비슷한 특징의 음악을 재생해 주는 content-based 추천 시스템의 한 예이다.

Hybrid recommender systems

최근 연구는 collaborate 과 content-based filtering을 섞은 hybrid 접근 법이 몇몇의 상황에서 더 효과적일 수 있다고 설명한다. Hybrid 접근법은 여러가지 방법으로 사용(implement)될 수 있다: 한 접근 법을 다른 접근법에 더하거나, 하나의 model로 만들거나. 몇몇의 연구들은 두가지 접근법을 hybrid와 경험에 기인해서 비교하고 hybrid가 두 접근법들보다 훨씬 더 정확한 추천을 제공한다고 말한다. 이런 방법들은 cold start와 sparsity 문제와 같은 추천시스템에서 공통적인 문제의 몇몇을 극복할 수 있다고 한다.

  • Cold start: 충분한 정보가 없어서 필요한 정보를 얻지 못하는 것

Netflix는 hybrid 추천 시스템의 좋은 예이다. 이 웹사이트는 사용자가 높게 평가했던(content-based)영화와 비슷한 특성을 띄는 영화를 추천 하고, 비슷한 사용자(collaborate)들의 검색 습관과 시청을 비교함으로서 추천을 한다.

다양한 기술들은 추천시스템의 기초로 제안되어 왔다: collaborative, content-based, knowledge-based 그리고 demographic 기술. 이 기술들은, 몇개의 평가(rating)을 한 새로운 사용자를 어떻게 하지와 같이 collaborative와 content-based의 유명한 cold-start문제와 knowledge-based 접근 법의 the knowledge engineering bottleneck(병목현상)과 같은 단점을 가지고 있다. Hybrid 추천 시스템은 그들 사이의 시너지를 얻기 위해서 여러 기술들을 합치는 것이다

Collaborative 이 시스템은 다른 사용자들과 items에 대한 profiles을 평가하는 정보만 사용하면서 추천을 한다. 이 시스템은 현재의 사용자나 items과 비슷한 평가 기록(history)와 함께 비슷한(peer) 사용자 또는 items을 배치하고, 이 근접이웃(neighborhood)를 이요해서 추천을 만든다. 사용자 기반과 item기반의 가장 가까운 이웃 알고리즘은 cold-start문제를 해결하기 위해 합쳐질 수 있고 추천 결과를 향상시킬 수 있다.
Content-based 이 시스템은 사용자가 그들에게 준 평가와 제품들과 관련된 특징이라는 두가지 Sources로부터 추천을 만든다. Content-based 추천자는 추천을 user-specific 분류 문제처럼 다루고 제품의 특징에 기반한 사용자의 좋아요와 싫어요의 분류자를 학습한다.
Demographic Demographic(인구 통계학적) 추천은 사용자의 인구통계학적 정보(profile)를 기반으로 추천을 제공한다. 추천된 제품은 그 영역의 사용자들의 평가들을 합침으로써 다른 인구통계학적 영역을 위해 만들어질 수 있다.
Knowledge-based 이 추천자는 사용자의 선호와 요구(needs)에 대한 추론을 기반으로 한 제품을 제안한다. 이 지식(knowledge)는 때때로 얼마나 특정한 제품 특징이 사용자의 요구를 충족시키는 지에 대한 뚜렷한 기능적(functional) 지식을 포함한다.

Hybrid 추천 시스템이란 용어는 여기서 결과를 만들어 내기 위해 다중의 추천 기술을 함께 섞는 어떠한 추천 시스템을 설명하는데 사용된다. 같은 유형의 몇몇의 다른 기술들이 함께 되지(be hybridzed) 못하는지에 대한 이유는 없다. 예를 들어, 두개의 다른 content-based 추천은 함께 효과를 낼 수 있고 많은 프로젝트들이 이런 종류의 조합에 투자해 왔다: naïve bayes와 knn을 함께 사용한 NewsDude는 한 예다. 7개의 hybridization 기술들:

1.    Weighted: 다른 추천 요소들의 점수는 수학적으로 합쳐진다.

2.    Switching: 그 시스템은 추천 요소들 안에서 선택하고 고른 것을 적용한다.

3.    Mixed: 다른 추천자로부터의 추천들은 추천을 주기위해 함께 보여진다.

4.    Feature Combination: 다른 지식 sources로부터 나온 특징들은 함께 합쳐지고 하나의 추천 알고리즘에 쓰인다.

5.    Feature Augmentation: 하나의 추천 기술은 하나의 특징이나 다음 기술의 입력의 한 부분이 될 특징들의 세트에 사용된다.

6.    Cascade: 추천자는 더 낮은 우선 순위들이 더 높은 것들의 점수를 매기는 것이 단절되면서 엄격한 우선순위를 가진다.

7.    Meta-level: 한 추천 기술은 적용되고 다음 기술의 입력으로 사용되는 몇몇의 model을 만든다.

https://ko.wikipedia.org/wiki/%EC%B6%94%EC%B2%9C_%EC%8B%9C%EC%8A%A4%ED%85%9C

 

 

Spark ML Recommendation ex)

from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml.recommendation import ALS
from pyspark.sql import Row

lines = spark.read.text("data/mllib/als/sample_movielens_ratings.txt").rdd
parts = lines.map(lambda row: row.value.split("::"))
ratingsRDD = parts.map(lambda p: Row(userId=int(p[0]), movieId=int(p[1]),
                                     rating=float(p[2]), timestamp=long(p[3])))
ratings = spark.createDataFrame(ratingsRDD)
(training, test) = ratings.randomSplit([0.8, 0.2])

# Build the recommendation model using ALS on the training data
# Note we set cold start strategy to 'drop' to ensure we don't get NaN evaluation metrics
als = ALS(maxIter=5, regParam=0.01, userCol="userId", itemCol="movieId", ratingCol="rating",
          coldStartStrategy="drop")
model = als.fit(training)

# Evaluate the model by computing the RMSE on the test data
predictions = model.transform(test)
evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating",
                                predictionCol="prediction")
rmse = evaluator.evaluate(predictions)
print("Root-mean-square error = " + str(rmse))

# Generate top 10 movie recommendations for each user
userRecs = model.recommendForAllUsers(10)
# Generate top 10 user recommendations for each movie
movieRecs = model.recommendForAllItems(10)

# Generate top 10 movie recommendations for a specified set of users
users = ratings.select(als.getUserCol()).distinct().limit(3)
userSubsetRecs = model.recommendForUserSubset(users, 10)
# Generate top 10 user recommendations for a specified set of movies
movies = ratings.select(als.getItemCol()).distinct().limit(3)
movieSubSetRecs = model.recommendForItemSubset(movies, 10)

https://spark.apache.org/docs/latest/ml-collaborative-filtering.html

 

 

딥러닝 기반 추천 시스템에 대해 참고하기 좋은 블로그

 - https://medium.com/daangn/딥러닝-개인화-추천-1eda682c2e8c

 

딥러닝 개인화 추천

당근마켓 첫화면은 동네 사람들이 사용하는 다양한 물품을 보는 재미가 있어요. 누군가에겐 이제 필요없지만 나에게 유용한 물건들을 발견하게 되고 더불어 저렴하게 득템 할 기회도 종종 있죠. 매일 새로운 글이 올라오는 첫 화면의 스크롤을 내리며 탐색하는…

medium.com

 - http://hoondongkim.blogspot.com/2019/03/recommendation-trend.html

 

추천(Recommendation) 시스템 - 알고리즘 Trend 정리

BigData / AI 기술과 각종 정보를 공유하는 김훈동의 블로그 입니다.

hoondongkim.blogspot.com

 - https://brunch.co.kr/@mobiinside/863

 

딥러닝 (Tensorflow) 을 이용한 추천 시스템

Buzzvil 블로그에 소개된 글을 편집한 뒤 모비인사이드에서 한 번 더 소개합니다. 1.  글을 시작하기 전에 안녕하세요, 모바일 잠금화면 애드네트워크 버즈빌의 컨텐츠와 머신러닝 product manager 곽상훈(Mike) 입니다. 버즈빌은 딥러닝을 이용하여 개인화된 컨텐츠를 자동 추천, 사용자 경험을 도우며 광고 플랫폼으로서의 기술적 우위를 보유하

brunch.co.kr

 - https://github.com/drumcap/data-science-study-bookmarks-for-korean

 

drumcap/data-science-study-bookmarks-for-korean

데이터 사이언스 공부를 위한 즐겨찾기 모음 (한국인을 위한). Contribute to drumcap/data-science-study-bookmarks-for-korean development by creating an account on GitHub.

github.com