• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    해결됨

3장 CF_knn 코드 질문

23.10.12 10:43 작성 23.10.12 16:26 수정 조회수 148

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를 하니 유사도와 영화에 대한 평점이 각각 곱해지고 더해집니다.

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

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

 

감사합니다.

거친코딩 드림.

 

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

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

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