개발공부

아이템 기반 협업 필터링(Item based collaborative filtering), corr()의 min_peiods 파라미터 본문

Python/Machine Learning

아이템 기반 협업 필터링(Item based collaborative filtering), corr()의 min_peiods 파라미터

mscha 2022. 5. 13. 17:58

협업필터링 (Collaborative Filtering)

사용자와 item 간의 rating을 이용해서 사용자끼리 유사도를 찾는 방식이다.

특정 사용자와 유사한 사용자들이 남긴 평점, 상품구매 이력등 행동양식 기반으로 예측해서 추천해준다.

그래서 item을 얼마나 좋아할 것인지를 수치적으로 예측한다.

 

아이템기반 협업필터링 (Item based collaborative filtering)

사용자가 아니라 아이템을 파라미터로 하여 협업필터링하는 방법이다.

이템 기반 협동적 필터링은 대부분의 사람들이 과거에 자신이 좋아했던 상품과 비슷한 상품이면 좋아하는 경향이 있고 반대로 싫어했었던 상품과 비슷한 상품이면 싫어하는 경향이 있다는 점을 기반으로 하고 있다.

이 필터링 방법은 고객이 선호도를 입력한 기존의 상품들과 예측하고자 하는 상품과의 유사도(similarity)를 계산하여 고객의 선호도를 예측하는 방법이다. 

 

사용자가 각 영화에 대해 평점을 어떻게 입력했는지에 대한 데이터 프레임으로 예를 들어보자.

 

분별력 있는 결과를 위해 우리는 영화에 대한 평가가 80개 이상 있는 것으로만 사용해보자.

최소 80개 이상 데이터가 들어있는 것들만 상관계수를 뽑으면 corr()의 min_periods를 이용하면 된다.

# 최소 80개이상 데이터가 있는 것만 상관계수 뽑아라
movie_corr = df.corr(min_periods= 80)

movie_corr

 

이제 내가 아래와 같은 영화에 대한 평점을 남겼을 때, 추천하는 영화가 무엇인지 구해보자.

# 1. 내가 본 영화의 이름을 가져온다.
# 내가 본 영화는 여러개일 수 있기 때문에, 반복문을 사용한다.

for i in range(myRatings.shape[0]) :
    movie_name = myRatings['Movie Name'][i]
    recom_movies = movie_corr[movie_name].dropna().sort_values(ascending = False).to_frame()
    recom_movies.columns = ['correlation']
    recom_movies['weight'] = myRatings['Ratings'][i] * recom_movies['correlation']
    similar_movies_list = similar_movies_list.append(recom_movies)
# 2. weight 로 정렬한다. 
# 이 이유는 내가 남긴 평점에 따라 추천하는 정도가 달라지기 때문이다.
similar_movies_list = similar_movies_list.sort_values('weight', ascending = False)
similar_movies_list

# 3. 내가 본 영화는, 이 데이터 프레임에서 삭제한다.
drop_index = myRatings['Movie Name'].to_list()

for name in drop_index :
    if name in similar_movies_list.index :
        similar_movies_list.drop(name, axis = 0, inplace = True)

similar_movies_list

# 3. 추천영화가 중복되는 경우도 발생한다.
# 따라서, 중복된 영화가 있을 경우는, 웨이트가 가장 높은 값으로만 추천해준다.
# 즉, 영화 이름별로, 웨이트가 가장 높은 데이터를 가져와서, 웨이트로 정렬해준다.
similar_movies_list.reset_index(inplace = True)
similar_movies_list.groupby('title')['weight'].max().sort_values(ascending = False)