inflearn logo
강의

Course

Instructor

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

CF considering neighbors

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

Resolved

1163

Mizue Lee

3 asked

0

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'

계속해서 강의를 돌려보면서 에러를 찾아보고 있는데 어디서 오류나 오타가 발생했는지 찾지 못하겠습니다

딥러닝 추천-시스템

Answer 2

0

Mizue Lee

안녕하세요.

전체 코드입니다.

CF_knn

import os
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

## 데이터 불러오기 및 필요한 함수 정의
base_src = 'drive/MyDrive/SCIT/colab/deep_learning_data'
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')

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')

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')

def RMSE(y_true, y_pred):
  return np.sqrt(np.mean((np.array(y_true) - np.array(y_pred)) ** 2))

# 유사집단의 크기를 미리 정하기 위해서 기존 score 함수에 neighbor_size 인자값 추가
def score(model, neighbor_size = 0) :
  # 테스트 데이터의 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)
ratings_matrix = x_train.pivot(index = 'user_id', columns = 'movie_id', values = 'rating')

# train set의 모든 가능한 사용자 pair의 cosine similarities 계산
# 코사인 유사도를 계산하는 사이킷런의 라이브러리
from sklearn.metrics.pairwise import cosine_similarity
# 코사인 유사도를 구하기 위해 rating 값을 복사하고, 계산 시 NaN값 에러 대비를 위해 결측치를 0으로 대체
matrix_dummy = ratings_matrix.copy().fillna(0)
# 모든 사용자간 코사인 유사도 구하기
user_similarity = cosine_similarity(matrix_dummy, matrix_dummy)
# 필요한 값 조회를 위해 인덱스 및 컬럼명 지
user_similarity = pd.DataFrame(user_similarity,
                               index = ratings_matrix.index,
                               columns = ratings_matrix.index)

# 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

# 정확도 계산
score(CF_knn, neighbor_size = 30)

실제 사용자 추천 기능은 질문글에 올린 부분이 전부입니다.

1

거친코딩

안녕하세요.

image위 코드 중에서 user_similatiry 라는 오타가 있었네요.

수정 후 실행 부탁드립니다.

감사합니다.

거친코딩 드림.

0

거친코딩

안녕하세요.

거친코딩입니다.

 

CF_knn 위에 코드인 user_similarity를 계산하는 부분을 확인해야할 것 같은데,

전체 코드를 올려주실 수 있으실까요?

 

감사합니다.

거친코딩 드림.

강의 자료 이게 맞나요?

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

local variable 'movie_ratings' referenced before assignment

0

256

2

3장 CF_knn 코드 질문

0

260

1

IntCastingNaNError: 관련 에러

0

436

1

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

0

343

1