소개
게시글
질문&답변
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
- 868
질문&답변
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
- 206
질문&답변
2021.11.26
Neighbor size를 정해서 예측치를 계산하는 함수의 코드 실행 문제
빠르게 답변주셔서 감사합니다. 이웃을 고려한 cf가 정상적으로 작동하는데 이는 1~6번이 정상적으로 작동했기에 가능한 것이 아닐까 싶습니다. 송구스럽지만 코드 샘플을 송부하여 주시면 구체적으로 비교하여 보도록 하겠습니다 감사합니다
- 1
- 4
- 206