본문 바로가기
ML 공부

[2] 추천 시스템 2

by 민지기il 2025. 3. 20.

[1] Introduction

앙상블과 랜덤 포레스트

: 다수의 분류기를 사용해서 예측하는 방식, 성능이 좋지만 train, test 시간이 오래 걸림

> 유사도 측정 알고리즘

1) 코사인 유사도: n차원 공간에 있는 두 개의 벡터간의 각도로 유사도 판단 - scikit-learn

2) 피어슨 유사도: 코사인 유사도의 개선 버전

각 벡터 내 셀들의 평균 값 구하기 -> 각 셀에서 평균 값 빼기 ; 모든 벡터가 원점을 중심으로 이동함, 벡터 간 비교가 쉬워짐

 

[2] 텍스트를 행렬로 표현하는 방법

1) Bag Of Words 

: 단어의 수를 카운트해서 표현함

- CountVectorizer

from sklearn.feature_extraction.text import CountVectorizer

text = [

'The sky is blue.',

'The sun is bright.',

'The sun in the sky is bright',

'We can see the shining sun, the bright sun.'

]

countvectorizer = CountVectorizer(analyzer = 'word', stop_words='english') // 단어 단위로

count_wm = countvectorizer.fit_transform(text)

2) TF-IDF

: 단어의 수를 카운트하고 문서군 전체를 보고 중요도를 부여함

단어가 한 문서에서 자주 나오면 중요하지만 이 단어가 다른 문서들에서는 자주 나오지 않는다면 더 중요하다고 생각함

TF(단어 t가 문서 d에서 몇 번 나왔나?), DF(단어 t가 전체 문서군에서 몇번 나왔나?), ln(N/DF) (N은 총 문서 수, DF는 단어가 나온 문서의 수, ex) N은 4, sun이 나온 문서는 3개, Doc4에서 sun은 2개 -> 2*ln(4/3) = 0.575

- 코드

from sklearn.feature_extraction.text import TfidfVectorizer

text = [

'The sky is blue.',

'The sun is bright.',

'The sun in the sky is bright',

'We can see the shining sun, the bright sun.'

]

tfidfvectorizer = TfidfVectorizer (analyzer = 'word', stop_words='english', norm='l2') // 주로 l2 정규화 사용함

tfidf_wm = tfidfvectorizer.fit_transform(text)

- 문제

정확하게 동일한 단어가 나와야 유사도 계산이 됨 (동의어 x)

단어의 수가 늘어나고 아이템의 수가 늘어나면 계산이 오래걸림

워드 임베딩을 사용하는 것이 더 좋음

 

[3] 일반적인 추천 엔진 아키텍처

1) 아키텍처

- 입력: 사용자 or 아이템

- 협업 필터링 평점 예측 모델 (개인의 선호도 정보) + 콘텐츠 기반 추천 (아이템 정보) = 추천 후보 생성 로직; 다양한 알고리즘이 사용됨

- 추천 후보 랭킹 / 필터링

- 출력: 추천 아이템들

2) 협업 필터링

: 기본적으로 다른 사용자들의 정보를 이용하여 내 취향을 예측하는 방식

a. 사용자 기반: 나와 비슷한 평점 패턴을 보이는 사람들을 찾아서 그 사람들이 높게 평가한 아이템 추천

b. 아이템 기반: 평점의 패턴이 비슷한 아이템을 찾아서 그걸 추천함

c. 예측 모델 기반: 앞의 2개는 유사도를 기반으로 추천 아이템 결정, 이 방식은 평점을 예측하는 머신러닝 모델 생성

 

> 구현 방식

- 메모리 기반

: 코사인/피어슨 상관계수 유사도를 사용함

유사도를 기반으로 추천

- 모델 기반

: ML을 이용해 평점 예측

행렬의 차원을 줄여서 평점 데이터의 부족 문제 해결

 

> 평가 방식

- 메모리 기반

: Top-N 방식으로 평가; 사용자가 좋아한 아이템을 일부 남겼다가 추천 리스트에 포함되어 있는지 보는 방식

추천 순서를 고려해서 평가하면 nDCG(normalized discounted cumulative gain)도 사용함

- 모델 기반

:RMSE으로 성능 평가 가능, 과거의 평가가 미래에도 반영될 거라는 보장 X

메모리 기반의 Top-N이나 nDCG 방식도 사용 가능

- 온라인 테스트

: 가장 좋은 방식을 실제 사용자에세 노출시키고 성능을 평가함

 

> SurpriseLib 

: 협업 필터링의 성능 평가와 관련한 다양한 기능을 제공하는 라이브러리

KNNBasic 객체를 사용해 사용자 기반 / 아이템 기반 협업 필터링 구현

SVD 또는 SVDpp 객체를 사용해 모델 기반 협업 필터링

 

[4] 사용자 기반 협업 필터링

1) 사용자의 유사도 측정

: 사용자들을 벡터(아이템에 대한 평점)로 표현

지정된 사용자(u)와 다른 사용자들(u')과 유사도 측정: 공통으로 평점을 준 아이템만 대상으로 사용자들간 유사도 측정

이 중 가장 비슷한 K명의 사용자 선택 -> 이 K명의 사용자(u')들 대상으로  u가 평가하지 않은 아이템을 평가

u'가 평가한 아이템 i의 평점에 u와 u'의 유사도를 가중치로 합을 계산, 합산한 값이 큰 아이템들을 추천함

 

[5] 아이템 기반 협업 필터링

: 아이템의 유사도를 기준으로 추천을 하는 아이템 기반 협업 필터링

'ML 공부' 카테고리의 다른 글

[3] 추천 시스템 3  (1) 2025.03.24
[1] 추천 시스템  (1) 2025.03.18
TextMining_lecture06  (0) 2024.11.10
TextMining_lecture05  (0) 2024.11.07
TextMining_lecture04  (2) 2024.11.07