영화 추천 알고리즘 | 영화 추천 인공지능 만들기 – Python 상위 234개 답변

당신은 주제를 찾고 있습니까 “영화 추천 알고리즘 – 영화 추천 인공지능 만들기 – Python“? 다음 카테고리의 웹사이트 https://you.experience-porthcawl.com 에서 귀하의 모든 질문에 답변해 드립니다: https://you.experience-porthcawl.com/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 빵형의 개발도상국 이(가) 작성한 기사에는 조회수 25,157회 및 좋아요 582개 개의 좋아요가 있습니다.

영화 타이틀을 기준으로 배우, 장르, 국가, 시대, 연령대 등 수백 개의 영화 특성을 분석해 영화 프로파일을 생성하고, 타깃 사용자가 좋아한 영화를 바탕으로 사용자 프로파일을 도출합니다. 그리고 영화 프로파일과 사용자 프로파일을 비교해서 사용자 선호 영화추천하는 방식입니다.

Table of Contents

영화 추천 알고리즘 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 영화 추천 인공지능 만들기 – Python – 영화 추천 알고리즘 주제에 대한 세부정보를 참조하세요

정말 간단한 알고리즘으로 왓챠와 같은 영화 추천 엔진을 만들어봅시다!
피어슨 상관관계 Pearson correlation
Source code(Github): https://github.com/kairess/movie_recommendation_engine
Dependencies:
– Python
– numpy
– pandas
Dataset
– The Movies Dataset: https://www.kaggle.com/rounakbanik/the-movies-dataset
사업 및 개발문의: [email protected]
빵형의 개발도상국 후원: https://toon.at/donate/helloworld

영화 추천 알고리즘 주제에 대한 자세한 내용은 여기를 참조하세요.

영화추천 알고리즘(Movie-Recommender) 파이썬으로 구현해 …

구현 방식. 콘텐츠 기반 필터링(content based filtering): 사용자가 특정 아이템을 선호하는 경우 그 아이템과 비슷한 콘텐츠를 가진 다른 아이템을 추천 …

+ 여기에 더 보기

Source: dkswnkk.tistory.com

Date Published: 9/25/2021

View: 6527

넷플릭스와 왓챠 영화추천 알고리즘 – 알아야 산다 – Tistory

영화 추천 알고리즘은 협업 필터링(Collaborative Filtering)과 콘텐츠 기반 필터링(Content-based Filtering)의 두 가지 방법으로 나눌 수 있습니다.

+ 더 읽기

Source: bumi1004.tistory.com

Date Published: 5/3/2022

View: 3030

딥 러닝 – 영화 추천 시스템(1) – velog

추천 시스템 : 특정 사용자가 관심을 가질만한 정보 (영화, 음악, 책, 뉴스, 이미지, 웹 페이지 등)를 추천하는 것현재는 많은 분야에 적용되어 있다.

+ 여기에 자세히 보기

Source: velog.io

Date Published: 6/9/2021

View: 2619

[python] 영화 추천 시스템

이후 K-means Clustering 알고리즘을 통해 사용자가 입력한 선호 영화들의 cluster들을 결정한다. 앞서 A-priori 알고리즘을 통해 추천된 영화들 중, 입력 …

+ 더 읽기

Source: ddongwon.tistory.com

Date Published: 1/4/2021

View: 8119

[추천시스템] 넷플릭스 영화 추천 시스템 구현 파이썬 코드

Kdd 유사도 기반 영화 추천 알고리즘. 출처: 멀티캠퍼스_빅데이터AI설계 박길식 강사님 PPT. #kdd 유사도 함수 from math import sqrt def …

+ 여기에 표시

Source: diane-space.tistory.com

Date Published: 3/11/2021

View: 4000

영화 추천 시스템(Movie Recommender Systems) – Kaggle

영화 데이터 분석 및 추천 시스템에 관한 Springboard Capstone 프로젝트의 두 … 이 노트북에서는 몇 가지 추천 알고리즘(콘텐츠 기반, 인기도 및 협업 필터링)을 …

+ 여기에 보기

Source: www.kaggle.com

Date Published: 8/7/2022

View: 6247

혼합 필터링 기반의 영화 추천 시스템에 관한 연구 – KoreaScience

본 논문에서는 협업 필터링 기법과 내용 기반의 필터. 링 기법을 혼합하여 Cold-Start 문제를 해결하고 추천. 시스템에 영향이 될 수 있는 주요 알고리즘을 비교하여.

+ 더 읽기

Source: www.koreascience.or.kr

Date Published: 7/28/2021

View: 7704

[movie recomendation] 알고리즘에 따른 영화 추천 시스템 구현

power bi 설명. – 1 page. Collaborative Filtering(사용자가 본 영화에 따라 알고리즘을 사용하여 영화 추천)의 추천 …

+ 자세한 내용은 여기를 클릭하십시오

Source: continuous-development.tistory.com

Date Published: 7/10/2021

View: 9021

주제와 관련된 이미지 영화 추천 알고리즘

주제와 관련된 더 많은 사진을 참조하십시오 영화 추천 인공지능 만들기 – Python. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

영화 추천 인공지능 만들기 - Python
영화 추천 인공지능 만들기 – Python

주제에 대한 기사 평가 영화 추천 알고리즘

  • Author: 빵형의 개발도상국
  • Views: 조회수 25,157회
  • Likes: 좋아요 582개
  • Date Published: 2019. 4. 4.
  • Video Url link: https://www.youtube.com/watch?v=mLwMe4KUZz8

넷플릭스의 영화 추천 알고리즘

다양한 알고리즘을 복합적으로 사용합니다.

<넷플릭스 인사이트>에 소개된 내용을 바탕으로 정리했습니다.

넷플릭스 회원은 10~20개 타이틀 검토 후

영화를 결정하지 못하면 60~90초 후에 흥미를 잃는다.

OTT 서비스 경쟁이 치열해지면서 양질의 콘텐츠를 확보하는 것과 더불어 고객을 자주 방문하게 만들고 최대한 오래 붙잡아 두는 게 OTT 플랫폼 성공의 핵심 요소입니다. 콘텐츠 보유 정도가 플랫폼별로 비슷하다고 했을 때 보유 타이틀을 얼마나 잘 활용하는지가 핵심 경쟁력이 될 수 있는데요. 넷플릭스는 DVD 대여 사업을 했을 때부터 축적된 노하우를 바탕으로 고객이 선호하는 타이틀을 기가 막히게 찾아줍니다.

넷플릭스는 고객의 70~80%가 추천 콘텐츠를 시청한다고 합니다. 이번 글에서는 넷플릭스의 추천 알고리즘을 간단히 소개해보겠습니다. 전문적으로 들어가면 너무 깊어서 딱 읽기 좋은 정도로 정리했습니다.

1. 유사 사용자 기반 알고리즘

위 이미지를 보면 A, B, C 유저가 있습니다. 우리가 영화를 추천해야 할 타깃 유저는 C인데요.

사용자 기반 알고리즘은 C와 취향이 비슷한 유사 사용자를 찾아내 영화를 추천해주는 방식입니다.

A는 킹덤, 실미도, 설국열차, 국제시장을 시청했고.

B는 실미도만 시청했고

C는 실미도, 국제시장을 시청했습니다.

C와 중복되는 영화를 시청한 유저는 A입니다.

그래서 A와 C를 유사 사용자로 묶고, A는 시청했는데 C는 시청하지 않은 킹덤과 설국열차를 추천합니다.

2. 유사 아이템 기반 알고리즘

아이템 기반 알고리즘은 영화와 영화 간의 시청기록을 파악해서 유사한 아이템을 추천해주는 방식입니다.

위 이미지에서 타깃 사용자 C의 시청기록을 제외하고, A와 B의 시청기록을 보겠습니다.

A는 킹덤, 설국열차, 국제시장을 시청했고,

B는 킹덤, 국제시장을 시청했습니다.

A와 B의 시청기록을 바탕으로 킹덤과 국제시장을 유사 아이템으로 묶을 수 있고,

국제시장을 시청한 타깃 유저 C에게는 아직 시청하지 않은 킹덤을 추천합니다.

지금 소개한 사용자&아이템 기반 알고리즘은 이미 많은 플랫폼에서 사용하고 있습니다. 유사도 계산이 간단하고 예측 평점을 구하기 쉽다는 장점이 있지만 몇 가지 문제점도 있습니다.

– 콜드 스타트 : 새로운 유저나, 새로운 아이템이 추가되었을 때 유사도를 계산할 수 있는 데이터가 부족해 정확한 추천을 하기가 어렵습니다.

– 계산량 : 사용자와 유저가 추가될 때마다 계산량이 많아져서 부하가 증가됩니다. 넷플릭스 유저는 4억 명 정도라고 하는데요. 유저 1명, 타이틀 1개 추가될 때마다 계산량은 어마어마하게 늘어나게 됩니다.

– 롱테일 : 일반 사용자들은 소수의 인기 항목에만 관심을 보이기 때문에 관심이 적은 비인기 항목에는 추천 정보가 부족합니다.

그래서 넷플릭스는 위 2가지 방식 외에 2가지 방식을 더 사용합니다.

3. 잠재 모델 기반 알고리즘

잠재 모델 기반 알고리즘은 항목 간 유사성을 단순하게 비교하는 방식이 아니라 사용자와 아이템에 내재된 잠재 모델의 패턴을 이용하는 방법입니다. 예를 들어 킹덤을 좋아하는 사용자는 배우 주지훈을 좋아해서 일수도 있고, 좀비물을 좋아해서일 수도 있고, OST를 좋아해서 일수도 있습니다.

그래서 특정 기준을 바탕으로 행과 열을 분해해서 예측 평점을 구합니다.

위 이미지는 <장르>를 기준으로 행과 열을 분해한 예시입니다.

킹덤, 이태원 클라쓰, 설국열차의 장르 비중은 넷플릭스가 신규 콘텐츠를 생성할 때 콘텐츠 전문가가 직접 시청하고 메타 데이터에 등록합니다. 킹덤의 경우 로맨스 1점, 액션이 3점이다라고 미리 지표화를 해놓는 거죠.

그리고 사용자의 시청 데이터를 바탕으로 사용자별 장르 선호도를 값으로 산출합니다. B의 경우 로맨스 선호도와 액션 선호도가 각각 1점입니다. 이 데이터를 바탕으로 아직 시청하지 않은 이태원 클라쓰와 설국열차의 예측 평점을 4점, 4점으로 쉽게 구할 수 있습니다.

잠재 모델 기반 알고리즘은 차원이나 사이즈가 매우 작아서 스토리지도 크게 차지하지 않는 장점이 있습니다.

4. 콘텐츠 기반 알고리즘

위에서 소개한 사용자 기반, 아이템 기반, 잠재 모델 기반 알고리즘은 사용자와 아이템 사이의 연관성 파악이 분석 대상이지만 콘텐츠 기반 알고리즘은 사용자와 아이템간의 정보가 필요하지 않습니다.

영화 타이틀을 기준으로 배우, 장르, 국가, 시대, 연령대 등 수백 개의 영화 특성을 분석해 영화 프로파일을 생성하고, 타깃 사용자가 좋아한 영화를 바탕으로 사용자 프로파일을 도출합니다. 그리고 영화 프로파일과 사용자 프로파일을 비교해서 사용자 선호 영화를 추천하는 방식입니다.

네, 여기까지 ①사용자 기반 알고리즘 ②아이템 기반 알고리즘 ③잠재 모델 기반 알고리즘 ④콘텐츠 기반 알고리즘을 살펴봤는데요.

①②번은 유사도 계산이 간단하고 예측 평점을 구하기 쉬운 반면에 콜드 스타트, 계산량, 롱테일 이슈가 있습니다. 그래서 데이터가 적어도 추천이 가능한 ③④번 알고리즘이 등장했고 넷플릭스는 ①②③④번을 포함한 다양한 알고리즘을 mix 한 하이브리드 추천 시스템을 적용하고 있습니다.

현재 넷플릭스에는 2,000여 개의 취향 그룹이 있고 이 취향 그룹은 계속해서 업데이트된다고 합니다.

또한 넷플릭스가 영화를 추천하면서 알게된 사실은 2016년 이전까지는 사용자의 국가/지역에 따라 선호하는 영화가 다를 것이라고 예상하고 국가별 사용자별 다른 콘텐츠를 추천했지만 실제 연구 결과 그렇지 않다는 사실을 발견했고 130개 국가로 진출한 이후부터는 국가/지역에 따른 추천 시스템은 폐지하고 취향 그룹에 따른 추천 시스템을 사용하고 있습니다.

1점~5점으로 영화를 평가하는 별점 평가 시스템도 폐지했습니다. 배경은 유명 평론가나 지인이 높은 점수를 주었을 때 내가 생각하는 별점을 주지 않고 제삼자의 관점에서 객관적으로 영화 품질을 평가해 오차가 발생한다는 점을 문제점으로 인식했고 이를 대체하기 위해 좋아요, 싫어요 두 가지 기준으로 평가제도를 개편했습니다. 평가제도 개편 후 평가 활동은 두 배 이상 늘었고 현재는 고객 시청기록과 좋아요, 싫어요 평가를 바탕으로 영화를 추천하고 사용자가 얼마나 좋아할지 예측하는 매치 지수를 숫자로 보여주고 있습니다.

네, 여기까지 <넷플릭스 인사이트> 도서에 소개된 내용을 바탕으로 추천 알고리즘을 간단히 정리해봤습니다.

책에는 훨씬 더 방대한 내용이 있으니 관심 있는 분들은 꼭 한 번 읽어보시길 추천합니다.

저는 요즘 넷플릭스 CEO가 출간한 <규칙 없음>이라는 책을 읽고 있는데요. 이 책도 흥미롭고 재밌습니다. 스타트업 경영진, HR팀에서 보시기를 추천드립니다 ^^

넷플릭스 관련 도서 링크

넷플릭스 인사이트

규칙 없음

파워풀

영화추천 알고리즘(Movie-Recommender) 파이썬으로 구현해보기

728×90

참고한 블로그: https://lsjsj92.tistory.com/563

추천 알고리즘의 종류와 의미에 대해 알고 싶다면?

목차

구현 방식

콘텐츠 기반 필터링(content based filtering): 사용자가 특정 아이템을 선호하는 경우 그 아이템과 비슷한 콘텐츠를 가진 다른 아이템을 추천해주는 단순한 방식을 이용하여 구현하였다.

ex) 한 사용자가 영화 A에 높은 점수를 주었는데, 그 영화가 판타지 영화이고 B라는 감독이면 B감독의 다른 판타지 영화를 추천

소스 로직

movieData에 존재하는 영화의 제목 하나를 정확히 입력한다.

영화 제목을 입력받으면 그 제목의 index를 뽑아낸다.

코사인 유사도 중 영화 제목 인덱스에 해당하는 값에서 추천 개수만큼 뽑아낸다. (위 코드에서는 10)

imdb weighted rating을 적용한 추천점수 기반으로 정렬한다. (해당 방식은 소스코드에 주석으로 기재하였다.)

추천 점수를 기반으로 추천하는 영화를 출력한다.

movieData는 아래의 경로에서 얻을 수 있다.

소스

”’ #참고: https://lsjsj92.tistory.com/563, https://github.com/lsjsj92/recommender_system_with_Python 추천 시스템에는 콘텐츠 기반 필터링(content based filtering)과 협력 필터링(collaborative filtering)이 있다. 콘텐츠 기반 필터링: 사용자가 특정 아이템을 선호하는 경우 그 아이템과 비슷한 콘텐츠를 가진 다른 아이템을 추천해주는 단순한 방식. ex) 사용자 A가 영화1 에 높은 점수를 주었는데 그 영화1이 판타지영화이며 ‘안주형’ 이라는 감독이라면 ‘안주형’ 감독의 다른 판타지 영화를 추천해주는 방식 협력 필터링: 최근접 이웃 기반(nearest neighbor based collaborative filtering)과 잠재요인(latent factor based collaborative filtering) 방식이 있다 협력 필터링은 사용자가 아이템에 매긴 평점, 상품구매 이력 등의 사용자 행동양식(user behavior)를 기반으로 추천 해주는 것이다. 1.이 중 최근접 이웃 기반은 사용자-아이템 행렬에서 사용자가 아직 평가하지 않은 아이템을 예측하는 것이 목표이다. 2. 잠재요인 기반은 아직도 많이 사용되는 방법으로써 행렬분해(matrix factorization)을 기반하여 사용한다. 사용자-아이템 행렬을 ‘사용자-잠재요인’, ‘아이템-잠재요인’ 행렬로 분해하여 사용하며, 이 행렬테이터를 이용해 ‘잠재 요인’을 찾아내는데 ‘저장 공간 절약’이 우수 하기 때문에 공간을 매우 효율적으로 사용할 수 있다. 아래 코드는 “콘텐츠 기반 필터링(content based filtering)” 으로 구현한 코드이다. ”’ import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from numpy import array from ast import literal_eval from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity pd.set_option(‘display.max_rows’, 100) # 행을 최대 100개까지 출력 pd.set_option(‘display.max_columns’, 100) # 열을 최대 100개 까지 출력 pd.set_option(‘display.width’, 1000) #출력 창 넓이 설정 data=pd.read_csv(‘tmdb_5000_movies.csv’,encoding=’euc-kr’) #영화 정보가 담긴 엑셀파일을 불러온다 #데이터 전처리 data=data[[‘영화번호’,’제목’,’장르’,’평점’,’평점투표 수’,’인기도’,’키워드’]] #사용할 데이터를 뽑아온다 ”’ 투표수가 많을 수록 많은 사람들이 평가를 했기 때문에 투표 수가 낮을 수 밖에 없다. 이러한 불공정을 처리하기 위해 weighed rating 방법을 이용한다. 참고: https://www.quora.com/How-does-IMDbs-rating-system-work R: 개별 영화 평점 v: 개별 영화에 평점을 투표한 횟수 m: 순위안에 들어야 하는 최소 투표 (정하기 나름) c: 전체 영화에 대한 평균 평점 투표수의 상위 90프로 이상이면 500위 안으로 들어오게 된다. 이 코드에서는 m=500이라고 가정했다 ”’ m=data[‘평점투표 수’].quantile(0.9) data=data.loc[data[‘평점투표 수’]>=m] C=data[‘평점’].mean() #평점의 평균을 구한다 def weighted_rating(x,m=m,C=C): v=x[‘평점투표 수’] R=x[‘평점’] return (v/(v+m)*R)+(m/(m+v)*C) data[‘추천점수’]=data.apply(weighted_rating,axis=1) data[‘장르’]=data[‘장르’].apply(literal_eval) #list와와 dictionary 형태로 변경 data[‘키워드’]=data[‘키워드’].apply(literal_eval) data[‘장르’]=data[‘장르’].apply(lambda x : [d[‘name’] for d in x]).apply(lambda x: ” “.join(x)) # dict 형태 -> list 형태 -> 띄어쓰기로 이루어진 str로 변경 data[‘키워드’]=data[‘키워드’].apply(lambda x : [d[‘name’] for d in x]).apply(lambda x: ” “.join(x)) count_vector=CountVectorizer(ngram_range=(1,3)) c_vector_genres=count_vector.fit_transform(data[‘장르’]) gerne_c_sim=cosine_similarity(c_vector_genres,c_vector_genres).argsort()[:,::-1] #코사인 유사도를 구한 벡터를 미리 저장 def get_recommed_movie_list(df,movie_title,top=30): #특정영화와 비슷한 영화를 추천해주는 함수 target_movie_index=df[df[‘제목’]==movie_title].index.values #특정 영화와 비슷한 영화를 추천해야 하기 때문에 ‘특정 영화’ 정보를 뽑아내는 함수 sim_index=gerne_c_sim[target_movie_index,:top].reshape(-1) # 코사인 유사도 중 비슷한 코사인 유사도를 가진 정보를 뽑아낸다 sim_index=sim_index[sim_index!=target_movie_index] # 본인은 제외 result=df.iloc[sim_index].sort_values(‘추천점수’,ascending=False)[:10] #data frame 으로 만든 뒤 추천점수로 정렬 한 뒤 return return result print(“마음에 들었던 영화를 조건에 맞게 입력하세요:”) movie=input() temp=get_recommed_movie_list(data,movie_title=movie) ans=[] ans=temp.values.tolist() ans=array(ans) for i in range(10): if i==0: print(‘%50s %40s %35s %20s %14s %20s’ % (‘제목’,’장르’,’평점’,’평점투표 수’,’인기도’,’추천 점수’)) else: print(‘%60s %50s %20s %20s %20.4s %20.4s’ % (ans[i][1],ans[i][2],ans[i][3],ans[i][4],ans[i][5],ans[i][7])) #ans[0]=영화번호, [1]=제목,[2]=장르,[3]=평점,[4]=평점투표 수,[5]=인기도,[6]=키워드,[7]=추천 점수

넷플릭스와 왓챠 영화추천 알고리즘

넷플릭스와 왓챠 영화 추천 알고리즘 이해하기

알고리즘

넷플릭스와 왓챠와 같은 OTT 서비스를 이용하다 보면 내게 맞는 유형의 영화 추천이 이뤄지는 것을 알 수 있습니다. 각 개인에게 맞는 영화 추천 알고리즘은 어떤 방식으로 진행되는지와 넷플릭스와 왓챠의 영화 추천 알고리즘 방식에 대해 정리하였습니다. 영화 추천 알고리즘은 크게 아래와 같습니다.

영화 추천 알고리즘 2가지 방법

영화 추천 알고리즘은 협업 필터링(Collaborative Filtering)과 콘텐츠 기반 필터링(Content-based Filtering)의 두 가지 방법으로 나눌 수 있습니다.

1. 협업 필터링(Collaborative Filtering)

협업 필터링에 대해 이해를 돕기 위해 간단한 예시를 통해 설명드리도록 하겠습니다.

① 하나의 콘텐츠를 남자 1명, 여자 1명 이 두 사람이 모두 확인했다고 가정

② 위 ①의 남녀를 비슷한 유저로 인식

③ 위 ①이 남자가 확인한 다른 콘텐츠를 비슷한 유저로 인식한 ①의 여자에게 콘텐츠 추천

이렇게 비슷한 유저를 찾아내 서로에게 추천하는 방식을 협업 필터링이라 합니다.

협업 필터링(Collaborative Filtering)의 문제점

협업 필터링은 유저에 대한 기존 데이터가 존재해야 하기 때문에 초기 데이터를 제대로 수집하지 못한다면 정확한 추천이 어렵습니다.

협업 필터링(Collaborative Filtering)의 문제 보완

① 넷플릭스 : 신규 가입자가 좋아하는 콘텐츠 3개를 고르도록 추천하며 선택하지 않을 경우는 인기 많은 콘텐츠 위주로 추천

② 왓챠 : 신규 이용자가 첫 이용 시 최소 10개의 콘텐츠에 별점을 부여함으로 유저의 데이터를 파악해 추천

2. 콘텐츠 기반 필터링(Content-based Filtering)

콘텐츠 기반 필터링은 말 그대로 콘텐츠 기반으로 필터링해 추천하는 방식으로 한 유저가 확인한 콘텐츠 자체 정보를 분석하여 유저의 데이터와 유사한 콘텐츠를 비교 확인하여 추천하는 방식입니다.

넷플릭스와 왓챠의 영화 추천 알고리즘

1. 넷플릭스 영화 추천 알고리즘

넷플릭스는 위 2가지 방식을 조합하여 콘텐츠를 유저에게 추천하는 방식입니다. 두 가지 방식 모두에서 데이터 모아 분석하는데 그 요소로는 시청 기간, 시청 시간대, 시청 디바이스, 재시청 비율, 데이터 환경까지 다양하게 설정하며 각기 다른 환경에 있기 때문에 시청습관과 취향 분석을 통해 유저에게 최적화된 콘텐츠를 추천하려 합니다.

2. 왓챠의 영화 추천 알고리즘

왓챠도 위 2가지 방식을 조합하여 콘텐츠를 유저에게 추천하고 있습니다. 넷플릭스와 다른 점은 보다 정확한 데이터를 신규 가입자에게 요구하기 때문에 신규 유저에게 보다 취향에 맞는 콘텐츠를 추천하는데 시간이 덜 걸리게 됩니다.

넷플릭스와 왓챠 각각의 장단점이 있는 거 같습니다. 당연히 있을 거 같은 콘텐츠는 없고 없을 거 같은 콘텐츠는 있는 느낌을 개인적으로 받았습니다. 무엇이 더 좋고 나쁜 것이 아니라 조금은 다르다고 생각이 들기 때문에 1개월 무료 서비스를 통해 본인에게 맞는 서비스를 이용하시는 걸 추천합니다.

반응형

딥 러닝 – 영화 추천 시스템(1)

◾추천 시스템

추천 시스템 : 특정 사용자가 관심을 가질만한 정보 (영화, 음악, 책, 뉴스, 이미지, 웹 페이지 등)를 추천하는 것 현재는 많은 분야에 적용되어 있다. 특히 온라인 쇼핑몰 콘텐츠 등에서는 꽤 중요한 부분을 차지한다. 예시) 유튜브, 쇼핑몰, 광고 등

콘텐츠 기반 필터링 추천 시스템 : 사용자가 특정한 아이템을 선호하는 경우, 그 아이템과 비슷한 아이템을 추천하는 방식

: 사용자가 특정한 아이템을 선호하는 경우, 그 아이템과 비슷한 아이템을 추천하는 방식 최근접 이웃 협업 필터링 추천 시스템 : 축적된 사용자 행동 데이터를 기반으로 사용자가 아직 평가하지 않은 아이템을 예측 평가하는 방식 사용자 기반 : 각 사용자와 비슷한 고객들의 행동 참고 아이템 기반 : 해당 아이템을 선택한 다른 고객들의 행동 참고 일반적으로는 사용자 기반보다 아이템 기반 협업 필터링이 정확도가 높다. 비슷한 영화를 좋아한다고 취향이 비슷하다고 판단하기 어렵거나 매우 유명한 영화의 경우 취향과 관계없이 관람하는 경우가 많고 평점을 매기지 않는 경우가 많기 때문이다.

: 축적된 사용자 행동 데이터를 기반으로 사용자가 아직 평가하지 않은 아이템을 예측 평가하는 방식 잠재 요인 협업 필터링 추천 시스템 : 사용자-아이템 평점 행렬 데이터를 이용해 “잠재요인”을 도출하는 방식 주요인과 아이템에 대한 잠재요인에 대해 행렬 분해를 진행하고 다시 행렬곱을 통해 아직 평점을 부여하지 않은 아이템에 대한 예측 평점 생성

: 사용자-아이템 평점 행렬 데이터를 이용해 “잠재요인”을 도출하는 방식

◾영화 추천 시스템

0. 데이터

TMDB5000 영화 데이터 : Kaggle

MoviesLens 평점 데이터(1MB) : MovieLens

1. 콘텐츠 기반 필터링(TMDB5000)

import pandas as pd import numpy as np import warnings ; warnings . filterwarnings ( ‘ignore’ ) movies = pd . read_csv ( ‘./data/01/tmdb_5000_movies.csv’ ) print ( movies . shape ) movies . head ( 2 )

– 데이터 정리

컬럼 정보 id : 영화 아이디 title : 영화명 genres : 영화 장르 vote_average : 영화 평균 평점 vote_count : 영화 투표수 popularity : 영화 인기 keywords : 영화 키워드 overview : 영화 개요

genres, keywords는 컬럼안에 dict형으로 보이지만 str형으로 저장되어있다.

movies_df = movies [ [ ‘id’ , ‘title’ , ‘genres’ , ‘vote_average’ , ‘vote_count’ , ‘popularity’ , ‘keywords’ , ‘overview’ ] ] movies_df . head ( 2 )

문자열로 된 데이터를 literal_eval로 변경해준다. genres와 keywords의 내용을 list와 dict로 복구

movies_df [ ‘genres’ ] = movies_df [ ‘genres’ ] . apply ( literal_eval ) movies_df [ ‘keywords’ ] = movies_df [ ‘keywords’ ] . apply ( literal_eval ) movies_df . head ( 2 )

dict형의 value 값을 특성으로 사용하도록 변경

movies_df [ ‘genres’ ] = movies_df [ ‘genres’ ] . apply ( lambda x : [ y [ ‘name’ ] for y in x ] ) movies_df [ ‘keywords’ ] = movies_df [ ‘keywords’ ] . apply ( lambda x : [ y [ ‘name’ ] for y in x ] ) movies_df . head ( 2 )

– genres 기준 CountVectorize

genres의 각 단어들을 하나의 문장으로 변환

movies_df [ ‘genres_literal’ ] = movies_df [ ‘genres’ ] . apply ( lambda x : ( ‘ ‘ ) . join ( x ) ) movies_df . head ( 2 )

genres_literal CountVectorize 수행

from sklearn . feature_extraction . text import CountVectorizer count_vect = CountVectorizer ( min_df = 0 , ngram_range = ( 1 , 2 ) ) genre_mat = count_vect . fit_transform ( movies_df [ ‘genres_literal’ ] ) print ( genre_mat . shape )

코사인 유사도 : 두 벡터 간의 코사인 각도를 이용하여 구할 수 있는 두 벡터의 유사도를 의미 문장의 유사도를 측정하는 방법 중 하나이다. s i m i l a r i t y = c o s ( θ ) = A B ∣ ∣ A ∣ ∣ ∣ ∣ B ∣ ∣ = ∑ i = 1 n A i × B i ∑ i = 1 n ( A i ) 2 × ∑ i = 1 n ( B i ) 2 similarity = cos(\theta) = {AB \over ||A||~||B||} = {\sum_{i=1}^{n}{A_{i}\times B_{i}} \over \sqrt{\sum_{i=1}^{n}({A_{i})^{2}}}\times \sqrt{\sum_{i=1}^{n}({B_{i})^{2}}}} s i m i l a r i t y = c o s ( θ ) = ∣ ∣ A ∣ ∣ ∣ ∣ B ∣ ∣ A B ​ = ∑ i = 1 n ​ ( A i ​ ) 2 ​ × ∑ i = 1 n ​ ( B i ​ ) 2 ​ ∑ i = 1 n ​ A i ​ × B i ​ ​

: 두 벡터 간의 코사인 각도를 이용하여 구할 수 있는 두 벡터의 유사도를 의미

from sklearn . metrics . pairwise import cosine_similarity genre_sim = cosine_similarity ( genre_mat , genre_mat ) print ( genre_sim . shape ) print ( genre_sim [ : 2 ] )

genre_sim 객체에서 높은 값 순으로 정렬할 수 있다.

argsort : Series 데이터를 정렬한 index 반환

genre_sim_sorted_ind = genre_sim . argsort ( ) [ : , : : – 1 ] print ( genre_sim_sorted_ind [ : 1 ] )

– 추천 영화 DataFrame 반환 함수

def find_sim_movie ( df , sorted_ind , title_name , top_n = 10 ) : title_movie = df [ df [ ‘title’ ] == title_name ] title_index = title_movie . index . values similar_indexes = sorted_ind [ title_index , : ( top_n ) ] print ( similar_indexes ) similar_indexes = similar_indexes . reshape ( – 1 ) return df . iloc [ similar_indexes ] similar_movies = find_sim_movie ( movies_df , genre_sim_sorted_ind , “The Godfather” , 10 ) similar_movies [ [ ‘title’ , ‘vote_average’ ] ]

2. + 가중치 평점(TMDB5000)

– 데이터 재탐색

평점과 평점을 매긴 사람을 살펴보면 적은 사람만 투표한 경우 정말로 그 수치만큼인지 판단하기 어렵다.

movies_df [ [ ‘title’ , ‘vote_average’ , ‘vote_count’ ] ] . sort_values ( ‘vote_average’ , ascending = False ) [ : 10 ]

영화 선정을 위한 가중치 선정 ( v v + m ) R + ( m v + m ) C ({v\over v+m})R + ({m\over v+m})C ( v + m v ​ ) R + ( v + m m ​ ) C v : 개별 영화에 평점을 투표한 횟수 m : 평점을 부여하기 위한 최소 투표 횟수 R : 개별 영화에 대한 평균 평점 C : 전체 영화에 대한 평균 평점

영화 전체 평균 평점과 최소 투가 횟수를 60% 지점으로 지정

가중치가 부여된 평점 계산하기 위한 함수

C = movies_df [ ‘vote_average’ ] . mean ( ) m = movies_df [ ‘vote_count’ ] . quantile ( 0.6 ) def weighted_vote_average ( record ) : v = record [ ‘vote_count’ ] R = record [ ‘vote_average’ ] return ( ( v / ( v + m ) ) * R ) + ( ( m / ( v + m ) ) * C ) movies_df [ ‘weighted_vote’ ] = movies_df . apply ( weighted_vote_average , axis = 1 ) movies_df . head ( 2 )

– 가중치 평점을 활용한 추천 영화 DataFrame 반환 함수

def find_sim_movie ( df , sorted_ind , title_name , top_n = 10 ) : title_movie = df [ df [ ‘title’ ] == title_name ] title_index = title_movie . index . values similar_indexes = sorted_ind [ title_index , : ( top_n * 2 ) ] similar_indexes = similar_indexes . reshape ( – 1 ) similar_indexes = similar_indexes [ similar_indexes != title_index ] return df . iloc [ similar_indexes ] . sort_values ( ‘weighted_vote’ , ascending = False ) [ : top_n ] similar_movies = find_sim_movie ( movies_df , genre_sim_sorted_ind , ‘The Godfather’ , 10 ) similar_movies [ [ ‘title’ , ‘vote_average’ , ‘weighted_vote’ ] ]

3. 아이템 기반 최근접 이웃 협업 필터링(MoviesLens)

– 데이터 읽기

import pandas as pd import numpy as np import warnings ; warnings . filterwarnings ( ‘ignore’ ) movies = pd . read_csv ( ‘./data/01/ml-latest-small/movies.csv’ ) ratings = pd . read_csv ( ‘./data/01/ml-latest-small/ratings.csv’ ) movies . shape , ratings . shape

movie : 영화 제목과 장르

ratings : 사용자별 각 영화의 평점

movies . head ( 2 )

ratings . head ( 2 )

– 데이터 정리

ratings와 movie를 movieId 기준으로 결합

rating_movies = pd . merge ( ratings , movies , on = ‘movieId’ ) rating_movies . head ( 2 )

ratings 데이터를 각 사용자의 평점을 보기 쉽게 pivot_table로 변경 nan은 0으로 변환

ratings_matrix = rating_movies . pivot_table ( ‘rating’ , index = ‘userId’ , columns = ‘title’ ) ratings_matrix . fillna ( 0 , inplace = True ) ratings_matrix . head ( 2 )

– 유사도 측정

유사도 측정을 위해 행렬 transpose(행, 열 전환)

ratings_matrix_T = ratings_matrix . transpose ( ) ratings_matrix_T . head ( 2 )

코사인 유사도 측정

from sklearn . metrics . pairwise import cosine_similarity item_sim = cosine_similarity ( ratings_matrix_T , ratings_matrix_T ) item_sim_df = pd . DataFrame ( data = item_sim , index = ratings_matrix . columns , columns = ratings_matrix . columns ) print ( item_sim_df . shape ) item_sim_df . head ( 2 )

– 추천 영화 DataFrame 반환 함수

def find_sim_movie_item ( df , title_name , top_n = 10 ) : title_movie_sim = df [ [ title_name ] ] . drop ( title_name , axis = 0 ) return title_movie_sim . sort_values ( title_name , ascending = False ) [ : top_n ]

대부 -> 추천

find_sim_movie_item ( item_sim_df , ‘Godfather, The (1972)’ )

인셉션 -> 추천

[python] 영화 추천 시스템

1. 개요

사용자로부터 특정 개수 (5개 정도)의 선호하는 영화를 선택받으면, 해당 사용자가 좋아할만한 영화를 추천해주는 영화 추천 시스템을 만들었다.

영화를 추천해주는 방법은 아래와 같이 2가지가 있다.

1) 사용자가 선호하는 영화와 유사한 영화를 추천

2) 다른 사용자들의 평가를 바탕으로 선호할만한 영화를 추천

코드는 아래에서 확인할 수 있다.

2. Abstract

본 프로젝트에서는 사용자가 선호하는 영화 5개를 바탕으로 간단하게 사용자에게 볼만한 영화를 추천해주는 시스템을 제안한다.

본 시스템은 크게 2가지 방식으로 영화를 추천한다.

첫번째 방식은 사용자가 선택한 영화와 자주 같이 시청된 영화들 중, 비슷한 종류의 영화들을 추천하는 방식이고, 두번째 방식은 다른 사용자들의 평가를 바탕으로 선호할 만한 영화를 추천하는 방식이다.

첫번째 방식에서는 A-priority, K-means clustering 알고리즘을 사용하였고, 두번째 방식에서는 Item-based collaborative filtering 알고리즘을 사용하였다.

본 프로젝트에서 제안하는 영화 추천 시스템을 사용한 결과, 사용자는 5개의 선호 영화를 바탕으로 다양한 종류의 추천 영화를 확인할 수 있었다.

전체 과정은 아래 그림과 같다.

영화 추천 시스템 전체 구조

Method 1 방법 Method2

3. Introduction

다양한 영화들 속에서 특정 사용자가 선호할 만한 영화를 선택하는 것은 쉬운 일이 아니다. 기존의 영화 추천 어플리케이션 (왓챠, 키노라이츠 등)을 사용할 때, 사용자가 영화 추천을 받고 싶은 경우, 우선적으로 사용자가 선호하는 여러 영화들을 입력해야 하며, 각 영화들마다 평점을 세분화하여 매겨야 한다.

이럴 경우 보다 세밀한 영화 추천이 가능하지만, 보다 빠르고 간편하게 추천을 받고 싶은 경우에는 부적절하다. 또한, 지금까지 봐왔던 모든 영화가 아닌, 특정 영화들을 기반으로 추천을 받고자 할 경우 위 시스템은 알맞지 않다는 문제점이 존재한다.

따라서 본 프로젝트에서 제안하는 영화 추천 시스템은 사용자가 단지 5개의 선호 영화를 입력하면, 사용자가 선호할 만한 영화를 추천해준다.

이를 통해 사용자는 보다 빠르고 간편하게 추천 영화 목록을 확인할 수 있게 된다.

영화 추천 관련 알고리즘의 경우, 특정 영화와 연관관계가 있는 영화를 추천하기 위한 A-priori 알고리즘, 단순히 영화들 간의 similarity를 기반으로 추천하는 Clustering 혹은 Content-based recommendation 방식과 해당 영화를 좋게 평가한 다른 사람들의 평가를 기반으로 추천하는 Collaborative Filtering 등이 있다.

본 영화 추천 시스템에서는 사용자가 선택한 영화와 관련이 있는 영화를 추천하기 위해 A-priori 알고리즘을 사용하였으며, 그 중 비슷한 종류의 영화를 추리기 위해 K-means Clustering 알고리즘을 사용하였다.

또한 선택한 영화를 좋게 평가한 다른 사용자들의 의견을 반영하여 보다 다양한 종류의 영화를 추천하기 위해 Item-based collaborative Filtering 알고리즘을 사용하였다.

A-priori 와 K-means Clustering 알고리즘을 융합하기 위해, 우선 Association rules와 A-priori 알고리즘을 통해 특정 사용자가, 입력 받은 영화를 시청했을 경우, 함께 시청할 확률이 높은 영화들을 선택한다.

이후 K-means Clustering 알고리즘을 통해 사용자가 입력한 선호 영화들의 cluster들을 결정한다.

앞서 A-priori 알고리즘을 통해 추천된 영화들 중, 입력한 선호 영화들의 cluster에 포함되지 않은 영화들은 제외하였다. 이를 통해 A-priori 와 K-means Clustering 알고리즘을 융합하였다.

Content-based recommendation 방식의 경우, 사용자가 선호하는 다양한 영화에 대한 정보가 필요하지만, 본 시스템의 경우 오직 5개의 선호 영화만 입력 받기 때문에 해당 방식은 제외하였다.

4. Methods

4.1. Dataset

본 프로젝트에 사용된 데이터셋은 Kaggle의 ‘The movie Dataset’ 이다.

(www.kaggle.com/rounakbanik/the-movies-dataset)

해당 데이터셋은 약 45,000개의 영화에 대한 메타데이터를 가지고 있으며, 각 영화의 출연진, 연출진, 감독, 키워드, 예산, 국가 등의 정보를 담고 있다. 또한 추가적으로 270,000 명의 사용자들로부터 입력된 26,000,000 개의 영화 rating 정보도 포함하고 있다. rating은 1부터 5까지 숫자로 주어진다.

본 프로젝트에서는 전체 영화에 대한 메타데이터를 나타내는 movies_metadata.csv 파일과, 일부 사용자들의 영화에 대한 rating 정보를 나타내는 ratings_small.csv 파일을 사용하였다.

전체적인 rating 분포를 보기 위해 matplotlib 라이브러리를 사용하여 ratings_small.csv 파일을 분석하여 그래프로 나타낸 결과, [그림 1]과 같이 4.0 이 가장 많았고 3.0과 5.0 이 뒤를 이었다.

가장 적은 rating 값은 0.5였고, 1.5와 2.5가 뒤를 이었다. pandas 라이브러리의 df.describe() 메소드를 이용하여 전체적인 통계 정보를 출력한 결과 [그림 2]와 같았다.

[그림 1] Distribution of ratings

[그림 2] dataset statistics

ratings_small.csv 파일에는 userId, rating, movieId, timestamp 정보가 존재한다.

프로젝트 진행을 위해 ratings_small.csv 파일의 movieId와 movies_metadata.csv 파일의 id column을 기준으로 merge 하여 사용하였다.

4.2. A-priori Algorithm & K-means Clustering

A-priori 알고리즘을 적용하기 위해 pandas 라이브러리의 pivot 메소드를 활용하였다.

[그림 3]과 같이 row에는 사용자의 userId, column에는 영화들의 movieId를 배치하였고, Data frame 내부에는 각 userId와 movieId에 해당하는 ratings가 오도록 utility matrix를 생성하였다.

[그림 3] utility matrix

A-priori 알고리즘에는 rating 값보다 시청했는지 여부가 중요하기 때문에, 시청하였으면(rating이 존재하면) 1, 시청하지 않았으면 0으로 변환시켰다.

이후 mlxtent 라이브러리의 apriori메소드를 통해 frequent_itemset을 생성하였고, association_rules 메소드를 활용하여 frequent_itemset에 대하여 support, confidence, lift 등의 지표를 계산하였다.

A-priori 알고리즘을 적용시킬 때 minimum support는 0.07으로 설정하였다.

사용자가 선호하는 특정 영화를 입력 값으로 넣으면, 해당 영화와의 lift 값이 가장 큰 영화들을 순서대로 추천해준다.

K-means clustering을 적용하기 위해 전처리를 진행하였다.

전처리 단계에서는 투표수가 25개를 넘지 않는 영화는 부정확한 결과를 초래할 수 있으므로 제거하였으며, movies_metadata.csv 파일의 여러 column 중에서 ‘budget’, ‘popularity’, ‘revenue’, ‘runtime’, ‘vote_average’, ‘vote_count’, ‘title’ 값만을 feature로 사용하였다.

또한 sklearn 라이브러리의 MinMaxScaler 메소드를 통해 데이터들을 normalize 해주었다.

본격적으로 clustering을 적용하기 위해 sklearn 라이브러리의 KMeans 메소드를 활용하였다. cluster의 개수는 [그림 4]와 같이 elbow curve와 silhouette score를 기준으로 평가한 결과를 바탕으로 5로 설정하였다.

[그림 4] Elbow curve & Silhouette score

앞서 설명했듯이 K-means clustering은 A-priori 알고리즘을 통해 나온 추천 영화들을 다시 한번 더 필터링하기 위해 사용된다.

K-means clustering을 통해 사용자로부터 입력 받은 선호 영화 5개의 cluster들을 각각 구한 뒤, A-priori 알고리즘을 거쳐 나온 추천 영화들이 해당 cluster 중 어느 cluster에도 속하지 않은 경우, 해당 영화는 필터링하는 방식으로 진행하였다.

예를 들어 사용자로부터 입력 받은 선호 영화 5개의 cluster가 각각 [1, 1, 3, 4, 3] 일 경우, A-priori 알고리즘을 통해 도출된 추천 영화들의 cluster을 구한 뒤, [1, 3, 4] cluster에 해당하지 않는 영화는 필터링하는 것이다.

4.3. Item-based collaborative filtering

Collaborative Filtering 방식은 다른 사용자들의 rating을 이용하여 해당 사용자에게 추천하는 방식이다.

본 프로그램에서는 collaborative filtering 알고리즘을 활용하기 위해 역시 pandas 라이브러리의 pivot 메소드를 활용하여 utility matrix를 생성하였다.

전체 영화 수에 비해 각 사용자들이 평가한 rating 데이터의 양이 작으므로 전체적으로 utility matrix는 sparse 한 형태일 것이다. 따라서 scipy 라이브러리의 csr_matrix 메소드를 이용하여 효율적으로 나타냈다.

이후 사용자들이 측정한 ratings를 바탕으로 item들 간의 cosine similarity를 이용하여 각 영화들 간의 유사도를 측정하였다.

이제 사용자로부터 입력 받은 선호 영화가 주어지면, sklearn 라이브러리의 kneighbors 메소드를 통해 각 영화들과의 distance를 구한 뒤, 해당 영화에 비해 distance가 가장 작은, 즉 유사한 영화들을 추천해주게 된다.

5. Result

앞서 말했듯이, 본 프로젝트에서 제안하는 영화 추천 시스템은 크게 A-priori & K-means 방식과 Collaborative Filtering 방식, 두가지로 영화를 추천하게 된다.

따라서 사용자는 자신이 선호한 영화 5개를 입력하면, 해당 영화와 비슷한 추천 목록과, 해당 영화를 좋아한 사람들의 추천목록 두가지 추천목록을 받게 된다.

실제로 본 영화 추천 시스템을 통해 “Taxi Driver” “Inception” “Jumanji” “Star Trek: Generations” “Men in Black II” 의 5가지 영화를 선호 영화로 입력했을 경우 [그림 5]와 같은 추천 영화 결과를 얻을 수 있었다.

A-priori & K-means 알고리즘을 통해 추천된 영화들의 경우, 입력한 영화들과 거의 비슷한 영화 장르들이 추천되었고, Item-based collaborative filtering 알고리즘을 통해 추천된 영화들의 경우, 입력한 영화들의 장르와 상관없이 여러 장르의 영화들이 추천된 것을 확인할 수 있었다.

[그림 5] result of movie recommend system

6. Conclusion

일반적으로 사용자 선호 영화들이 여러 개가 필요한 기존의 영화 추천 시스템과는 달리, 본 프로젝트에서 제안하는 영화 추천 시스템은 적은 수의 사용자 선호 영화를 가지고 보다 가볍고 효율적으로 영화를 추천할 수 있는 시스템을 제안하였다.

추천 방식은 크게 두가지가 존재한다.

첫번째 방식은 우선 A-priori 알고리즘을 통해 특정 영화를 선택했을 때 함께 선택될 확률이 높은 영화를 선정하고, 이후 K-means clustering을 통해 선택한 영화와 유사한 영화들만 추천되도록 필터링 하였다.

두번째 방식은 Item-based collaborative filtering 방식을 사용하여, 사용자들의 rating 데이터를 기반으로 영화들 사이의 similarity를 계산한 뒤, 선택된 영화와 유사한 영화를 선택함으로써 추천되도록 하였다.

본 시스템을 통해 사용자는 보다 간단하고 빠르게 영화를 추천할 수 있으며, 다양한 알고리즘을 사용하여, 다각도에서 추천할 수 있다.

현재는 입력된 영화 5가지를 통해 추천하고 나면 추천 결과가 누적되지 않는 일회성 추천 시스템이지만, 이를 발전시켜 앞으로 추가적으로 영화를 입력하더라도 누적하여 추천해줄 수 있는 시스템을 고안할 예정이며, 웹페이지 형태로 개발을 이어나갈 계획이다.

7. References

데이터셋 – “The Movies Dataset”, Kaggle, accessed Dec 09, 2021, https://www. kaggle.com/rounakbanik/ the-movies-dataset

Apriori 알고리즘 – “Movie Recommendation With ML – Apriori Explained”, Kaggle, accessed Dec 09, 2021, https://www.kaggle.com/ankits29/movie-recommendation-with-ml-apriori-explained

K-means clustering – “K-Means Clustering”, Kaggle, accessed Dec 07, 2021, https://www.kaggle.com/sirpunch/k-means-clustering

Item-based collaborative filtering – “Movie Recommendation Engine”, Kaggle, accessed Dec 07, 2021, https:// www.kaggle.com/basel99/movie-recommendation-engine-collaborative-filter

[추천시스템] 넷플릭스 영화 추천 시스템 구현 파이썬 코드

데이터

movie_ratings.zip 7.12MB

필요한 데이터만 첨부

코드

import pandas as pd import numpy as np # 데이터 읽어오기 movies=pd.read_csv(“movies.csv”) ratings=pd.read_csv(“ratings.csv”)

# 아이템 기반 협업 필터링 data=pd.merge(ratings,movies,on=”movieId”) column=[‘userId’,’movieId’,’rating’,’title’,’genres’] data=data[column] data moviedata=data.pivot_table(index=”movieId”, columns=’userId’)[‘rating’] moviedata

#NaN값을 -1로 변경 ( 평점을 계산할 때 양수값만 처리하면 됌) moviedata.fillna(-1, inplace=True) moviedata

Kdd 유사도 기반 영화 추천 알고리즘

출처: 멀티캠퍼스_빅데이터AI설계 박길식 강사님 PPT

#kdd 유사도 함수 from math import sqrt def sim_distance(data, n1, n2): sum=0 #두 사용자가 모두 본 영화를 기준으로 해야해서 i로 변수 통일(j따로 안 써줌) for i in data.loc[n1,data.loc[n1,:]>=0].index: if data.loc[n2,i]>=0: sum+=pow(data.loc[n1,i]-data.loc[n2,i],2) #누적합 return sqrt(1/(sum+1)) #유사도 형식으로 출력

# 나와 유사도가 높은 user 매칭 함수 def top_match(data, name, rank = 5, simf = sim_distance): simList = [] for i in data.index[-10:]: if name != i: simList.append((simf(data, name, i), i)) simList.sort() simList.reverse() return simList[:rank]

# 추천 시스템 함수 def recommendation(data, person, simf = sim_distance): res = top_match(data, person, len(data)) score_dic = {} sim_dic = {} myList = [] for sim, name in res: if sim < 0: continue for movie in data.loc[person, data.loc[person, :] < 0].index: simSum = 0 if data.loc[name, movie] >= 0: simSum += sim * data.loc[name, movie] score_dic.setdefault(movie, 0) score_dic[movie] += simSum sim_dic.setdefault(movie, 0) sim_dic[movie] += sim for key in score_dic: myList.append((score_dic[key] / sim_dic[key], key)) myList.sort() myList.reverse() return myList

# 25번 user가 안본 영화중에서 #추천 점수가 가장 높은 순으로 예상평점과 영화제목을 추천 (10개까지) movieList = [] for rate, m_id in recommendation(moviedata, 25): movieList.append((rate, movies.loc[movies[‘movieId’] == m_id, ‘title’].values[0])) movieList[:10]

피어슨 상관계수 기반 영화 추천 알고리즘

#피어슨 상관계수 def sim_pearson(data, n1, n2): #구현 sumX=0 sumY=0 sumSqX=0 # x 제곱합 sumSqY=0 # y 제곱합 sumXY=0 #XY 합 cnt =0 #영화 갯수 for i in data.loc[n1,data.loc[n1,:]>=0].index: if data.loc[n2,i]>=0: sumX+=data.loc[n1,i] sumY+=data.loc[n2,i] sumSqX+=pow(data.loc[n1,i],2) sumSqY+=pow(data.loc[n2,i],2) sumXY+=(data.loc[n1,i])*(data.loc[n2,i]) cnt+=1 global num # 전역변수 선언 global den # 전역변수 선언 num=sumXY-((sumX*sumY)/cnt) den= (sumSqX-(pow(sumX,2)/cnt))*(sumSqY-(pow(sumY,2)/cnt)) return num/sqrt(den+0.00001) # 분모=0방지

#나와 유사도가 높은 user와 매칭 함수 def top_match(data, name, rank = 5, simf = sim_pearson): simList = [] for i in data.index: if name != i: if simf(data, name, i) is not None: simList.append((simf(data, name, i), i)) simList.sort() simList.reverse() return simList[:rank]

#추천 시스템 함수 def recommendation(data, person, simf = sim_pearson): res = top_match(data, person, len(data)) score_dic = {} sim_dic = {} myList = [] for sim, name in res: if sim < 0: continue for movie in data.loc[person, data.loc[person, :] < 0].index: simSum = 0 if data.loc[name, movie] >= 0: simSum += sim * data.loc[name, movie] score_dic.setdefault(movie, 0) score_dic[movie] += simSum sim_dic.setdefault(movie, 0) sim_dic[movie] += sim for key in score_dic: myList.append((score_dic[key] / sim_dic[key], key)) myList.sort() myList.reverse() return myList

movieList = [] for rate, m_id in recommendation(moviedata, 1): movieList.append((rate, movies.loc[movies[‘movieId’] == m_id, ‘title’].values[0])) if len(movieList)==10: #10 개되면 멈추기 break movieList[:10] # 10개만 추출

알고리즘 단점: 계산 느림

코사인 유사도 기반 영화 추천 알고리즘

: 메타데이터의 영화 줄거리 데이터가 있을때, 이와 유사한 영화를 추천해주는 알고리즘

데이터

https://www.kaggle.com/rounakbanik/the-movies-dataset

데이터불러오기

#데이터 불러오기 import pandas as pd data=pd.read_csv(“movies_metadata.csv”,encoding=”UTF-8″) #데이터가 많은 관계로 20000개까지 짜름 data=data.head(20000)

데이터 결측값 처리

data[‘overview’].isnull().sum() #135 data[‘overview’]=data[‘overview’].fillna(”) data[‘overview’].isnull().sum() #0 으로 바뀜 내적하면 모두 0 나옴

tf-idf행렬 생성

# tfidf 행렬 생성 from sklearn.feature_extraction.text import TfidfVectorizer tfidf=TfidfVectorizer(stop_words=’english’)#불용어 제거 tfidf_mat=tfidf.fit_transform(data[‘overview’]).toarray()

줄거리 행렬에 대한 tf-idf행렬을 생성하여 단어의 빈도수를 나타내고 array(배열)로 변경

코사인 유사도 함수

출처: 멀티캠퍼스_빅데이터AI설계 박길식 강사님 PPT

#코사인유사도함수 2 (분모=!0) from numpy.linalg import norm def cos_sim2(X,Y): return np.dot(X,Y)/((norm(X)*norm(Y))+1e-7)

분모가0이 되지 않도록 1e-7 값을 넣어줄 것

추천함수

#추천 함수 def top_match_ar2(data, name, rank=5,simf=cos_sim2): sim=[] for i in range(len(data)): if name != i: sim.append((simf(data[i],data[name]),i)) sim.sort() sim.reverse() return sim[:rank]

영화 추천

(영화제목, 코사인유사도) 출력

# Toystory와 코사인유사도가 비슷한 순으로 영화 추천 : (영화제목, 코사인유사도) movieList = [] for sim, movie_id in top_match_ar2(tfidf_mat,0,10): movieList.append((sim, data.loc[movie_id,’title’])) movieList[:10]

실제로 Toy Story와 줄거리가 비슷한 Toy Story 3, Toy Story 2가 출력되었음을 확인할 수 있음.

※실제 넷플릭스에서 사용하는 알고리즘은 아니며, 직원이 아닌 관계로 알 수 없습니다.

[movie recomendation] 알고리즘에 따른 영화 추천 시스템 구현

반응형

– 해당 Power bi link

app.powerbi.com/view?r=eyJrIjoiMDFmNjk5YTgtYmYzMy00YWM3LTgzNjctNDRhNjBjNWY0ZDdhIiwidCI6IjcxNzYzNWIxLTFjNzUtNDViOC05NmEzLWQzYzM0MTk5MWUwNyJ9

프로젝트 이름

– 영화 추천 시스템

기술 스택

– python

사용한 Tool

– colab, jupyter, power bi

프로젝트 기간

– 20.08.21 – 20.09.08

프로젝트 내용

– kaggle에 있는 영화 데이터와 사용자의 평점 데이터를 통해 영화 추천 시스템을 구현하였다. 사용자에 따른 개인화 추천을 구현하였고, 변수에 따라 가중치를 두는 추천, 알고리즘의 종류에 따른 추천을 하였다.

따라서 C ollaborative Filtering과 C ontent based filtering , Hybrid Filtering을 구현하였다.

power bi 설명

– 1 page

Collaborative Filtering(사용자가 본 영화에 따라 알고리즘을 사용하여 영화 추천)의 추천 방식으로 영화를 추천해주는 방식이다.

-2 page

사용자가 영화에 대한 평가를 하고 그 데이터가 쌓인다. 그 쌓인 데이터를 이용해 영화 추천이 기존과 달라지는 것을 표현했다.

-3,4 page

Coll collaborative Filtering에 추가로 콘텐츠 적인 변수 (영화의 특성)을 더해 content based filtering을 추가해주었고 이것을 통해 hybrid filtering을 구현하였다.

– 5 page

다른 알고리즘을 사용함에 따라 추천이 어떻게 바뀌는지를 표현했다.

-6 page

알고리즘에 따른 성능 차이를 분석했다. 분석하는 데 있어서 RMSE와 RME, fit-time, test-tiem를 구현하였다.

프로젝트 소개는 간략하게 여기서 끝내고 다음 글에서 어떻게 구현하였는지 설명하겠습니다.

반응형

키워드에 대한 정보 영화 추천 알고리즘

다음은 Bing에서 영화 추천 알고리즘 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 영화 추천 인공지능 만들기 – Python

  • 개발
  • 인공지능
  • 파이썬
  • python
  • ai
  • pearson
  • correlation

영화 #추천 #인공지능 #만들기 #- #Python


YouTube에서 영화 추천 알고리즘 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 영화 추천 인공지능 만들기 – Python | 영화 추천 알고리즘, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment