html
Book Crossing 데이터셋을 이용한 추천 시스템 구축
목차
- 1. 데이터셋 선택
- 2. 데이터셋 구조 이해
- 3. 데이터 준비 및 탐색
- 4. 평점 데이터 처리
- 5. 평점 분포 시각화
- 6. 추천 시스템 준비
- 7. 데이터 문제 해결
- 8. 다음 단계
- 결론
다시 돌아오신 것을 환영합니다, 친구들! 이 가이드에서는 추천 시스템 구축에 대해 깊이 살펴보고, 필수 단계들을 개괄할 것입니다. 프로세스를 간소화하기 위해 일부 예비 단계는 이미 다루었으며, 이를 통해 시스템 구축의 핵심 측면에 집중할 수 있습니다.
1. 데이터셋 선택
우리의 추천 시스템을 위해, 책 추천에 맞추어진 포괄적인 컬렉션인 Book Crossing 데이터셋을 사용할 것입니다. Movie Lens 데이터셋은 인기 있고 사용자 친화적이며—종종 YouTube와 같은 플랫폼의 튜토리얼에서 소개되지만—우리는 추천 시스템에 대한 더 깊은 이해를 제공하기 위해 더욱 복잡한 데이터셋을 선택했습니다.
데이터셋 접근:
- Book Crossing 데이터셋: 데이터셋 링크 *(실제 링크로 교체하세요)*
- 형식: SQL 덤프 또는 CSV 파일로 제공됩니다. 우리 목적을 위해, CSV 형식을 사용할 것입니다.
CSV 파일을 다운로드하면, 세 가지 주요 파일을 찾을 수 있습니다:
- Books: 약 75MB
- Users: 약 30MB
- Ratings: 약 12MB
데이터셋의 크기를 고려할 때, 이를 효율적으로 처리하는 것이 중요하지만, 풍부한 데이터는 견고한 추천 시스템을 구축하는 데 있어 매우 유용합니다.
2. 데이터셋 구조 이해
Books 파일:
- 필드: ISBN, 책 제목, 저자, 출판 연도, 출판사, 이미지 URL 등
- 주요 식별자: ISBN (국제 표준 도서 번호)는 각 도서의 고유 식별자로 작동하여 중복을 방지합니다.
Users 파일:
- 필드: 사용자 ID, 위치, 나이
- 주요 식별자: User ID는 각 사용자를 고유하게 식별합니다.
Ratings 파일 (BX 도서 평점):
- 필드: 사용자 ID, ISBN, 도서 평점
- 중요성: 이 파일은 사용자를 그들이 평점한 도서와 연결하여, 추천 시스템의 기반을 형성합니다.
3. 데이터 준비 및 탐색
데이터 조작을 위해 Pandas와 NumPy를, 시각화를 위해 Matplotlib의 Pyplot을 사용할 것입니다.
데이터 로딩:
12345678
import numpy as npimport pandas as pdimport matplotlib.pyplot as plt # Reading the datasets with appropriate separators and encodingbooks = pd.read_csv('books.csv', sep=';', encoding='ISO-8859-1')users = pd.read_csv('users.csv', sep=';', encoding='ISO-8859-1')ratings = pd.read_csv('ratings.csv', sep=';', encoding='ISO-8859-1')
데이터 탐색:
- Books: ISBN을 고유 식별자로 사용하여 각 도서에 대한 상세 정보를 포함합니다.
- Users: 사용자 인구 통계를 포함합니다.
- Ratings: 사용자가 평점한 도서 및 평점 점수를 매핑합니다.
4. 평점 데이터 처리
Ratings 데이터셋은 사용자를 그들의 도서 선호도와 연결하기 때문에 중요합니다. 그러나 이 파일에서 User ID와 ISBN은 고유 키가 아니므로:
- 사용자는 여러 도서에 평점을 매길 수 있습니다.
- 도서는 여러 사용자에 의해 평점을 받을 수 있습니다.
평균 평점 계산:
각 도서의 전반적인 평가를 이해하기 위해, 평균 평점을 계산할 것입니다.
12345678
# Grouping by ISBN and calculating mean ratingsaverage_ratings = ratings.groupby('ISBN').mean().reset_index() # Counting the number of ratings per bookrating_counts = ratings.groupby('ISBN').size().reset_index(name='RatingCount') # Merging average ratings with countaverage_ratings = average_ratings.merge(rating_counts, on='ISBN')
5. 평점 분포 시각화
평점의 분포를 이해하는 것은 잠재적인 편향이나 데이터 희소성 문제를 식별하는 데 도움이 됩니다.
123456
plt.figure(figsize=(10,6))plt.hist(average_ratings['RatingCount'], bins=500, color='skyblue')plt.title('Distribution of Book Ratings')plt.xlabel('Number of Ratings')plt.ylabel('Frequency')plt.show()
통찰:
- 데이터의 왜도: 많은 도서가 매우 적은 사용자에 의해 평점을 받았으며, 소수의 도서는 수천 건의 평점을 받았습니다.
- 의의: 이러한 불균형은 추천 시스템의 성능에 영향을 미쳐, 인기 있는 도서를 우선하는 추천을 초래할 수 있습니다.
6. 추천 시스템 준비
추천 시스템을 구축하기 전에, 데이터를 적절하게 구조화하는 피벗 테이블을 만드는 것이 필수적이며, 일반적으로 사용자는 행, 도서는 열, 평점은 값으로 배치됩니다.
피벗 테이블 생성:
1
pivot_table = ratings.pivot(index='User ID', columns='ISBN', values='Book Rating').fillna(0)
7. 데이터 문제 해결
- 희소성: 많은 도서가 적은 평점을 가지고 있으므로, 행렬 분해와 같은 희소성을 처리하거나 완화할 수 있는 기술을 구현하는 것이 중요합니다.
- 콜드 스타트 문제: 평점이 없는 새로운 사용자나 도서의 경우, 콘텐츠 기반 필터링이나 사용자 인구 통계를 활용하는 전략이 유용할 수 있습니다.
8. 다음 단계
다음 튜토리얼에서는 피벗 테이블을 자세히 구축하고, 협업 필터링 기법을 적용하며, 데이터셋의 복잡성을 효과적으로 처리하기 위해 추천 시스템을 최적화하는 방법을 탐구할 것입니다.
결론
Book Crossing 데이터셋을 사용하여 추천 시스템을 구축하는 것은 대규모의 실제 데이터셋을 다루는 복잡함을 강조하며, 포괄적인 학습 경험을 제공합니다. 데이터 구조를 이해하고, 희소성과 같은 문제를 해결하며, 체계적으로 데이터를 준비함으로써, 효과적이고 신뢰할 수 있는 추천 시스템을 만드는 견고한 기반을 마련하게 됩니다.
즐거운 코딩 되세요!