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

Jongsoo Park님의 프로필 이미지
Jongsoo Park

작성한 질문수

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

추천 시스템의 성과측정지표

Full matrix를 사용자 데이터와 merge 하는 것과 gender기준 추천 모델에서 실제 추천을 받는 방법 질문 입니다.

해결된 질문

작성

·

320

1

데이터에 실제 데이터를 투입하여 실습을 하는 중 궁금한 점이 생겨 질물 드립니다.

 

1. Full matrix를 사용자 데이터와 merge 하는 과정에서

Merge가 되지 않는 오류가 발생했습니다.

데이터는 아래와 같습니다.

 

2. gender기준 추천 모델에서 정확도만 계산했는데

남성 혹은 여성에게 적합한 영화를 추천을 받기위해서는 어떠한 코드를 입력해야 하는지 궁금합니다.

 

답변 3

1

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

안녕하세요. 학습자님 !

열심히 강의를 시청하시면서 학습해주시는 모습 감동입니다 :)

첫 번째 질문의 경우)

user 데이터와 x_train 데이터를 user_id기준으로 merge 시키려고 하신 것 같습니다.

하지만 x_train의 경우 user_id가 컬럼이 아닌 인덱스로 지정되어 있네요.

그래서 x_train = x_train.reset_index()를 통해서 인덱스 값을 컬럼으로 이동시키는 작업 후에

pd.merge(user,x_train,on='user_id') 이렇게 진행하시면 되겠습니다.

 

두 번째 질문의 경우)

def cf_gender(user_id,movie_id):
    # x_train으로 만든 pivot 테이블에 movie_id가 있으면 진행, 없으면 기본값 3.0 예측치로 간주
    if movie_id in rating_matrix.columns:
        # 예측 대상자의 성별을 users에서 구해온다. 
        gender = users.loc[user_id]['sex']
        # 예측 대상 영화가 해당 성별의 평균을 가지고 있는지 확인
        # 간혹 사용자가 적은 영화의 경우 남성 혹은 여성 사용자 중에서 영화 평가한 사람이 없으면 없는 영화라 간주할 수 있음
        if gender in g_mean[movie_id].index:
            gender_rating = g_mean[movie_id][gender]
        else:
            gender_rating = 3.0
    else:
        gender_rating = 3.0
    return gender_rating
score(cf_gender)

위 score는 단순 모델의 성능을 검증하기 위함 이었습니다.

그래서 실제로 모델을 활용하실 때는 상황에 따라 다르겠지만,

전체 유저에게 모든 영화에 대한 예측 평점값을 계산한다고 가정했을 때

user 한명당 위 모듈을 활용하셔서 모든 영화에 대한 평점을 계산하시고

그 평점 값중 가장 높은 것을 선택해서 리턴해주는 방식을 취할 수 있습니다.

모델 활용에 대해서는 어느정도 각자 도메인의 상황이나 아이디어에 따라 달라질 수 있기 때문에,

이번 강의에서는 단순 예측 평점, 즉 개인에 대한 각 영화에 대한 선호도만 실습한 것입니다 :)

혹시나 더 궁금하신 점 있으시다면 편하게 댓글 남겨주세요!

학습자님의 성공적인 학습을 기원합니다.

감사합니다.

-거친코딩 드림-

Jongsoo Park님의 프로필 이미지
Jongsoo Park
질문자

강사님 지속적인 질문에도 친절하게 답변해 주셔서 감사드립니다.

말씀해 주신 내용으로 수정하여 merge를 완료 하였으나

x_train을 피벗하는 과정에 오류가 발생하였습니다...

여러 방법으로 애러사항을 조치하였지만 역부족이라 부득이하게 여쭤봅니다..

 

 

 

 

 

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

안녕하세요!

데이터 머지는 성공적으로 잘 하셨네요!

Pivot을 보니까 이미 x_train에다가 user_id로 인덱스를 지정한 상황에서 pivot index를 user_id로 지정을 또 하셔서 그런 것 같습니다.

제가 봤을 때 x_train은 set_index 처리 안하셔도 될것같습니다.

한번 해보시구 댓글 부탁드려요😊

Jongsoo Park님의 프로필 이미지
Jongsoo Park
질문자

index를 없애면 피벗이 완료가 되지만

정말 index가 없어지는 상황이 발생하네요..

 

0

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

안녕하세요!

혹시 학습자님이 받으신 에러를 해당 링크를 통해서 해결 가능하실까요~?

그래도 해결이 만약 힘드시다면 제가 데이터 샘플 몇개 받아서 테스트해보겠습니다:)

열심히 학습하시는 학습자님 응원합니다.!! 

감사합니다.

 

-거친코딩 드림-

Jongsoo Park님의 프로필 이미지
Jongsoo Park
질문자

와 정말 대단하십니다..!

 

Raw data를 정제했더니 바로 되었습니다!

 

감사합니다!!

 

 

추가적으로  위에 여쭤본 질 문 중 성별 기준으로 추천하는 모델의 성능을 검증하기 위한 코드가 있었습니다.

이 부분에서 성별에 따른 추천 혹은 성별 & 직업에 따른 추천등을 적용해 보고 싶은데 

구체적으로 어떠한 방법이 있을지 여쭤봐도 될까요?

 

<이전 질문의 답변>

위 score는 단순 모델의 성능을 검증하기 위함 이었습니다.

그래서 실제로 모델을 활용하실 때는 상황에 따라 다르겠지만,

전체 유저에게 모든 영화에 대한 예측 평점값을 계산한다고 가정했을 때

user 한명당 위 모듈을 활용하셔서 모든 영화에 대한 평점을 계산하시고

그 평점 값중 가장 높은 것을 선택해서 리턴해주는 방식을 취할 수 있습니다.

모델 활용에 대해서는 어느정도 각자 도메인의 상황이나 아이디어에 따라 달라질 수 있기 때문에,

이번 강의에서는 단순 예측 평점, 즉 개인에 대한 각 영화에 대한 선호도만 실습한 것입니다 :)

혹시나 더 궁금하신 점 있으시다면 편하게 댓글 남겨주세요!

학습자님의 성공적인 학습을 기원합니다.

감사합니다.

-거친코딩 드림-

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

안녕하세요.

해결되셨다니 다행입니다.!

말씀해주신대로 성별 그리고 성별 & 직업 이런식으로 추천을 한다고 했을 경우에는

제가 구체적으로 코드를 짜드릴 수는 없지만 이전 질문 답변을 드린대로 코드 로직을 짜시면 되는데,

한 가지 주의할 점은 많은 조건을 동시에 (and)조건으로 걸다보면 샘플에 대한 파이가 작아질 수 있기 때문에 성능 저하를 불러일으킬 수 있습니다.

그래서 각 도메인 지식 혹은 비즈니스적으로 중요하다고 고려되는 변수 세그멘트로만 나누셔서 진행하면 좋을 것 같네요~!

만약 모수가 크다면 상관이 없습니다:)

감사합니다.

-거친코딩 드림-

0

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

학습자님 안녕하세요.!

Pivot은 x_train = x_train.pivot(index='user_id', columns='course_id',values='rating')

그대로 하시구

위에 x_train = x_train.set_index('user_id')를 제거해주시면 되겠습니다!

해보시구 리뷰 부탁드리겠습니다:)

감사합니다.

Jongsoo Park님의 프로필 이미지
Jongsoo Park
질문자

늦은 시간에 수고가 많으십니다.
항상 감사 드립니다.
 
아래와같이 수정하여 실행하였지만...
오류가 발생하였습니다.
 
 
 
 
 
 
 
 
 
#데이터 불러오기
import os
import pandas as pd
import numpy as np
users = pd.read_csv('drive/MyDrive/capstone/users.csv', encoding='UTF-8')
ratings = pd.read_csv('drive/MyDrive/capstone/ratings.csv', encoding='UTF-8')
courses = pd.read_csv('drive/MyDrive/capstone/courses.csv', encoding='UTF-8')
#Train, test set 분리
from sklearn.model_selection import train_test_split
x=ratings.copy()
y=ratings['user_id']

x_train, x_test, y_train, y_test=train_test_split(x,y,
                                                  test_size=0.25,
                                                  stratify=y)
 
#성별에 따른 예측값 계산
merged_ratings=pd.merge(x_train,users)
users=users.set_index('user_id')
 
g_mean=merged_ratings[['course_id','Job','rating']].groupby(['course_id','Job'])['rating'].mean()
rating_matrix=x_train.pivot(index='user_id',
                            columns='course_id',
                            values='rating')
 
 
 
Jongsoo Park님의 프로필 이미지
Jongsoo Park

작성한 질문수

질문하기