Python/Pandas

[Pandas] set_categories 사용하기.

언킴 2022. 12. 3. 00:45
반응형

추천 시스템을 구축할 때 데이터를 학습 데이터와 검증 데이터 그리고 테스트 데이터로 분할하여 사용한다. 이때 학습 데이터는 모델을 학습하기 위한 용도로 사용하고 검증 데이터는 모델의 하이퍼 파라미터를 최적화하기 위해 사용한다. 마지막으로 테스트 데이터는 최종 모델의 성능을 확인하는 용도로 사용한다. 

 

추천 시스템을 구축할 때 만약 검증 데이터와 테스트 데이터에는 존재하지만 학습 데이터에는 존재하지 않는 사용자의 경우 학습한 데이터가 없기 때문에 실제 사용자에게 제품을 추천할 수 없게 된다. 따라서, 학습 데이터에 존재하는 사용자를 기반으로 실험을 진행하는 것이 중요하다. 이때 사용되는 것이 바로 Pandas에 set_categories 함수이다. 

 

sample = pd.DataFrame({'user_id': ['a', 'b', 'c', 'd', 'e']})
sample.loc[:, 'user_id'] = sample.loc[:, 'user_id'].astype('category')

total_users = sample.loc[:, 'user_id'].cat.categories

sample.loc[:, 'user_id'] = sample.loc[:, 'user_id'].cat.set_categories(total_users)

위와 같은 데이터가 있다고 가정하자. 그러면 먼저 astype을 사용하여 원래 데이터를 categorical 변수로 변환하는 작업을 먼저 수행하여야 한다. 그후 cat.categories를 통해 전체 사용자의 unique한 값을 가져온다. 이때 cat을 사용하는 이유는 sample.loc[:, 'user_id']가 Series로 구성되어 있기 때문이다. 만약 sample.loc[:, ['user_id']]로 된 경우에는 cat을 따로 선언하지 않고 바로 categories를 사용하여도 된다. 

 

이와 같이 total_users를 가져온 후 set_categories를 통해 카테고리를 설정해준다. 그 다음으로는 검증 데이터 혹은 테스트 데이터에 동일한 카테고리를 선언한 후 학습 데이터에 존재하는 데이터만을 추출해 사용한다. 

valid = pd.DataFrame({'user_id': ['a', 'b', 'z', 'q']})

valid.loc[:, 'user_id'] = valid.loc[:, 'user_id'].astype('category')

valid.loc[:, 'user_id'] = valid.loc[:, 'user_id'].cat.set_categories(total_users)

valid

#	user_id
#0	a
#1	b
#2	NaN
#3	NaN

실행을 하게 된다면 위와 같은 결과가 도출된다. 우리가 생성한 임의의 검증 데이터셋에는 학습 데이터에서는 없었던 z, q가 존재한다. 그렇기 때문에 set_categories를 수행하게 된다면 학습 데이터에 존재한 a, b는 그대로 남고, 학습 데이터에는 존재하지 않고 검증 데이터에만 존재하는 z, q에 대해서는 NaN 값을 반환한다. 그 후 dropna 함수를 사용하여 결측치를 제거하면 된다.