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이 제일 나은듯