인프런 커뮤니티 질문&답변

Yoojeong Lee님의 프로필 이미지
Yoojeong Lee

작성한 질문수

Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능

최적의 이웃 크기 결정

3장 CF_knn 코드 질문

해결된 질문

작성

·

195

·

수정됨

0

안녕하세요 좋은 강의 감사합니다.
(1) 코드 주석 관련 질문
3장.ipynb 코드에서 def CF_knn(user_id, movie_id, neighbor_size = 0): if movie_id in rating_matrix.columns: sim_scores = user_similarity[user_id].copy() movie_ratings = rating_matrix[movie_id].copy()
~~
위 부분의 강의 중 코드 주석을 보면
movie_ratings = rating_matrix[movie_id].copy()
이 부분의 주석이 주어진 영화와 다른 사용자의 유사도 추출이라고 되어있는데 영화와 사용자 유사도 추출이 아니라
주어진 영화에 대한 다른 사용자의 평점 추출 같은데 제가 이해한게 맞는지 문의드립니다!

(2) 코드 질문

neighbor_size 가 지정되지 않은경우
mean_rating 으로 대치하는 부분의 코드에서

if neighbor_size == 0 :

mean_rating = np.dot(sim_scores, movie_ratings) / sim_scores.sum()
이라고 되어있는데
mean_rating 이 전체 user_id의 해당 movie_id에대한 평균 평점을 의미하는 것이라면
분모가 sim_scores.sum()이 아니라 유효한 평점의 개수, 즉 len(sim_scores) 이런 게 되어야 하는거 아닌가요?
왜 분자는 평점*유사도인데 나눌때 전체 사용자의 평점 합으로 나누는건지 이해가 잘 안갑니다. ㅜㅜ

.

답변 1

0

거친코딩님의 프로필 이미지
거친코딩
지식공유자

안녕하세요.

질문 주신 부분에 답변 드리겠습니다.

일단, 먼저 주석에 대한 부분은 학습자님께서 말씀하신대로 주어진 영화에 대한 다른 사용자의 평점 추출이 맞습니다.

이 부분은 오타가 있었던 것 같습니다.

 

두번째 부분에 대해서는, 가중평균에 대한 부분이기 때문입니다.

학습자님께서 말씀주신대로 산술평균으로 계산한다면 그렇게 계산할 수 있습니다.

예를 들어, 학생의 총 과목 평균

국어 100, 수학 90, 영어 80 => (100 + 90 + 80) / 3 = 270 / 3 = 90점

 

만약에 각 과목별로 가중치(=중요도)가 있다면 어떨까요

국어 중요성 : 2, 수학 중요성 : 3, 영어 중요성 : 4

[ (100 X 2) + (90 X 3) + (80 X 4) ] / (2+3+4) = 87.777777

 

 

산술평균은 가중평균에서 가중치를 동일하게 1로 주셨다고 이해 하시면 될 것 같습니다.

해당 예시를 저희 데이터셋으로 가져와보면

dot product를 하니 유사도와 영화에 대한 평점이 각각 곱해지고 더해집니다.

여기서 가중치가 유사도라고 이해해주시면 될 것 같습니다.

그렇기 때문에 길이가 아닌, 가중치의 합(=유사도합)으로 계산되게 됩니다.

 

감사합니다.

거친코딩 드림.

 

Yoojeong Lee님의 프로필 이미지
Yoojeong Lee
질문자

안녕하세요! 말씀 주신 가중평균 기반의 평점 산출에 대해 또다른 궁금증이 생겨서 문의드립니다!

실제 데이터에서는 평점 데이터가 준비된 경우가 아닌, transaction / 시청기록 / session history 같은 사용자와 아이템의 interaction data 에서 피쳐를 만들어서 rating rule 을 만들어서 평점을 계산하는 것이 일반적일텐데요,
이 경우에 가장 직관적이고 널리 사용되는 '선호도' 라는 컨셉을 변수화 할 때 주로

해당 유저의 전체 history 대비 해당 아이템에 대한 history 의 비율 (예를 들면 A상품 구매횟수 / 전체 상품 구매횟수) 지표를 먼저 떠올리게 되는것같습니다.
하지만 위의 rating에서의 사용자간 영향도의 차이 이슈처럼, (그래서 대안으로 가중평균이 사용되는 것처럼)
유저별로 단순 비율수치를 선호도로 환원할 경우 - 해당유저의 상품별 구매횟수의 평균/표준편차 가 유저별로 다 다르니 동일한 선호도 지표로 볼 수 없을 것 같습니다.
이럴 때 주로 사용되는 표준화 기법이 z-score, min-max 등이 있을 것 같은데
실제 기업의 운영데이터를 통해 이러한 선호도를 계산할때는 연산량과 효율성도 고려를 해야 할 것 같아서 혹시 이런 유저간의 데이터 분포 차이를 통일 시켜줄 수 있는 '선호도'를 산출하는 좋은 방법이 있는지, 실제 인더스트리에서 활용되는 예시들이 있는지 알려주실 수 있나요?

Yoojeong Lee님의 프로필 이미지
Yoojeong Lee

작성한 질문수

질문하기