Python을 사용하여 나만의 영화 추천 시스템 만들기
게시 됨: 2021-03-09Netflix가 귀하의 관심사와 일치하는 영화를 어떻게 제안하는지 궁금하십니까? 아니면 사용자에게도 그러한 제안을 할 수 있는 시스템을 구축하고 싶습니까?
대답이 '예'였다면 이 기사에서 Python을 사용하여 영화 추천 시스템을 구축하는 방법을 배울 것이기 때문에 제대로 찾아오셨습니다.
그러나 '어떻게'에 대한 논의를 시작하기 전에 '무엇'에 대해 잘 알고 있어야 합니다.
목차
추천 시스템: 무엇입니까?
추천 시스템은 일상 생활에서 매우 중요한 부분이 되었습니다. Amazon 및 Flipkart와 같은 온라인 소매업체에서 YouTube 및 Facebook과 같은 소셜 미디어 플랫폼에 이르기까지 모든 주요 디지털 회사는 추천 시스템을 사용하여 고객에게 개인화된 사용자 경험을 제공합니다.
일상 생활에서 추천 시스템의 몇 가지 예는 다음과 같습니다.
- 제품을 구매할 때 Amazon에서 받는 제안은 추천 시스템의 결과입니다.
- YouTube는 추천 시스템을 사용하여 취향에 맞는 동영상을 제안합니다.
- Netflix에는 사용자의 관심사에 따라 프로그램과 영화를 추천하는 유명한 추천 시스템이 있습니다.
추천 시스템은 데이터를 사용하여 사용자에게 제품을 제안합니다. 이 데이터는 사용자가 입력한 관심사, 이력 등에 관한 것일 수 있습니다. 머신 러닝과 AI를 연구하고 있다면 추천 시스템이 점점 대중화되고 발전함에 따라 반드시 연구해야 합니다.
추천 시스템의 유형
추천 시스템에는 두 가지 유형이 있습니다.
1. 협업 추천 시스템
협업 추천 시스템은 해당 항목에 대한 유사한 사용자의 유사성에 따라 항목을 제안합니다. 비슷한 관심사와 취향을 가진 사용자를 그룹화하여 그에 따라 제품을 제안합니다.
예를 들어, 귀하와 다른 한 명의 사용자가 Sholay를 좋아한다고 가정합니다. 이제 Sholay를보고 좋아한 후에 다른 사용자는 Golmaal을 좋아했습니다. 당신과 다른 사용자가 비슷한 관심사를 가지고 있기 때문에 추천 시스템은 이 데이터를 기반으로 당신에게 골말 시청을 제안할 것입니다. 협업 필터링입니다.
2. 콘텐츠 기반 추천 시스템
콘텐츠 기반 추천 시스템은 사용자로부터 받은 데이터를 기반으로 항목을 제안합니다. 명시적 데이터('좋아요', '공유' 등) 또는 암시적 데이터(시청 기록)를 기반으로 할 수 있습니다. 추천 시스템은 이 데이터를 사용하여 사용자별 프로필을 만들고 해당 프로필을 기반으로 항목을 제안합니다.
기본 영화 추천 시스템 구축
이제 추천 시스템의 기본 사항을 다루었으므로 영화 추천 시스템 구축을 시작해 보겠습니다.
전체 MovieLens 데이터 세트 를 사용하여 Python 기반 영화 추천 시스템 구축을 시작할 수 있습니다 . 이 데이터 세트에는 45,000개 이상의 영화에 적용된 2,600만 개 이상의 등급, 750,000개 태그 애플리케이션이 포함되어 있습니다. 1,200만 개 이상의 관련성 점수와 함께 이 데이터세트에 있는 태그 게놈 데이터입니다.
기본 영화 추천 시스템을 만들기 위해 전체 데이터 세트를 사용하고 있습니다. 그러나 이 프로젝트에 더 작은 데이터 세트를 자유롭게 사용할 수 있습니다. 먼저 필요한 모든 라이브러리를 가져와야 합니다.
Python 기반의 기본적인 영화 추천 시스템은 영화의 인기도와 장르에 따라 영화를 추천해준다. 이 시스템은 평단의 호평을 받은 인기 영화가 일반 관객에게 호평을 받을 확률이 높다는 개념에서 작동합니다. 이러한 영화 추천 시스템은 개인화된 제안을 제공하지 않는다는 점을 염두에 두십시오.
이를 구현하기 위해 인기도와 등급에 따라 영화를 정렬하고 장르 인수를 전달하여 장르의 최고 영화를 가져옵니다.
입력
md = pd. read_csv('../input/movies_metadata.csv')
md.head()
산출
성인 | 속해_to_collection | 예산 | 장르 | 동영상 | ID | imdb_id | original_title | 개요 | 수익 | 제목 | |||||||
거짓 | ('id'L 10194, 'name': '토이 스토리 컬렉션') | 30000000 | [{'id': 16, 'name': '애니메이션'}… | 거짓 | 862 | tt0114709 | 토이 스토리 | 우디가 이끄는 앤디의 장난감은 행복하게... | 373554033 | 토이 스토리 | |||||||
1 | 거짓 | 난 | 65000000 | {{'id': 12, 'name': '모험'}… | 거짓 | 8844 | tt0113497 | 쥬만지 | 형제 주디와 피터가 ... | 262797249 | 쥬만지 | ||||||
2 | 거짓 | ('id': 119050, 'name': '심술쟁이 노인네') | 0 | {{'id': 10749, 'name': '로맨스'}… | 거짓 | 15602 | tt0113228 | 심술쟁이 노인들 | 가족 결혼식은 고대를 재조명… | 0 | 심술궂은 노인들 | ||||||
삼 | 거짓 | 난 | 16000000 | {{'id': 35, 'name': '코미디'}… | 거짓 | 31357 | tt0114885 | 내쉬기를 기다리며 | 속고, 학대하고, 밟고… | 81452156 | 내쉬기를 기다리며 |
입력
md['장르'] = md['장르'].fillna('[]').apply(literal_eval).apply(lambda x: [i['이름'] for i in x] if isinstance(x, list ) 또 다른 [])
차트의 공식
최고의 영화 차트를 만들기 위해 TMDB 등급을 사용했습니다. IMDB의 가중치 평가 공식을 사용하여 다음과 같은 차트를 생성합니다.
가중 등급(WR) = (iaouaouaouaouaou)
여기서 v는 영화가 얻은 표 수, m은 영화가 차트에 올려야 하는 최소 표 수, R은 영화의 평균 평점, C는 전체 보고서에 대한 평균 투표 수입니다. .
차트 작성
이제 데이터 세트와 공식이 준비되었으므로 차트 작성을 시작할 수 있습니다. 최소 95% 득표를 한 영화만 차트에 추가합니다. 상위 250개 차트를 만드는 것으로 시작하겠습니다.
입력
vote_counts = md[md['vote_count'].notnull()]['vote_count'].astype('int')
vote_average = md[md['vote_average'].notnull()]['vote_average'].astype('int')
C = vote_averages.mean()
씨
산출
5.244896612406511
입력
m = vote_counts.quantile(0.95)
중
산출
434.0
입력
md['연도'] = pd.to_datetime(md['release_date'], errors='coerce').apply(lambda x: str(x).split('-')[0] if x != np. nan else np.nan)
입력
자격이 있는 = md[(md['vote_count'] >= m) & (md['vote_count'].notnull()) & (md['vote_average'].notnull())][['제목', '연도 ', 'vote_count', 'vote_average', '인기', '장르']]
적격['vote_count'] = 적격['vote_count'].astype('int')
적격['vote_average'] = 적격['vote_average'].astype('int')
자격을 갖춘.모양
산출
(2274, 6)
보시다시피, 영화가 차트에 오르려면 최소 434표가 있어야 합니다. 영화가 우리 차트에 들어가야 하는 평균 평점이 5.24라는 것을 눈치채셨을 것입니다.
입력
def weighted_rating(x):
v = x['투표 수']
R = x['투표 평균']
반환 (v/(v+m) * R) + (m/(m+v) * C)
입력
자격이 있는['wr'] = 자격이 있는.apply(weighted_rating, 축=1)
입력
한정된 = 한정된.sort_values('wr', 오름차순=False).head(250)
이 모든 것이 준비되면 차트를 작성해 보겠습니다.
전체 최고의 영화
입력
자격을 갖춘.head(15)
산출
제목 | 년도 | 투표 수 | 투표 평균 | 인기 | 장르 | 워 | |
15480 | 처음 | 2010년 | 14075 | 8 | 29.1081 | [액션,스릴러,SF,미스터리,A… | 7.917588 |
12481 | 다크 나이트 | 2008년 | 12269 | 8 | 123.167 | [드라마,액션,범죄,스릴러] | 7.905871 |
22879 | 인터스텔라 | 2014년 | 11187 | 8 | 32.2135 | [모험, 드라마, SF] | 7.897107 |
2843 | 격투 클럽 | 1999년 | 9678 | 8 | 63.8696 | [드라마] | 7.881753 |
4863 | 반지의 제왕: 반지 원정대 | 2001년 | 8892 | 8 | 32.0707 | [어드벤처, 판타지, 액션] | 7.871787 |
292 | 펄프 픽션 | 1994년 | 8670 | 8 | 140.95 | [스릴러, 범죄] | 7.868660 |
314 | 쇼생크 탈출 | 1994년 | 8358 | 8 | 51.6454 | [드라마, 범죄] | 7.864000 |
7000 | 반지의 제왕: 왕의 귀환 | 2003년 | 8226 | 8 | 29.3244 | [어드벤처, 판타지, 액션] | 7.861927 |
351 | 포레스트 검프 | 1994년 | 8147 | 8 | 48.3072 | [코미디, 드라마, 로맨스] | 7.860656 |
5814 | 반지의 제왕: 두 개의 탑 | 2002년 | 7641 | 8 | 29.4235 | [어드벤처, 판타지, 액션] | 7.851924 |
256 | 스타 워즈 | 1977년 | 6778 | 8 | 42.1497 | [어드벤처,액션,SF] | 7.834205 |
1225 | 미래로 귀환 | 1985년 | 6239 | 8 | 25.7785 | [모험,코미디,SF,가족] | 7.820813 |
834 | 대부 | 1972년 | 6024 | 8 | 41.1093 | [드라마, 범죄] | 7.814847 |
1154 | 제국의 역습 | 1980년 | 5998 | 8 | 19.471 | [어드벤처,액션,SF] | 7.814099 |
46 | 세븐 | 1995년 | 5915 | 8 | 18.4574 | [범죄, 미스터리, 스릴러] |
짜잔, 파이썬 기반의 기본적인 영화 추천 시스템을 만들었습니다!
이제 더 정확할 수 있도록 추천 시스템의 제안을 장르 기반으로 좁힐 것입니다. 결국 모든 사람이 대부를 좋아할 필요는 없습니다.
장르 좁히기
따라서 이제 더 장르별 추천 시스템을 수정하겠습니다.
입력
s = md.apply(lambda x: pd.Series(x['genres']),axis=1).stack().reset_index(level=1, drop=True)
s.name = '장르'
gen_md = md.drop('장르', 축=1).join(s)
입력
def build_chart(장르, 백분위수=0.85):
df = gen_md[gen_md['장르'] == 장르]
vote_counts = df[df['vote_count'].notnull()]['vote_count'].astype('int')
투표 평균 = df[df['vote_average'].notnull()]['vote_average'].astype('int')
C = vote_averages.mean()
m = vote_counts.quantile(백분위수)
자격이 있는 = df[(df['vote_count'] >= m) & (df['vote_count'].notnull()) & (df['vote_average'].notnull())][['title', '연도 ', 'vote_count', 'vote_average', '인기']]
적격['vote_count'] = 적격['vote_count'].astype('int')
적격['vote_average'] = 적격['vote_average'].astype('int')
자격이 있는['wr'] = 자격이 있는.apply(람다 x: (x['vote_count']/(x['vote_count']+m) * x['vote_average']) + (m/(m+x[' 투표 수']) * C), 축=1)
한정된 = 한정된.sort_values('wr', 오름차순=False).head(250)
반환 자격
이제 로맨스 장르의 영화를 분류하고 최고의 영화를 추천하는 추천 시스템을 만들었습니다. 우리는 로맨스 장르가 이전 차트에서 많이 나타나지 않았기 때문에 선택했습니다.
로맨스 인기 영화
입력
build_chart('로맨스').head(15)
산출
제목 | 년도 | 투표 수 | 투표 평균 | 인기 | 워 | |
10309 | 딜왈레 둘하니아 르 자옌게 | 1995년 | 661 | 9 | 34.457 | 8.565285 |
351 | 포레스트 검프 | 1994년 | 8147 | 8 | 48.3072 | 7.971357 |
876 | 선회 | 1958년 | 1162 | 8 | 2082년 18월 18일 | 7.811667 |
40251 | 당신의 이름. | 2016년 | 1030 | 8 | 34.461252 | 7.789489 |
883 | 일부는 뜨거운 것을 좋아합니다. | 1959년 | 835 | 8 | 11.8451 | 7.745154 |
1132 | 시네마 파라디소 | 1988년 | 834 | 8 | 14.177 | 7.744878 |
19901년 | 페이퍼맨 | 2012년 | 734 | 8 | 7.19863 | 7.713951 |
37863 | 싱 스트리트 | 2016년 | 669 | 8 | 10.672862 | 7.689483 |
882 | 아파트 | 1960년 | 498 | 8 | 11.9943 | 7.599317 |
38718 | 시녀 | 2016년 | 453 | 8 | 16.727405 | 7.566166 |
3189 | 도시 불빛 | 1931년 | 444 | 8 | 10.8915 | 7.558867 |
24886 | 그가 보이는 방식 | 2014년 | 262 | 8 | 5.71127 | 7.331363 |
45437 | 심장 박동에 | 2017년 | 146 | 8 | 20.82178 | 7.003959 |
1639년 | 거대한 | 1997년 | 7770 | 7 | 26.8891 | 6.981546 |
19731 | 실버라이닝 플레이북 | 2012년 | 4840 | 7 | 14.4881 | 6.970581 |
이제 선택한 장르에 따라 최고의 영화를 추천하는 영화 추천 시스템이 생겼습니다. 액션, 드라마, 서스펜스 등과 같은 다른 장르에서도 이 추천 시스템을 테스트하는 것이 좋습니다. 추천 시스템이 아래 댓글 섹션에서 제안하는 좋아하는 장르의 상위 3개 영화를 공유하십시오.
영화 추천 시스템에 대해 자세히 알아보기
지금쯤 눈치채셨겠지만 Python 기반의 영화 추천 시스템을 구축하는 것은 매우 간단합니다. 데이터 과학에 대한 약간의 지식과 완전한 기능의 추천 시스템을 만들기 위한 약간의 노력만 있으면 됩니다.
그러나 더 고급 추천 시스템을 구축하려면 어떻게 해야 합니까? 대기업에서 사용을 고려할 수 있는 추천 시스템을 만들고 싶다면 어떻게 하시겠습니까?
추천 시스템 및 데이터 과학에 대해 자세히 알아보려면 데이터 과학 과정을 수강하는 것이 좋습니다. 과정을 통해 데이터 과학 및 기계 학습의 모든 기본 및 고급 개념을 배우게 됩니다. 또한, 의심과 혼란을 피하기 위해 과정 전반에 걸쳐 안내할 업계 전문가로부터 공부하게 됩니다.
upGrad에서는 여러 데이터 과학 및 기계 학습 과정을 제공합니다. 관심 분야에 따라 다음 중에서 원하는 사람을 선택할 수 있습니다.
- 데이터 과학 PG 디플로마
- 데이터 과학 과학 석사
- 데이터 과학 PG 인증
- 기계 학습 및 AI PG 디플로마
- 기계 학습 및 AI 과학 석사
이러한 과정 외에도 데이터 과학 및 기계 학습에 대한 다른 많은 과정을 제공합니다. 꼭 확인하세요!
마지막 생각들
이제 영화 추천 시스템을 구축하는 방법을 알게 되었습니다. 시스템을 만든 후에는 다른 사람들과 공유하고 진행 상황을 보여주십시오. 추천 시스템은 다양한 적용 범위를 가지고 있으므로 이에 대해 배우면 분명히 업계에서 우위를 점할 수 있습니다.
협업 필터링은 사용자의 선호도를 기반으로 모델 구축에 접근하는 일종의 추천 시스템입니다. 사용자의 이력은 협업 필터링을 위한 데이터 세트 역할을 합니다. 협업 필터링에는 아래에 언급된 2가지 유형이 있습니다. 콘텐츠 기반 필터링은 사용자로부터 데이터를 수집하고 그에 따라 항목을 제안합니다. 장점과 단점은 다음과 같습니다. 협업 필터링 알고리즘은 많은 인기 있는 애플리케이션의 주요 구동 알고리즘이 되고 있습니다. 점점 더 많은 기업이 풍부한 개인화된 콘텐츠를 제공하는 데 집중하고 있습니다. 예를 들어, 많은 전자 상거래 웹사이트에서 이 메시지를 본 적이 있을 것 입니다.협업 필터링이란 무엇이며 유형은 무엇입니까?
1. 사용자 기반 협업 필터링: 이러한 유형의 협업 필터링 뒤에 있는 아이디어는 선호도에 대해 사용자를 선택하고 "A"라고 가정하고 비슷한 선호도를 가진 다른 사용자를 찾은 다음 "A"에 해당 사용자의 선호도를 제공하는 것입니다. 아직 만나지 못했습니다.
아이템 기반 협업 필터링 : 여기에서는 취향이 비슷한 사용자를 찾는 대신 A의 취향과 비슷한 영화를 찾아보고 아직 보지 않은 영화를 추천합니다. 콘텐츠 기반 필터링의 장점과 단점은 무엇입니까?
장점
1. 협업 필터링과 달리 이 모델은 기본 사용자 자체에서 제안을 가져오기 때문에 유사한 선호도를 가진 다른 사용자에 대한 데이터를 수집할 필요가 없습니다.
2. 모델은 당신의 선호도에 따라 몇몇 다른 사람들만 본 최고의 영화를 추천할 수 있습니다.
단점
1. 이 기술은 특정 영역에 대한 많은 정보를 필요로 하므로 제공하는 기능의 품질이 손으로 만든 기능과 거의 동일합니다.
2. 기존 사용자의 관심에 따라 작동하기 때문에 영화 추천 기능이 제한됩니다. 어떤 인기 애플리케이션이 협업 필터링 알고리즘을 사용합니까?
다음은 전 세계적으로 인기 있는 사용자 기반을 가진 일부 응용 프로그램입니다.
1. YouTube는 다른 강력한 알고리즘과 함께 이 알고리즘을 사용하여 홈페이지에 추천 동영상을 제공합니다.
2. Amazon, Flipkart 및 Myntra와 같은 전자 상거래 웹사이트도 이 알고리즘을 사용하여 제품 추천을 제공합니다.
3. 비디오 스트리밍 플랫폼은 사용자 평점, 평균 평점 및 관련 콘텐츠를 사용하여 개인화된 제안을 제공하는 가장 큰 예입니다.