묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
train_test_split에 관한 질문입니다.
안녕하세요, 수업을 들으면서 궁금한 점이 생겨 여쭤봅니다. train_test_split() 메소드를 쓰실 때, x 값으로 ratings 을 사용하고, y값으로 user_id 를 사용했는데, 이 부분이 제 직관과 다른것 같습니다. x, y 값을 설정할 땐 학습하려는 데이터를 x, 결과를 얻고싶은 데이터를 y로 설정하는게 맞지 않나요? 즉 여기서는 x를 user_id, movie_id 등으로 설정하고, y를 rating으로 설정하는것이 학습 -> 예측 관계에 맞는것 같아 이부분이 잘 이해되지 않아서 여쭤봅니다. 또한 x데이터 안에 user_id가 이미 있는데, 예측하고자 하는 y를 user_id 로 설정하는 것 또한 잘 이해가 되지 않습니다! 혹시 이부분에 왜 그렇게 했는지 설명 부탁드려도 될까요?
-
해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
Timestamp 제거 이유
안녕하세요! 강의 잘 듣구있습니다 혹시 timestamp를 제거하는 이유가 어떤것인지 자세히 알 수 있을까요? 상품추천 데이터에서 날짜가 변수로 필요한 경우는 없나요?? 또 예를들어 5년치의 고객 구매 데이터를 학습한다고 할때 연도별로 고객 나이가 달라지는데 이때 유니크값을 고객+나이로 해서 해야할지 궁금합니다ㅠㅠ
-
해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
사용자 집단별 추천 강의 11:56 부분에 성별에 따른 예측값 계산에서 MergeError가 발생합니다.
# 성별에 따른 예측값 계산 merged_ratings = pd.merge(x_train,users) users = users.set_index('user_id') g_mean = merged_ratings[['movie_id','sex','rating']].groupby(['movie_id', 'sex'])['rating'].mean() g_mean코드는 이렇게 작성했고요.merged_ratings = pd.merge(x_train,users) 이 부분에서 MergeError: No common columns to perform merge on. Merge options: left_on=None, right_on=None, left_index=False, right_index=False이런 에러가 발생해요. 강의랑 똑같이 했는데 왜 에러가 나는걸까요? ㅠ ㅠ
-
해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
local variable 'movie_ratings' referenced before assignment
안녕하세요, 사용자의 평가경향을 고려한 CF 의 강의 코드를 실습할 때 아래와 같은 에러 메시지가 발생합니다. UnboundLocalError Traceback (most recent call last) <ipython-input-4-93f75427a941> in <cell line: 1>() ----> 1 score(CF_knn_bias, 30) 2 frames<ipython-input-2-7b52bdfa2c05> in score(model, neighbor_size) 38 id_pairs = zip(x_test['user_id'], x_test['movie_id']) 39 # 모든 사용자 - 영화 쌍에 대해 주어진 예측 모델에 의해 예측값 계산 및 리스트형 데이터 생성 ---> 40 y_pred = np.array([model(user, movie, neighbor_size) for (user, movie) in id_pairs]) 41 # 실제 평점값 42 y_true = np.array(x_test['rating']) <ipython-input-2-7b52bdfa2c05> in <listcomp>(.0) 38 id_pairs = zip(x_test['user_id'], x_test['movie_id']) 39 # 모든 사용자 - 영화 쌍에 대해 주어진 예측 모델에 의해 예측값 계산 및 리스트형 데이터 생성 ---> 40 y_pred = np.array([model(user, movie, neighbor_size) for (user, movie) in id_pairs]) 41 # 실제 평점값 42 y_true = np.array(x_test['rating']) <ipython-input-3-d1a9c3391126> in CF_knn_bias(user_id, movie_id, neighbor_size) 10 sim_scores = user_similarity[user_id].copy() 11 movie_scores = rating_bias[movie_id].copy() ---> 12 none_rating_idx = movie_ratings[movie_ratings.isnull()].index 13 movie_ratings = movie_ratings.drop(none_rating_idx) 14 sim_scores = sim_scores.drop(none_rating_idx) UnboundLocalError: local variable 'movie_ratings' referenced before assignment구글링을 해보니 global 변수명을 설정해줘야 한다고 나오는데, 해결이 어려워서 질문 드립니다!강연자님께서 실행한 코드에서는 해당 오류가 발생하지 않아서.. 왜 제 환경에서는 변수명 에러가 발생하는지 알 수 있을까요?아래는 전체 코드 입니다. 감사합니다. import os import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics.pairwise import cosine_similarity ####### 데이터 불러오기 데이터 셋 만들기 ###### base_src = 'drive/MyDrive/RecoSys/Data' # user u_user_src = os.path.join(base_src, 'u.user') u_cols = ['user_id', 'age', 'sex', 'occupation', 'zip_code'] users = pd.read_csv(u_user_src, sep = '|', names = u_cols, encoding = 'latin-1') users = users.set_index('user_id') # item u_item_src = os.path.join(base_src, 'u.item') i_cols = ['movie_id', 'title', 'release date', 'video release date', 'IMDB URL', 'unknown', 'Action', 'Adventure', 'Animation', 'Children\'s', 'Comedy', 'Crime', 'Documentary', 'Drama', 'Fantasy', 'Film-Noir', 'Horror', 'Musical', 'Mystery', 'Romance', 'Sci-Fi', 'Thriller', 'War', 'Western'] movies = pd.read_csv(u_item_src, sep = '|', names = i_cols, encoding = 'latin-1') movies = movies.set_index('movie_id') # rating u_data_src = os.path.join(base_src, 'u.data') r_cols = ['user_id', 'movie_id', 'rating', 'timestamp'] ratings = pd.read_csv(u_data_src, sep = '\t', names = r_cols, encoding= 'latin-1') # rmse def RMSE(y_true, y_pred): return np.sqrt(np.mean((np.array(y_true) - np.array(y_pred))**2)) def score(model, neighbor_size = 0): # test data user_id 와 movie_id pair 맞춰 튜플원소 리스트데이터 id_pairs = zip(x_test['user_id'], x_test['movie_id']) # 모든 사용자 - 영화 쌍에 대해 주어진 예측 모델에 의해 예측값 계산 및 리스트형 데이터 생성 y_pred = np.array([model(user, movie, neighbor_size) for (user, movie) in id_pairs]) # 실제 평점값 y_true = np.array(x_test['rating']) return RMSE(y_true, y_pred) 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) rating_matrix = x_train.pivot(index = 'user_id', columns = 'movie_id', values = 'rating') matrix_dummy = rating_matrix.copy().fillna(0) user_similarity = cosine_similarity(matrix_dummy, matrix_dummy) user_similarity = pd.DataFrame(user_similarity, index = rating_matrix.index, columns = rating_matrix.index) ####### 사용자 평가 경향을 고려한 함수 ######## rating_mean = rating_matrix.mean(axis = 1) # axis=1 (columns), user의 모든 평점의 평균) rating_bias = (rating_matrix.T - rating_mean).T # 해당 유저-아이템 평점 - 사용자의 평점 평균의 편차 #print(rating_bias) #사용자 평가 경향을 고려한 함수 def CF_knn_bias (user_id, movie_id, neighbor_size = 0): if movie_id in rating_bias.columns: sim_scores = user_similarity[user_id].copy() movie_scores = rating_bias[movie_id].copy() none_rating_idx = movie_ratings[movie_ratings.isnull()].index movie_ratings = movie_ratings.drop(none_rating_idx) sim_scores = sim_scores.drop(none_rating_idx) if neighbor_size == 0: prediction = np.dot(sim_scores, movie_ratings) / sim_scores.sum() prediction = prediction + rating_mean[user_id] else: if len(sim_scores) > 1: neighbor_size = min(neighbor_size, len(sim_scores)) sim_scores = np.array(sim_scores) movie_ratings = np.array(movie_ratings) user_idx = np.argsort(sim_scores) sim_scores = sim_scores[user_idx][-neighbor_size:] movie_ratings = movie_ratings[user_idx][-neighbor_size:] prediction = np.dot(sim_scores, movie_ratings) / sim_scores.sum() prediction = prediction + rating_mean[user_id] else: prediction = rating_mean[user_id] else: prediction = rating_mean[user_id] return prediction score(CF_knn_bias, 30)
-
해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
3장 CF_knn 코드 질문
안녕하세요 좋은 강의 감사합니다. (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) 이런 게 되어야 하는거 아닌가요?왜 분자는 평점*유사도인데 나눌때 전체 사용자의 평점 합으로 나누는건지 이해가 잘 안갑니다. ㅜㅜ.
-
해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
실습 중 에러 'numpy.ndarray' object has no attribute 'drop'
CF_knn# Neighbor size를 정해서 예측치를 계산하는 함수 def CF_knn(user_id, movie_id, neighbor_size = 0) : if movie_id in ratings_matrix.columns : sim_scores = user_similarity[user_id].copy() movie_ratings = ratings_matrix[movie_id].copy() none_rating_idx = movie_ratings[movie_ratings.isnull()].index movie_ratings = movie_ratings.dropna() sim_scores = sim_scores.drop(none_rating_idx) if neighbor_size == 0: mean_rating = np.dot(sim_scores, movie_ratings) / sim_scores.sum() else : if len(sim_scores) > 1: neighbor_size = min(neighbor_size, len(sim_scores)) sim_scores = np.array(sim_scores) movie_ratings = np.array(movie_ratings) user_idx = np.argsort(sim_scores) sim_scores = sim_scores[user_idx][-neighbor_size:] movie_ratings = movie_ratings[user_idx][-neighbor_size:] mean_rating = np.dot(sim_scores, movie_ratings) / sim_scores.sum() else : mean_rating = 3.0 else : mean_rating = 3.0 return mean_rating실제 사용자 추천 기능 구현# 실제 주어진 사용자에 대해 추천을 받는 기능 구현 rating_matrix = ratings.pivot_table(values = 'rating', index = 'user_id', columns = 'movie_id') matrix_dummy = rating_matrix.copy().fillna(0) user_similarity = cosine_similarity(matrix_dummy, matrix_dummy) user_similatiry = pd.DataFrame(user_similarity, index = rating_matrix.index, columns = rating_matrix.index) def recom_movie(user_id, n_items, neighbor_size = 30): user_movie = rating_matrix.loc[user_id].copy() for movie in rating_matrix.columns : if pd.notnull(user_movie.loc[movie]): user_movie.loc[movie] = 0 else : user_movie.loc[movie] = CF_knn(user_id, movie, neighbor_size) movie_sort = user_movie.sort_values(ascending = False)[:n_items] recom_movies = movies.loc[movie_sort.index] recommendations = recom_movies['title'] return recommendations recom_movie(user_id=729, n_items = 5, neighbor_size = 30)오류--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-19-1a7001173df4> in <cell line: 26>() 24 return recommendations 25 ---> 26 recom_movie(user_id=789, n_items = 5, neighbor_size = 30) 1 frames <ipython-input-16-ae1c5608a632> in CF_knn(user_id, movie_id, neighbor_size) 29 none_rating_idx = movie_ratings[movie_ratings.isnull()].index 30 movie_ratings = movie_ratings.dropna() ---> 31 sim_scores = sim_scores.drop(none_rating_idx) 32 33 if neighbor_size == 0: AttributeError: 'numpy.ndarray' object has no attribute 'drop'계속해서 강의를 돌려보면서 에러를 찾아보고 있는데 어디서 오류나 오타가 발생했는지 찾지 못하겠습니다
-
해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
IntCastingNaNError: 관련 에러
안녕하세요. ratings = ratings[['user_id', 'movie_id', 'rating']].astype(int) 이 라인을 실행할 때 IntCastingNaNError: Cannot convert non-finite values (NA or inf) to integer라는 에러가 발생합니다. csv로 불러온 'ratings-20m' 데이터인 ratings에 null 값이 있어서 발생하는 에러같은데, 강사님 코드에서는 발생하지 않고 제거에서는 발생하는 이유가 무엇일까요? 그리고 오류를 해결하려면 null값이 있는 행들을 지우면 될까요?
-
해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
인구통계학적 추천 알고리즘
안녕하십니까 선생님 추천시스템을 수강하고 있는 학생입니다!개인적인 질문이 있어 글을 남기게 되었습니다. 혹시 추천시스템 중에 인구통계학 특성을 기준으로 추천해주는 알고리즘이 있을까요?(예를 들어, 성별 나이 소득 거주지 등)많이 알려진 추천시스템들은 보통 아이템을 기반으로 추천해주는 것 같아 궁금하여 여쭤봅니다. 감사합니다.
-
해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
정확도 (0.99, 1.02) 관련 질문있습니다.
동일한 best-seller 모델로train, test 데이터셋으로 split 하기 전에는 정확도가 0.99xxx 였는데, split 하면 1.02xx로 1을 넘어서는 이유는 무엇인가요? 0.99는 99%정확도라는 의미로 알고 있는데, 1.02는 102%라는 의미인지 아니면 1.02%라는 의미인지 헷갈립니다. 그리고 dataset 을 split해서 score 매기면 정확도는 당연히 떨어지는게 맞는거죠?
-
해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
score 함수에 대해 질문이 있습니다.
안녕하세요 이번 강의에서 best_seller 함수에 대해 질문이 있어 글을 남기게 되었습니다. score 함수에서 y_pred는 각 사용자가 평가한 영화의 평점의 평균값이 들어가있는데 y_true는 단순히 x_test의 rating이 들어가고 있습니다. y_true에는 y_pred 의 movie_id 의 순서와 동일하게 들어가야 동일한 영화에 대한 실제값과 예측값에 대한 오차를 확인할 수 있는 것 아닌가요 ? 단순히 np.array(x_test['rating']) 을 사용해도 y_pred array에 들어가있는 특정 사용자가 평가한 특정 영화에 대한 순서와 동일하게 삽입이 되는지 궁금합니다.
-
미해결[개념부터 실습까지] 추천 시스템 입문편
추천시스템 심화 강의는 언제 올라오나요?
안녕하세요.혹시 추천시스템 심화 강의는 언제 올라오는지 알 수 있을까요?
-
해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
4장 SGD를 사용한 MF 기본 알고리즘 오류
안녕하세요좋은 강의 감사합니다. 4장 SGD를 사용한 MF 기본 알고리즘 오류 에서pivot 테이블을 만드는 과정에서 오류가 생겨 질문드립니다.아래와 같은 오류가 생기는데 어떤 이유인지요? 코드가 잘못된 것 같지는 않습니다.pivot 대신 pivot_table 을 쓰니 또 되네요. pivot_table 은 값이 중복인 경우에 첫 값을 쓴다고 되어있는데 올바른 해결책이 맞나요? R_temp = ratings.pivot(index = 'user_id', columns = 'movie_id', values = 'rating').fillna(0)--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-10-bcd5f752ec01> in <cell line: 1>() ----> 1 R_temp = ratings.pivot(index = 'user_id', 2 columns = 'movie_id', 3 values = 'rating').fillna(0) 7 frames /usr/local/lib/python3.10/dist-packages/pandas/core/reshape/reshape.py in _make_selectors(self) 187 188 if mask.sum() < len(self.index): --> 189 raise ValueError("Index contains duplicate entries, cannot reshape") 190 191 self.group_index = comp_index ValueError: Index contains duplicate entries, cannot reshape 추가로 질문드립니다. pivot_table을 사용해도 rmse가 계속 nan이 나오네요저는 코드가 잘못된 부분을 찾기가 힘든데 도움 부탁드립니다.prediction = self.b + self.b_u[i] + self.b_d[j] + self.P[i, :].dot(self.Q[j, :].T) 으로 바꾸어도 같은 오류가 납니다.class MF(): def __init__(self, ratings, hyper_params): self.R = np.array(ratings) self.num_users, self.num_items = np.shape(self.R) self.K = hyper_params['K'] # feature의 개수 self.alpha = hyper_params['alpha'] # learning rate self.beta = hyper_params['beta'] # regularization coef self.iterations = hyper_params['iterations'] # SGD 반복 횟수 self.verbose = hyper_params['verbose'] # 출력 여부 def rmse(self): xs, ys = self.R.nonzero() # R에서 0이 아닌 요소의 index self.predictions = [] self.errors = [] for x,y in zip(xs, ys): prediction = self.get_prediction(x,y) # 평점 예측치 함수 self.predictions.append(prediction) self.errors.append(self.R[x,y] - prediction) self.predictions = np.array(self.predictions) self.errors = np.array(self.errors) return np.sqrt(np.mean(self.errors**2)) def train(self): # P, Q 의 값 초기화 self.P = np.random.normal(scale = 1. / self.K, # 표준편차 설정, mean은 설정 안하면 자동으로 0 size = (self.num_users, self.K)) self.Q = np.random.normal(scale = 1. / self.K, size = (self.num_users, self.K)) self.b_u = np.zeros(self.num_users) # 사용자 평가경향 초기화 self.b_d = np.zeros(self.num_items) self.b = np.mean(self.R[self.R.nonzero()]) # 평점의 전체 평균, 0이 아닌 것에 대해서만 평균을 낸다. rows, columns = self.R.nonzero() # 평점이 있는 요소들의 idx만 가져오겠다는 뜻 --> 나중에 SGD를 적용하기 위해서 self.samples = [(i,j, self.R[i,j]) for i,j in zip(rows, columns)] training_process = [] # SGD 실행될때마다 RMSE 기록 for i in range(self.iterations): np.random.shuffle(self.samples) # 다양한 시작점 지정 self.sgd() rmse = self.rmse() training_process.append((i+1, rmse)) if self.verbose: if (i+1) % 10 == 0: print('Iteration : %d ; train RMSE = %.4f'%(i+1, rmse)) return training_process def get_prediction(self, i,j): # i 유저의 j 번째 아이템에 대한 예측치 # 전체 평점 + 유저의 경향성 + 아이템의 경향성 + i번째 유저의 j번째 아이템에 대한 예측 prediction = self.b + self.b_u[i] + self.b_d[j] + self.P[i, :].dot(self.Q[j, ].T) return prediction def sgd(self): for i,j,r in self.samples: # i,j는 인덱스, r은 평점 prediction = self.get_prediction(i,j) e = (r-prediction) # 오차 # 사용자의 평가경향 업데이트, 4장 슬라이드 10페이지 식 self.b_u[i] += self.alpha * (e - (self.beta * self.b_u[i])) self.b_d[j] += self.alpha * (e - (self.beta * self.b_d[j])) self.P[i,:] += self.alpha * ((e * self.Q[j,:]) - (self.beta * self.P[i,:])) self.Q[j,:] += self.alpha * ((e * self.P[i,:]) - (self.beta * self.Q[j,:])) # 원코드는 pivot_table 대신 pivot 사용 R_temp = ratings.pivot_table(index = 'user_id', columns = 'movie_id', values = 'rating').fillna(0) hyper_params = { 'K':30, 'alpha' : 0.001, 'beta' : 0.02, 'iterations' : 100, 'verbose' : True } mf = MF(R_temp, hyper_params) train_process = mf.train() get_prediction 함수에서 아래를 해보니까, 처음에는 조금 숫자가 나오다가 계속 nan이 나오는데 여기에서 문제가 있는것 같습니다. 근데 원인을 모르겠어요; print(self.b) print(self.b_u[i]) print(self.b_d[j]) print(self.P[i, :].dot(self.Q[j, ].T))
-
해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
2장 사용자집단별 추천 코드 질문
안녕하세요좋은 강의 감사합니다.2장 사용자집단별 추천 부분 코드 질문이 있어서 문의드립니다.def score(model): id_pairs = zip(x_test['user_id'], x_test['movie_id']) y_pred = np.array([model(user,movie) for (user, movie) in id_pairs]) y_true = np.array(x_test['rating']) return RMSE(y_true, y_pred)부분에서요id_pairs는 25000개 인데, 코드를 돌리고 y_pred나 y_true를 출력해보면 168개밖에 안나오더라고요. 이게 무슨 이유 때문인지 잘 이해가 가지 않는데 설명이 가능하실까요? 감사합니다!