44,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
MF알고리즘에서 질문이있습니다.
안녕하세요! 강의를 듣다 응용해보는 과정에서 질문이있습니다. 한번 학습시킨 모델에서 사용자의 데이터를 더 추가해서 동적으로 모델을 업데이트 시키고 싶습니다. 그래서 온라인학습을 진행하려고 하는데, sgd메서드에 데이터를 전달하여 업데이트를 진행하는 방식은 어떻게 생각하시는지 여쭤봐도되겠습니까? 감사합니다!
- 해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
ean_rating = np.dot(sim_scores,movie_ratings) / sim_scores.sum() 부분에서 질문이있습니다.
ean_rating = np.dot(sim_scores,movie_ratings) / sim_scores.sum()이부분에서 sim_scores.sum()값은 항상 0이 아닌게 보장이 되는건가요? 직접 데이터를 생성해서 테스트 해보면 음수이거나 0일때도 있더라구요!... 데이터가 잘못된건지 아니면 0일수도 있는건지 궁금합니다.
- 해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
score를 실행하면 항상 nan이 출력됩니다
안녕하세요! score를 실행할때마다 nan이 출력이되서 잘못쓴 부분이 있나 여러번 체크해봤는데 도저히 모르겠어서 질문남겨봅니다..import pandas as pdimport osimport numpy as npfrom sklearn.model_selection import train_test_split# 사용자 u.user파일을 DataFrame으로 열기base_src = './drive/MyDrive/RecoSys/Data'os.listdir('./drive/MyDrive/RecoSys/Data')###### 데이터불러오기 ###### os.path.join -> 경로 합치기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')users.head()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','FilmNoir','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')movies.head()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')# ratings = ratings.set_index('user_id')ratings.head()# 실제값과 예측값을 넣기def RMSE(y_true, y_pred):return np.sqrt(np.mean((np.array(y_true) - np.array(y_pred)) **2 ))# # 모델별 RMSE를 계산 하는 함수def score(model, neighbor_size=0):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')# 코사인 유사도 계산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_movie_ratings = movie_ratings[movie_ratings.isnull()].index# print(none_movie_ratings)moive_ratings = movie_ratings.dropna()sim_scores = sim_scores.drop(none_movie_ratings)# print(sim_scores)# 여기까지는 동일(0일 경우는 일반적인 cf)if neighbor_size == 0:mean_rating = np.dot(sim_scores,movie_ratings) / sim_scores.sum()else:# 나와 유사한 사람이 없는경우if len(sim_scores)>1:# 5명을 10개로 나눌수 없으니까 최소값으로 해줘야한다neighbor_size = min(neighbor_size,len(sim_scores))sim_scores = np.array(sim_scores)movie_ratings = np.array(movie_ratings)# simscore가 작은 순서대로 작은 유저아이디를 넣는다user_idx = np.argsort(sim_scores)sim_scores = sim_scores[user_idx][-neighbor_size:]## sim_scores 즉, 유사도를 뽑아냈으면 무비평가값을 뽑아내movie_ratings = movie_ratings[user_idx][-neighbor_size:]mean_rating = np.dot(sim_scores, movie_ratings) / sim_scores.sum()else:mean_rating = 3.0# movie_id가 rating train pivot table에 포함되지 않을 경우else:mean_rating = 3.0return mean_rating# 정확도 계산score(CF_knn,neighbor_size=30)#### 실제 주어진 사용자에 대해 추천을 받는 기능 구현(테스트 데이터와 훈련데이터를 만들필요가없다) ####ratings_matrix = ratings.pivot_table(values='rating', index = 'user_id', columns='movie_id')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)def recom_movie(user_id, n_items, neighbor_size):# 해당 유저가 평가한 영화가 나온다user_movie= ratings_matrix.loc[user_id].copy()for movie in ratings_matrix.columns:# 현재 영화평점이 null이 아닌 경우 -> 영화를 본경우는 추천 리스트에서 제외하기 위해if pd.notnull(user_movie.loc[movie]):user_movie.loc[movie] = 0else:user_movie.loc[movie] =CF_knn(user_id,movie,neighbor_size)movie_sort = user_movie.sort_values(ascending=False)[:n_items]recom_movie = movies.loc[movie_sort.index]recommendation = recom_movie['title']return recommendationrecom_movie(user_id = 729, n_items=5, neighbor_size=30)score(CF_knn,neighbor_size=30) + gpt한테 물어보니 none_rating_idx = movie_ratings[movie_ratings.isnull()].index moive_ratings = movie_ratings.dropna() sim_scores = sim_scores.drop(none_rating_idx)이 부분을 movie_ratings = movie_ratings.dropna() sim_scores = sim_scores.loc[movie_ratings.index]이렇게 변경해라해서 수정했더니 nan이 아닌 실수값이 나오기는 하는데 올바른 방법인지를 모르겠습니다. 그래도 같은 방법인거같긴 한데 어디서 차이가 발생하는건지 잘 모르겠습니다!
- 해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
user_id가 인덱스범위를 벗어난 값으로 들어옵니다
# Gender 기준 추천 def cf_gender(user_id,movie_id): if movie_id in rating_matrix.columns: # print(user_id) 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 # 훈련셋에 movie_id가 없을수도있다. 25%만 할당했기때문에 else: gender_rating = 3.0 return gender_rating score(cf_gender)안녕하십니까! Gender기준 추천쪽에서 오류가 발생해서 질문드립니다.이 부분에서 users는 942까지만 인덱스가 있는데, user_id는 943이 들어와서 ValueError: 943 is not in range라는 오류가 발생하더라구요..!예외처리를 따로 해줘야하는건가요?
- 해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
인덱스 칼럼은 어떻게 접근해야하나요
# 데이터 train, test set 분리 from sklearn.model_selection import train_test_split x = ratings.copy() y = ratings['user_id']저는 ratings의 user_id를 인덱스로 설정하고 저렇게 접근을 하니 keyError가 발생합니다.인덱스를 설정한 칼럼은 어떻게 접근해야하나요?
- 해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
제공해주신 데이터링크에 들어가면 404가 뜨는데요?
제공해주신 데이터링크에 들어가면 404가 뜹니다. 확인부탁드립니다
- 해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
코드 자동완성 속도가 상당히 느린데 개선할 방법이 있을까요?
가령 item_similarity라는 변수를 칠 때 item까지만 치면 item으로 시작하는 변수들의 추천목록을 보여주는데 이 목록이 띄워지는 속도가 약 4초 정도 걸립니다. 강의영상에서 보면 타이핑을 하자마자 바로바로 뜨는 것을 확인할 수 있었는데 혹시 개선할만한 방안이 있을까요?
- 해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
ValueError: setting an array element with a sequence
아래 부분에서 불균일한 데이터임을 나타내는 에러가 발생하는데 이유를 못찾겠습니다.전체 코드입니다.from inspect import Signature import os import pandas as pd import numpy as np from sklearn.model_selection import train_test_split ### 데이터 불러오기 및 필요한 함수 정의 ### # user 데이터 base_src = 'drive/MyDrive/RecoSys/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') # 정확도(RMSE)를 계산하는 함수 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): id_pairs = zip(x_test['user_id'],x_test['movie_id']) # user_id와 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') # 코사인 유사도 계산 # train set의 모든 가능한 사용자 pair의 cosine similarity 계산 from sklearn.metrics.pairwise import cosine_similarity 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) rating_bias = (rating_matrix.T - rating_mean).T # 평점 평균에 대한 편차 ##################################### rating_binary_1 = np.array(rating_matrix > 0).astype(float) # 0 초과의 값이 있는 셀은 true, 나머지는 false로 rating_binary_2 = rating_binary_1.T counts = np.dot(rating_binary_1, rating_binary_2) counts = pd.DataFrame(counts, index=rating_matrix.index, columns=rating_matrix.index).fillna(0) def CF_knn_bias_sig(user_id, movie_id, neighbor_size=0): if movie_id in rating_bias: sim_scores = user_similarity[user_id].copy() movie_ratings = rating_bias[movie_id].copy() no_rating = movie_ratings.isnull() # 평가가 없는 common_counts = counts[user_id] # 주어진 user_id를 기준으로 다른 user들과 공통으로 평가한 영화의 개수들을 담은 배열 low_significance = common_counts < SIG_LEVEL # 공통 평가한 영화 개수가 미리 정해진 level보다 낮은 사용자에 대해 false 처리 none_rating_idx = movie_ratings[no_rating | low_significance].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) > MIN_RATINGS: 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 else: prediction = rating_mean[user_id] else: prediction = rating_mean[user_id] # RMSE 개선을 위한 조정 # if prediction <= 1: # prediction = 1 # elif prediction >= 5: # prediction = 5 return prediction SIG_LEVEL = 3 MIN_RATINGS = 3 score(CF_knn_bias_sig, 30)
- 해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
users에 대한 인덱스 설정 기준
아래 코드와 같이 users에 대해 user_id 칼럼을 인덱스를 설정할 때와 하지 않을 때 각각 다른 부분에서 에러가 납니다. 떄에 따라 인덱스로 잡아야할 때도 있고 잡지 않아야 할때도 있는 거라면 그 기준이 무엇일지 궁금합니다.users = users.set_index('user_id')인덱스로 잡았을 때의 에러)인덱스로 잡지 않았을 때의 에러)
- 해결됨Python을 이용한 개인화 추천시스템 | 추천알고리즘 | 추천인공지능
ppt 자료
ppt 자료가 아래와 같은 화면이 뜨면서 열리지가 않는데 뭐가 문제인 걸까요..?
- 해결됨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에 들어가있는 특정 사용자가 평가한 특정 영화에 대한 순서와 동일하게 삽입이 되는지 궁금합니다.