inflearn logo
강의

Course

Instructor

(UPDATED) Personalized Recommendation Systems using Python | Recommendation Algorithms | Recommendation AI

CF considering user evaluation trends

local variable 'movie_ratings' referenced before assignment

Resolved

256

Yoojeong Lee

2 asked

0

안녕하세요, 사용자의 평가경향을 고려한 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)  

딥러닝 추천-시스템

Answer 2

0

거친코딩

안녕하세요. 학습자님 :)

위 에러 통해선 정확히 문제 파악이 어려운데,

작성하신 풀코드를 전달주실 수 있으실까요?

감사합니다.

거친코딩 드림.

0

communityai8509

안녕하세요 Yoojeong Lee 님, 인프런 AI 인턴이에요.
에러 메시지 “UnboundLocalError: local variable ‘movie_ratings’ referenced before assignment”은 ‘CF_knn_bias’ 함수에서 ‘movie_ratings’ 변수가 할당되기 전에 참조되었기 때문에 발생한 것 같습니다. ‘movie_ratings’ 변수를 사용하기 전에 할당해주셔야 합니다. 코드를 살펴봤을 때 ‘movie_ratings’ 변수가 어디에 정의되어 있는지 확인해보시고, 동일한 이름으로 변수를 할당해주시면 될 것입니다. 감사합니다.

강의 자료 이게 맞나요?

0

67

3

6장 Keras로 MF 구현하기 학습 결과

0

163

2

초심자의 질문

0

116

1

코드 공유 폴더가 비어 있습니다.

0

186

1

코드 공유 관련 부탁드립니다.

1

260

2

section 4 네번째 강의에서 pd.merge(x_train, users) 에러 발생

0

289

1

section 2 네번째 강의 score(cf_gender) 실행하면 Error 발생합니다.

0

201

1

MF알고리즘에서 질문이있습니다.

0

365

1

ean_rating = np.dot(sim_scores,movie_ratings) / sim_scores.sum() 부분에서 질문이있습니다.

0

310

1

score를 실행하면 항상 nan이 출력됩니다

0

327

1

user_id가 인덱스범위를 벗어난 값으로 들어옵니다

0

255

1

인덱스 칼럼은 어떻게 접근해야하나요

0

226

1

제공해주신 데이터링크에 들어가면 404가 뜨는데요?

0

364

1

코드 자동완성 속도가 상당히 느린데 개선할 방법이 있을까요?

0

302

1

ValueError: setting an array element with a sequence

0

472

1

users에 대한 인덱스 설정 기준

0

288

1

ppt 자료

0

286

1

train_test_split에 관한 질문입니다.

0

330

1

Timestamp 제거 이유

0

395

1

사용자 집단별 추천 강의 11:56 부분에 성별에 따른 예측값 계산에서 MergeError가 발생합니다.

0

435

1

3장 CF_knn 코드 질문

0

260

1

실습 중 에러 'numpy.ndarray' object has no attribute 'drop'

0

1163

2

IntCastingNaNError: 관련 에러

0

436

1

인구통계학적 추천 알고리즘

0

343

1