EDA
test
이번에 제출횟수가 현저히 적어서 우선 빨리 돌려봤다.
데이터 전처리
- 결측치 처리 개선
- 범주형 변수 인코딩
- 연속형 변수 정규화
- 로그 변환으로 스케일 조정
DeepFM 모델 선택
이유:
- 범주형(Categorical)과 연속형(Continuous) 피처를 모두 잘 다룰 수 있음
- FM 부분에서 피처 간 상호작용을 자동으로 학습
- Deep 부분에서 복잡한 비선형 관계 학습 가능
- 빨리 돌려진다는데
기본 피처:
user_features = [
'user_id', 'age_range', 'location_country', 'location_state', 'location_city',
'user_mean_rating', 'user_rating_count', 'user_rating_std'
]
book_features = [
'isbn', 'book_title', 'book_author', 'publisher', 'language',
'category', 'publication_range',
'book_mean_rating', 'book_rating_count', 'book_rating_std'
]
추가된 상호작용 피처:
# 사용자-책 평균 평점 차이
df['user_book_rating_diff'] = df['user_mean_rating'] - df['book_mean_rating']
# 평점 수 비율 (로그 변환 적용)
df['rating_count_ratio'] = df['user_rating_count'] / df['book_rating_count']
# 평점 표준편차 비율
df['rating_std_ratio'] = df['user_rating_std'] / df['book_rating_std']
로그를 보니 epoch 2에서 가장 좋은 성능(valid loss: 1.429)을 보이고 그 이후로는 오히려 성능이 저하되는 것을 확인
과적합인 것 같음. epoch50에서 20으로 줄이니까 훨씬 나아짐.
그래서 2로 더 줄이면 더 성능 좋아지나? 해서 줄여봤는데 리더보드 제출결과50,20,2 중에서 20이 제일 나은듯