$ mkdir -p ~/aiffel/movie_recommendation
사용자에게 관련 아이템을 추천해 주는 것
예시) 영화 추천
실제 추천 시스템 ➡️ 영화를 좌표 평면에 표현
예시) 취향 부분에 체크를 하지 않고 가입한 C
추천 로직
-1 ~ 1
, 1에 가까울수록 유사도가 높음import numpy as np
t1 = np.array([1, 1, 1])
t2 = np.array([2, 0, 1])
from numpy import dot
from numpy.linalg import norm
def cos_sim(A, B):
return dot(A, B)/(norm(A)*norm(B))
cos_sim(t1, t2)
cosine_similarity
모듈로 바로 계산 가능!from sklearn.metrics.pairwise import cosine_similarity
t1 = np.array([[1, 1, 1]])
t2 = np.array([[2, 0, 1]])
cosine_similarity(t1,t2)
t1 = np.array([[1, 1, 1]])
t2 = np.array([[1, -1, 0]])
cosine_similarity(t1,t2)
t1 = np.array([[1, 1, 1]])
t2 = np.array([[-1, -1, -1]])
cosine_similarity(t1,t2)
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
movie_dataset
다운로드 후 저장import os
csv_path = os.getenv('HOME')+'/aiffel/movie_recommendation/movie_dataset.csv'
df = pd.read_csv(csv_path)
df.head()
df.columns
features = ['keywords','cast','genres','director']
features
def combine_features(row):
return row['keywords']+" "+row['cast']+" "+row['genres']+" "+row['director']
combine_features(df[:5])
for feature in features:
df[feature] = df[feature].fillna('')
df["combined_features"] = df.apply(combine_features,axis=1)
df["combined_features"]
CountVectorizer()
사용cv = CountVectorizer()
count_matrix = cv.fit_transform(df["combined_features"])
print(type(count_matrix))
print(count_matrix.shape)
print(count_matrix)
분석
count_matrix
- 데이터 구조 : CSR Matrix
- 0이 아닌 유효 데이터로 채워지는 데이터 값 + 좌표 정보로 구성
- Sparse한 matrix와 동일 행렬 표현 가능
cosine_similarity
matrix 구하기cosine_sim = cosine_similarity(count_matrix)
print(cosine_sim)
print(cosine_sim.shape)
def get_title_from_index(index):
return df[df.index == index]["title"].values[0]
def get_index_from_title(title):
return df[df.title == title]["index"].values[0]
movie_user_likes = "Avatar"
movie_index = get_index_from_title(movie_user_likes)
similar_movies = list(enumerate(cosine_sim[movie_index]))
sorted_similar_movies = sorted(similar_movies,key=lambda x:x[1],reverse=True)[1:]
i=0
print(movie_user_likes+"와 비슷한 영화 3편은 "+"\n")
for item in sorted_similar_movies:
print(get_title_from_index(item[0]))
i=i+1
if i==3:
break
def get_title_from_index(index):
return df[df.index == index]["title"].values[0]
def get_index_from_title(title):
return df[df.title == title]["index"].values[0]
movie_user_likes = "Titanic"
movie_index = get_index_from_title(movie_user_likes)
similar_movies = list(enumerate(cosine_sim[movie_index]))
sorted_similar_movies = sorted(similar_movies,key=lambda x:x[1],reverse=True)[1:]
i=0
print(movie_user_likes+"와 비슷한 영화 5편은 "+"\n")
for item in sorted_similar_movies:
print(get_title_from_index(item[0]))
i=i+1
if i==5:
break
영화 추천
이 데이터를 interaction matrix
로 변환
희소 행렬 형태
평점 행렬로 변환한 후 ➡️ 평점행렬 유사도를 계산 및 추천 : 사용자 기반, 아이템 기반 필터링
평점 행렬을 분해한 후 ➡️ 더 많은 정보 고려 : 잠재요인 필터링
최근접 이웃 협업 필터링 : 동일 제품에 대해 매긴 평점 데이터 분석 및 추천
예시) 어떤 제품을 추천해줄 수 있을까?
User2가 선호한 item3 ➡️ User4에게 추천!
아이템 간 유사도 측정
사용자 기반보다 정확도가 더 높음!(일반적으로
예시) 어떤 제품을 추천해줄 수 있을까?
사용자 기반 : "당신과 비슷한 고객들이 다음 상품을 구매했습니다."
아이템 기반: "이 상품을 선택한 다른 고객들은 다음 상품을 구매했습니다."
(잠재 요인 협업 필터링: 행렬 인수분해를 이용해 잠재 요인 분석)
기법
M X N
행렬 A를 분해 내용 참고 및 이미지 출처
특이값 분해의 기하학적 의미
SVD를 사용하는 이유
numpy.linelg svd
모듈 사용import numpy as np
from numpy.linalg import svd
np.random.seed(30)
A = np.random.randint(0, 100, size=(4, 4))
A
svd(A)
U, Sigma, VT = svd(A)
print('U matrix: {}\n'.format(U.shape),U)
print('Sigma: {}\n'.format(Sigma.shape),Sigma)
print('V Transpose matrix: {}\n'.format(VT.shape),VT)
Sigma_mat = np.diag(Sigma)
A_ = np.dot(np.dot(U, Sigma_mat), VT)
A_
원본 A와 값 동일!
TruncatedSVD
로 사용 가능내용 참고 : SVD: Optimal Truncation [Python]
R : 사용자 - 아이템 간 행렬
P : 사용자 - 잠재요인 간 행렬
Q : 아이템 - 잠재요인 간 행렬(전치 행렬)
사용자가 매기는 아이템 평점 요인 항목 ➡️ 지극히 주관적!
추천 방식
잠재요인을 고려하여 행렬 인수 분해 수행 시 파라미터 수는 "잠재요인 수"로 감소!
👍 행렬 인수 분해의 추천 시스템 도입 : How does Netflix recommend movies? Matrix Factorization
Footprint(디지털 발자국), Digital Shadow(디지털 그림자)
클릭률
데이터를 모아 추천하고, 아이템이 적절한 추천인지 평가
추천한 제품이 구매로 이어졌는지 여부 확인도 중요
모델 단계에서 추천 결과를 평가하기도 함
사용자와 연관성이 있고 + 구매 직결 데이터를 수집 및 정렬 + 순위를 매겨 평가하는 작업의 반복 ➡️ 적합한 데이터 및 추천 시스템의 중요 요소