뮤트 개발일지

AIFFEl 아이펠 38일차 본문

AIFFEL

AIFFEl 아이펠 38일차

박뮤트 2022. 2. 22. 17:16

아이유팬이 좋아할만한 다른 아티스트 찾기

협업 필터링(Collaborative Filtering):

다수의 사용자의 아이템 구매 이려 정보로 사용자간 유사성 및 아이템 간 유사성 파악

아이템과 사용자 간의 행동 또는 관계에 주목한다. (아이템 자체의 고유한 속성에는 주목하지 않는다.)

* 협업 필터링을 바로 사용할 수 없는 상황

1. 시스템이 충분한 정보를 모으지 못한 사용자나 아이템에 대해 추론을 할 수 없는 상태(콜드 스타트)인 상황

2. 계산량이 너무 많아 추천의 효율이 떨어지는 상황

3. 사용자의 관심이 저조한 항목의 정보가 부족하여 추천에서 배제되는 상황

 

콘텐츠 기반 필터링(Contents-based Filtering):

아이템의 고유한 정보를 바탕으로 아이템 간 유사성 파악

아이템 자체의 속성에만 주목한다. (사용자와 아이템 간의 관련성에는 주목하지 않는다.)

 

(데이터 전처리 과정은 생략함)

 

Matrix Factorization(MF, 행렬분해)

앞으로 m명의 사용자들이 n명의 아티스트에 대해 평가한 데이터를 포함한 (m, n)사이즈의 평가행렬(Rating Matrix)를 만들 것이다.

행렬 중 일부는 데이터가 채워져있지만, 나머지는 데이터가 비워져있다.

 

Matrix Factorization 모델: (m, n)사이즈의 행렬R을 (m, k)사이즈의 행렬P와 (k, n)사이즈의 행렬Q로 분해한다면, R은 P와 Q의 행렬 곱으로 표현 가능하다는 아이디어이다.

https://developers.google.com/machine-learning/recommendation/collaborative/matrix

P_0=(1, 0.1)은 첫 번째 사용자 특성(feature) 벡터,

Q_0=(0.9, -0.2)는 해리포터 영화의 특성 벡터,

MF 모델은 이 두 벡터를 내적해서 얻어지는 0.88이 R_0,0으로 정의되는 사용자의 영화 선호도로 보는 모델이다.


CSR(compressed sparse row) Matrix: 행렬에서 0이 아닌 유효한 데이터로 채워지는 데이터의 값과 좌표 정보만으로 구성하여 메모리 사용량을 최소화하면서 sparse한 행렬과 동일한 행렬을 표현할 수 있도록 하는 데이터 구조

1. data: 0이 아닌 원소를 차례로 기입한 값

data = [1, 2, 3, 4, 5, 6]

2. indices: data의 각 요소가 어느 열에 있는지 표현한 index

indices = [0, 4, 1, 3, 0, 3]

3. indptr: 각 행에서 0이 아닌 첫 번째 원소가 data리스트의 몇번째에 해당하지와 마지막 data 벡터의 길이를 추가한 값 (다만, 예시의 세번째 행처럼 0이 아닌 원소가 없는 경우, 그 다음 행의 값과 같은 값을 넣었다.)

indptr = [0, 2, 4, 4, 6]

=> data[0:2]는 첫 번째 행, data[2:4]는 두 번째 행, data[4:4]는 세 번째 행, data[4:6]은 네 번째 행에 위치함을 알 수 있다.


implicit 패키지: 암묵적(implicit) dataset을 사용하는 다양한 모델을 빠르게 학습할 수 있는 패키지

여기에 구현된 als(AlternatingLeastSquares) 모델: MF에서 쪼개진 두 Feature Matrix를 한번에 훈련하는 것은 잘 수렴하지 않기 때문에, 한쪽을 고정시키고 다른 쪽을 학습하는 방식을 번갈아가면서 수행한다.

 

AlternatingLeastSquares 클래스의 __init__파라미터:

1. factors: 유저와 아이템의 벡터를 몇 차원으로 할 것인가

2. regularization: 과적합을 방지하기 위해 정규화 값을 얼마나 사용할 것인가

3. use_gpu: GPU를 사용할 것인가

4. iterations: epochs와 같은 의미, 데이터를 몇 번 반복해서 학습할 것인가

=> 1, 4를 늘릴 수록 잘 학습하게 되지만 과적합의 우려가 있다.

# Implicit AlternatingLeastSquares 모델의 선언
als_model = AlternatingLeastSquares(factors=100, regularization=0.01, use_gpu=False, iterations=15, dtype=np.float32)

 


비슷한 아티스트 추천하기

AlternatingLeastSquares 클래스에 구현되어 있는 similar_items 메소드를 통해 비슷한 아티스트 찾기

favorite_artist = 'coldplay'
artist_id = artist_to_idx[favorite_artist]
similar_artist = als_model.similar_items(artist_id, N=15)
similar_artist
[(62, 0.9999999),
 (277, 0.9867956),
 (28, 0.97904533),
 (5, 0.9785825),
 (217, 0.97632045),
 (473, 0.97286177),
 (247, 0.9703748),
 (418, 0.9649576),
 (490, 0.95984447),
 (694, 0.95678514),
 (1018, 0.9538151),
 (268, 0.9526419),
 (910, 0.95107484),
 (782, 0.9494027),
 (55, 0.94567364)]

아티스트 이름으로 매핑

#artist_to_idx 를 뒤집어, index로부터 artist 이름을 얻는 dict를 생성합니다. 
idx_to_artist = {v:k for k,v in artist_to_idx.items()}
[idx_to_artist[i[0]] for i in similar_artist]
['coldplay',
 'muse',
 'the killers',
 'red hot chili peppers',
 'radiohead',
 'placebo',
 'the beatles',
 'u2',
 'oasis',
 'foo fighters',
 'the smashing pumpkins',
 'pink floyd',
 'nirvana',
 'the white stripes',
 'arctic monkeys']

유저에게 아티스트 추천하기

AlternatingLeastSquares 클래스에 구현되어 있는 recommend 메소드를 통해 아티스트 추천하기

(filter_already_liked_items는 유저가 이미 평가한 아이템은 제외하는 argument)

user = user_to_idx['zimin']
# recommend에서는 user*item CSR Matrix를 받습니다.
artist_recommended = als_model.recommend(user, csr_data, N=20, filter_already_liked_items=True)
artist_recommended
[(350, 0.45524868),
 (550, 0.4480194),
 (2249, 0.4326442),
 (627, 0.4267044),
 (1800, 0.42641813),
 (369, 0.42072558),
 (724, 0.4158663),
 (354, 0.40008077),
 (355, 0.39854395),
 (621, 0.39809975),
 (391, 0.39098284),
 (901, 0.3871166),
 (382, 0.37237936),
 (618, 0.36482096),
 (5555, 0.36249092),
 (24, 0.3604712),
 (3005, 0.3594465),
 (409, 0.35877532),
 (5, 0.35196137),
 (274, 0.34757137)]
[idx_to_artist[i[0]] for i in artist_recommended]
['rihanna',
 'britney spears',
 'katy perry',
 'maroon 5',
 'lady gaga',
 'justin timberlake',
 'lily allen',
 'nelly furtado',
 'madonna',
 'alicia keys',
 'christina aguilera',
 'pink',
 'mika',
 'the pussycat dolls',
 'timbaland',
 'jack johnson',
 'duffy',
 'amy winehouse',
 'red hot chili peppers',
 'michael jackson']

'AIFFEL' 카테고리의 다른 글

AIFFEL 아이펠 40일차  (0) 2022.02.24
AIFFEL 아이펠 39일차  (0) 2022.02.23
AIFFEL 아이펠 37일차  (0) 2022.02.21
AIFFEL 아이펠 36일차  (0) 2022.02.18
AIFFEL 아이펠 35일차  (0) 2022.02.18