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] 추천시스템(2) - 콘텐츠 기반 필터링 본문

Artificial Intelligence/Machine Learning

[ML] 추천시스템(2) - 콘텐츠 기반 필터링

햄식이111 2023. 11. 19. 19:09

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

 

[ML] 추천시스템

"파이썬 머신러닝 완벽 가이드(권철민 저)" 추천시스템은 크게 콘텐츠 기반 필터링과 협업 필터링으로 나뉜다. 1️⃣ 콘텐츠 기반 필터링 2️⃣ 협업 필터링 ◎ 최근접 이웃 협업 필터링(=메모리

enddl3224.tistory.com

그 중 콘텐츠 기반 필터링에 대해 TMDB 5000 데이터셋을 가지고 자세히 설명하려고 한다.

 

 

콘텐츠 기반 필터링이란?

사용자가 영화를 감상한 후 감상했던 영화를 기반으로 비슷한 특성을 가진 다른 영화를 추천하는 시스템이다.

예를 들어, "알라딘"이라는 영화를 감상했다면 <디즈니>라는 공통특성을 가진 "라푼젤", "겨울왕국"과 같은 디즈니영화를 추천하게 되는 방식이다.

그렇기 때문에 영화에 대한 정보가 있어야한다.

 

"알라딘"이라는 영화는 디즈니에서 제작하며 장르는 판타지, 뮤지컬, 모험 ... 감독은 가이리치, 출연진은 나오미스콧, 미나마수드, 윌스미스 ...

"라푼젤"이라는 영화는 디즈니에서 제작하며 장르는 뮤지컬, 코미디, 로맨스 ... 감독은 네이선 그레노, 출연진은 맨디무어, 제커리레비 ...

"겨울왕국"이라는 영화는 디즈니에서 제작하며 장르는 애니메이션, 뮤지컬, 판타지 ... 감독은 크리스벅제니퍼리, 출연진은 이디나멘젤, 크리스틴벨...

이러한 정보를 행렬에 담아서 "알라딘"이라는 영화의 정보와 비슷한 영화들을 추천하게 된다.

네이버 추천시스템

위의 사진처럼 네이버에  라푼젤을 검색하면 관련 디즈니 영화가 뜨는 것을 알 수 있다. (실제 콘텐츠 기반으로 작동하는지는 모르겠지만,,^^)

 

 

 

TMDB 5000 을 활용한 콘텐츠 기반 추천 시스템 알고리즘

TMDB 5000 영화 데이터셋을 살펴보면 장르, 키워드, 제목, 요약, 개봉일 등 영화의 정보를 확인할 수 있다.

위의 사진은 수많은 데이터들 중에서 0번째 영화 "Avatar"에 관한 정보가 들어있는 것이다.

이렇게 영화의 정보를 행렬에 저장하여 데이터를 처리하고, 사용자가 원하는 다른 비슷한 영화를 추천하게 되는 것이다.

 

 

콘텐츠 유사도 측정

여기서 데이터를 처리할 때 발생하는 문제가 있다.

영화A의 장르가 [액션, 어드벤처, 판타지, 공상과학]이고, 영화B의 장르가 [어드밴처, 판타지, 액션]으로

영화B의 장르가 영화A의 장르에 포함되어있을 경우이다.

 

이런 경우, 코사인 유사도를 사용하여 유사도를 측정한다.

 

[ML] 코사인 유사도

"파이썬 머신러닝 완벽 가이드(권철민 저)" 코사인 유사도란? 두 벡터 사이의 사잇각을 구해서 두 벡터값이 서로 얼마나 유사한지 수치로 확인하는 방법이다. 위의 그림처럼 유사한 벡터들 사이

enddl3224.tistory.com

코사인 유사도를 사용하면 영화B의 장르가 영화A에 포함되어 있어도 유사도 측정을 통해 구분할 수 있게 된다.

 

코사인 유사도를 사용하면

  영화A의 장르 영화B의 장르 영화C의 장르 영화D의 장르
영화A의 장르 1 0.59628479 0.4472136 ...
영화B의 장르 0.59628479 1 0.4 ...
영화C의 장르 0.4472136 0.4 1 ...
영화D의 장르 ... ... ... 1

와 같은 결과값이 나오게 되고, 유사도가 가장 높은 장르를 추출할 수 있게 된다.

 

 

콘텐츠 필터링 이용

코사인 유사도를 통해 장르의 유사도가 가장 높은 다른 영화를 추천할 수 있게 되지만,

장르만 따지고 유사도를 출력하게 된다면, 인기없고 사람들이 선호하지 않는 영화도 추천에 포함될 수 있다.

"Avatar"와 장르가 비슷한 영화 10개를 추출해보았는데, index 1652 "Dragonball Evolution"이라는 영화의 평점이 2.9점이라는 것을 볼 수 있다.

심지어 index 3494는 유사도가 가장 높은 영화로 추천되고 있지만 영화에 평점을 남긴 사람(영화를 감상한 사람)은 17명밖에 되지 않아서 다른 영화에 비해 신뢰도가 낮다.

 

추천 시스템에 사람들이 진심으로 재밌게 보고 유명한 영화를 추천하여 좀 더 세심한 추천시스템을 구현하고 싶다면,

평점(vote_average)값을 사용하여 추천의 우선순위를 변경할 수 있다.

 

하지만, 평점(vote_average)라는 데이터는 사용자들이 영화에 대한 점수를 매기는 값들의 평균이 나오는 것이므로

1, 2명이 평가한 영화에 대해서는 0.0이나 10.0과 같은 극단적인 값으로 인해 평점에 왜곡이 생길 수 있다.

단순히 평점이 높은 순으로만 추출할 경우 정확도가 떨어질 수 있다.

이 문제를 해결하기 위해 가중치가 부여된 평점을 사용하여 왜곡된 평점 데이터를 회피할 수 있도록 적용해야 한다.

가중 평점

 

  • v: 개별 영화에 평점을 투표한 횟수
  • m: 평점을 부여하기 위한 최소 투표 횟수
  • R: 개별 영화에 대한 평균 평점
  • C: 전체 영화에 대한 평균 평점

(v(vote_count), R(vote_average) 값은 TMDB 데이터셋의 속성에 들어있으며, C의 값은 전체 영화의 평균이므로 vote_average.mean()을 통해 구할 수 있다.)

m의 값이 투표 횟수에 따른 가중치를 직접 조절하는 역할을 하는 값이다.

m의 값을 높이면 평점 투표 횟수가 많은 영화에 더 많은 가중 평점을 부여하여 소수 인원이 평가한 영화보다 인기가 많은 영화의 평점을 더 신뢰하게 되는 것이다.

(m의 값은 0.6으로 조절하였고 자세한 코드는 ➡️ 깃허브)

가중 평점(weighted_vote)을 사용하여 평점이 높은 순으로 다시 나열한 영화 목록이다.

소수의 인원으로 평가된 극단적인 평점은 없다는 것을 알 수 있다.

 

이렇게 가중치가 부여된 영화목록에서 "Avatar"와 관련된 다른 영화 추천 목록 10개를 뽑아보면

사용자가 관심을 가질만한 장르를 기반으로 추천시스템을 구현할 수 있게 된다.

 

 

자세한 코드는 ➡️ github.com/enddl3224

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

 

 

 

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


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

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

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