Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

what i learned

[ML] 추천시스템(4) - 잠재요인 협업 필터링 본문

Artificial Intelligence/Machine Learning

[ML] 추천시스템(4) - 잠재요인 협업 필터링

햄식이111 2023. 12. 4. 23:55

추천시스템은 크게 콘텐츠기반 필터링과 협업 필터링으로 나뉘게 된다.

 

[ML] 추천시스템

추천시스템은 크게 콘텐츠 기반 필터링과 협업 필터링으로 나뉜다. 1️⃣ 콘텐츠 기반 필터링 2️⃣ 협업 필터링 ◎ 최근접 이웃 협업 필터링(=메모리 협업 필터링) - 사용자 기반 - 아이템 기반

enddl3224.tistory.com

그 중 협업 필터링인 잠재요인 기반의 협업 필터링에 대해 자세히 공부하려고 한다.

 

 

잠재요인 협업필터링이란?

명확하게는 알 수 없는 잠재요인(factor)를 기준으로 테이블을 2개로 나누어 두 행렬을 내적의 곱을 통한 예측값을 생성하는 방식이다.

마치 이차방정식 ax^2 + bx + c를 (Ax+B)(Cx+D) 처럼 나누는 것이다.

출처 파이썬 머신러닝 완벽 가이드

행렬에선 연산을 하는게 복잡하지만 간단하게 말하면 원본행렬 R을 잠재요인(factor)를 기준으로 P와 Q로 나누게 되는 것이다.

 

일반적인 행렬분해에는 SVD(Singular Vector Decomposition)이나 NMF(Non-Negative Matrix Factorization)을 사용하지만,

실습에서 사용할 영화 평점을 예측하는 데이터에서는 사용자가 아직 평점을 매기지 않은 Null값이 많이 존재하므로 희소행렬까지 처리할 수 있는 경사하강법을 사용하겠다.

 

 

MovieLens 데이터셋을 사용한 잠재요인 협업필터링

1️⃣ 원본행렬 R 생성

먼저, 사용자와 아이템 평점에 기반하기 위해 행렬을 사용자-영화평점 데이터로 변경한다.

(MovieLens 데이터셋은 단순히 userId, movieId, rating 정보가 입력된 데이터이기 때문)

 

2️⃣ 잠재요인(factor)를 기준으로 행렬 P와 Q로 나누기 (경사하강법 사용)

예측값과 실제값의 오차를 줄이도록 반복적인 연산을 하는 경사하강법(SGD; Stochastic Gradient Descent)을 사용하여 P와 Q를 나눈다.

머신러닝 특성상 잠재요인인 factor를 어떤 기준으로 나눈건지 정확하게 알 수 없지만 잠재요인을 기준으로 두 개의 행렬을 구하게 된다.

경사하강법을 통한 행렬분해 코드 ➡️ github.com/enddl3224

 

3️⃣ 생성된 P와 Q의 전치행렬에 대해 내적의 곱 수행

생성된 행렬 P와 Q는 원본행렬 R과 같은 shape을 가지며 row는 개발자가 지정한 요소로, column은 임의의 잠재요인(factor)로 지정되어 생성된다.

그러므로 Q행렬은 전치행렬로 변환하여 내적의 곱을 수행시켜야한다.

 

4️⃣ 예측된 행렬을 통해 사용자에게 추천하기

아래의 행렬이 잠재요인(factor)를 기준으로 P, Q행렬을 구하여 내적의 곱을 수행한 후 나온 예측 행렬이다.

 

이전에 사용했던 아이템 기반의 최근접 이웃 협업필터링보다 오차가 줄어든 걸 육안으로 확인할 수 있다.

또한 사용자1이 기존에 남겼던 실제 데이터 평점과 예측한 데이터 평점도 비슷한 것을 확인할 수 있다.

(좌) 사용자의 실제 평점 / (우) 예측된 사용자의 평점

이 데이터를 토대로 사용자1이 관심을 가질 영화 데이터 10개를 추출하면된다.

이전의 아이템을 기반한 최근접 이웃 협업 필터링과 다른 결과값을 확인할 수 있다.

 

 

위의 실습을 진행한 코드를 자세히 보고 싶다면 ➡️ github.com/enddl3224

학습을 참고한 원본 코드는 ➡️ (링크)파이썬 머신러닝 완벽 가이드

 

 

 

"파이썬 머신러닝 완벽 가이드"를 학습하여 기록한 글입니다.


공부한 내용을 기록하는 공간입니다.

잘못된 정보가 있을 경우 댓글로 피드백 주세요.

올바른 지식을 알려주셔서 감사합니다:)