게시글
질문&답변
2021.12.03
실습 중 에러사항이 발생했습니다
아래와 같이 전처리 하였습니다~! import os import pandas as pd import numpy as np users = pd.read_csv('drive/MyDrive/capstone/users.csv', encoding='UTF-8') ratings = pd.read_csv('drive/MyDrive/capstone/ratings.csv', encoding='UTF-8') courses = pd.read_csv('drive/MyDrive/capstone/courses.csv', encoding='UTF-8') import os import pandas as pd import numpy as np # 인기 제품 방식 추천 Function def recom_courses(n_courses): courses = courses.set_index('course_id') course_mean=ratings.groupby(['course_id'])['rating'].mean() course_sort=course_mean.sort_values(ascending=False)[:n_courses] recom_courses=courses.loc[course_sort.index] recommendations=recom_courses['title'] return recommendations recom_courses(5)
- 1
- 2
- 1.1K
질문&답변
2021.11.26
Neighbor size를 정해서 예측치를 계산하는 함수의 코드 실행 문제
#사용자 u.user 파일을 DataFrame으로 읽기 import os import pandas as pd import numpy as np from sklearn.model_selection import train_test_split 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): #테스트 데이터의 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_pred=np.array(x_test['rating']) 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 similarities계산 #코사인 유사도를 계산하는 사이킷런의 라이브러리 from sklearn.metrics.pairwise import cosine_similarity #코사인 유사도를 구하기 위해 rating값을 복사하고, 계산 시 NaN값 에러 대비를 위해 결측치를 0으로 대체 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) #Neighbor Size를 정해서 예측치를 계산하는 함수 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() 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 #neighbor size가 10, 20, 30, 40, 50, 60인 경우에 대해서 RMSE를 계산하고 이를 출력한다 for neighbor_size in [10,20,30,40,50,60]: print('neighbor size = %d : RMSE = %.4f' % (neighbor_size, score(CF_knn,neighbor_size))) 거친코딩 선생님 아무리 봐도 찾을수가 없습니다 ㅠ ㅠ 도움을 부탁 드립니다.
- 1
- 4
- 275
질문&답변
2021.11.26
Neighbor size를 정해서 예측치를 계산하는 함수의 코드 실행 문제
빠르게 답변주셔서 감사합니다. 이웃을 고려한 cf가 정상적으로 작동하는데 이는 1~6번이 정상적으로 작동했기에 가능한 것이 아닐까 싶습니다. 송구스럽지만 코드 샘플을 송부하여 주시면 구체적으로 비교하여 보도록 하겠습니다 감사합니다
- 1
- 4
- 275