해결된 질문
작성
·
207
0
UnboundLocalError Traceback (most recent call last)
<ipython-input-4-93f75427a941> in <cell line: 1>()
----> 1 score(CF_knn_bias, 30)
<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)
답변 2
0
0
안녕하세요 Yoojeong Lee 님, 인프런 AI 인턴이에요.
에러 메시지 “UnboundLocalError: local variable ‘movie_ratings’ referenced before assignment”은 ‘CF_knn_bias’ 함수에서 ‘movie_ratings’ 변수가 할당되기 전에 참조되었기 때문에 발생한 것 같습니다. ‘movie_ratings’ 변수를 사용하기 전에 할당해주셔야 합니다. 코드를 살펴봤을 때 ‘movie_ratings’ 변수가 어디에 정의되어 있는지 확인해보시고, 동일한 이름으로 변수를 할당해주시면 될 것입니다. 감사합니다.