-
콘텐츠 기반 추천 시스템 실습Python Machine Learning/추천 시스템 2021. 1. 19. 13:33
1. 데이터 SET
- TMDB 5000 영화 데이터 세트( 캐글에서 제공 )
2. 장르 속성을 이용한 영화 콘텐츠 기반 필터링
- 영화간의 유사성을 판단하는 기준이 영화를 구성하는 다양한 콘텐츠 (장르, 감독, 배우, 평점, 키워드, 영화 설명)를 기반으로 하는 방식
3. 데이터 로딩 및 가공
4803개의 래코드와 20개의 피처로 구성 콘텐츠 기반 필터링 추천 분석에 사용할 주요 칼럼만 추출한 데이터 프레임 생성 genres와 keywords가 어떤 형태로 되어있는지 확인. - "genres" 와 "keyword"는 한꺼번에 여러 개 의 값을 표현하기 위해 여러 개의 딕셔너리(dict)가 있는 형태의 문자열로 표기되어있음 -> 문자열을 분해해 개별 장르를 리스트 객체로 추출하는 가공 필요( 개별 장르 명칭 : name )
literal_eval( ) 함수 사용 - 파이썬 ast 모듈의 literal_eval( ) 함수를 이용하면 문자열을 문자열이 의미하는 list[ dict1, dict2 ] 객체로 변환가능
-> 해당 소스에서는 apply( )에 literal_eval 함수를 적용해 문자열을 객체로 변환.
-> genres 칼럼은 문자열이 아니라 실제 리스트 내부에 여러 장르 딕셔너리로 구성된 객체를 가짐.
['Action','Adventure']와 같은 장르명만 리스트 객체로 추출 - 'name'키에 해당하는 값을 추출하기 위해 apply lambda 식 이용
-> apply(lambda x : [ y['name'] for y in x]) : 리스트 내 여러 개의 딕셔너리의 'name'키에 해당하는 값을 찾아 리스트 객체로 변환해주는 역할을 수행
4. 장르 콘텐츠 유사도 측정 및 추출
- genres 칼럼을 기반으로 하는 콘텐츠 기반 필터링은 다음과 같은 단계로 구현
1. 문자열로 변환된 genres 칼럼을 count 기반으로 피처 벡터화 변환
2. genres 문자열을 피처 벡터화 행렬로 변환한 데이터 세트를 코사인 유사도를 통해 비교
3. 장르 유사도가 높은 영화 중 평점이 높은 순으로 영화 추천
countvectorizer 적용을 위해 공백문자로 word 단위가 구분되는 문자열로 변환 -리스트 객체 내의 개별 값을 연속된 문자열로 변환하려면 ('구분문자').join(리스트 객체)를 사용
-> countvectorizer로 변환해 4803개의 레코드와 276개의 개별 단어 피처로 구성된 피처 벡터 행렬 생성
- genre_sim 객체는 movies['genre_literal']를 피처 벡터화한 행렬(genre_mat)데이터의 행별 유사도 정보를 가지고 있음
movies_df를 장르 기준으로 콘텐츠 기반 필터링을 수행하려면 movies_df의 개별 레코드에 대해 가장 장르 유사도가 높 은 순으로 다른 레코드를 추출해야하며, 이를 위해 genre_sim 객체 이용
넘파이의 argsort( ) 함수를 이용 - argsort( )[ :, ::-1]을 이용하면 유사도가 높은 순으로 정리된 genre_sim 객체의 비교 행 위치 인덱스 값을 얻을 수 있음
5. 장르 콘텐츠 필터링을 이용한 영화 추천
장르 유사도에 따라 영화를 추천하는 함수 생성 find_sim_movie( ) 함수를 이용해 영화 '아이언맨'과 장르별로 유사한 영화 10개를 추천 vote_average와 vote_count를 이용해 vote_average(평점) 오름차순으로 movies_df를 정렬해서 10개 출력 - 평점은 높지만 평가 횟수가 매우 적은 영화들이 존재
-> 평점과 평가 횟수를 모두 반영할 수 있는 평가 방식이 필요
6. 평가 횟수에 대한 가중치가 부여된 평점 계산
가중 평점( Weighted Rating ) = (v/(v+m) * R + (m/(v+m)) * C
v: 개별 영화에 평점을 투표한 횟수, m : 평점을 부여하기 위한 최소 투표 횟수,
R : 개별 영화에 대한 평균 평점, C : 전체 영화에 대한 평균 평점.
기존 평점을 새로운 가중 평점으로 변경하는 함수를 생성 - 전체 투표 횟수에서 상위 60%에 해당하는 횟수를 기준으로 정한상태에서 movies_df의 apply( ) 함수의 인자로 입력해 가중 평점 계산.
새롭게 부여된 weighted_vote 평점이 높은 순으로 상위 10개의 영화를 추출 장르 유사성이 높은 영화를 top_n의 2배수만큼 후보군으로 선정한 뒤에 weighted_vote 칼럼 값이 높은 순으로 top_n만큼 추출하는 방식 => 영화 'Iron Man' 과 유사한 영화로 스타워즈, 스타트랙, X-맨 같은 영화가 추천되며, 이전보다 훨씬 나은 영화 추천.
하지만 장르만으로 영화가 전달하는 많은 요소와 분위기, 개인이 좋아하는 성향을 반영하기는 부족하며 좋아하는 배우나 감독을 보고 영화를 선택하는 경우도 많을 것이라고 예상함.
'Python Machine Learning > 추천 시스템' 카테고리의 다른 글
Surprise를 이용한 개인화 영화 추천 시스템 구축 (0) 2021.01.22 Surprise 주요 모듈 (0) 2021.01.21 추천 시스템 패키지 - Surprise (0) 2021.01.21 아이템 기반 최근접 이웃 협업 필터링 추천 시스템 실습 (0) 2021.01.20