Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 1x1 Convolution
- 인접리스트
- 정규화
- SQL
- Depthwise Separable Convolution
- CROSS JOIN
- 연산량 감소
- outer join
- SQLD
- 인접행렬
- resnet
- bottleneck
- skip connection
- dp
- Inductive Bias
- 그래프
- dfs
- mobilenet
- BFS
- numpy
- get_dummies()
- 백준
- SQLD 후기
- 엔터티
- pytorch
- 식별자
- Two Pointer
- feature map
- 데이터모델링
- depthwise convolution
Archives
- Today
- Total
SJ_Koding
Data Dictionary (데이터 딕셔너리) 본문
AI경진대회에서 범주형 데이터의 가변수화를 진행할때, get_dummies()를 test셋에 사용하면 Data Leakage부정행위에 해당된다. test셋은 볼 수 없다는 가정에 위배되기 때문이다.
따라서 Train셋을 기반으로 fit을 진행한 후, Test셋에 대해 transfrom을 진행하는 One-Hot Encoder등을 사용할 수 있다. 이렇게 되면 Train셋을 기반으로 가변수화가 진행되기 때문에 test를 보지 않아도 가능하다.
그런데 문득, 실제 상황에서의 데이터가 떠올랐는데 예를 들어 영화 장르를 기반으로 관객 평점 예측하는 예제를 떠올려보자.
'액션', '드라마', '코미디' 장르의 영화 데이터를 사용할 하여 모델이 학습되었다고 할 때, 'SF영화'가 입력으로 들어올 경우에는 어떻게 처리하는가? 즉, train셋에 없는 범주를 가진 데이터가 들어오면 모델은 어떻게 추정하는가? 혹은 그 반대의 경우는 어떻게 처리하는가? 데이터를 제거하지 않는 이상 처리 할 수 없다.
이러한 경우를 대비해서 실전에서는 Data dictionary 개념이 사용된다. 실무에서는 데이터를 기준으로 가변수화하지 않고. 사전 설정된 데이터를 기준으로 가변수화 한다는것이다.
사용방법
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
# 예시 데이터셋
train_data = pd.DataFrame({'genre': ['액션', '드라마', '코미디']})
test_data = pd.DataFrame({'genre': ['액션', '공포', 'SF']})
# Data Dictionary 정의
genres = ['액션', '드라마', '코미디', '공포', 'SF']
# OneHotEncoder 초기화 및 Data Dictionary에 맞춰 fitting
encoder = OneHotEncoder(categories=[genres], sparse=False)
encoder.fit(train_data[['genre']])
# Train 데이터 변환
train_encoded = encoder.transform(train_data[['genre']])
train_encoded_df = pd.DataFrame(train_encoded, columns=encoder.get_feature_names(['genre']))
print(train_encoded_df)
# Test 데이터 변환 (동일한 encoder 사용)
test_encoded = encoder.transform(test_data[['genre']])
test_encoded_df = pd.DataFrame(test_encoded, columns=encoder.get_feature_names(['genre']))
print(test_encoded_df)
OneHotEncoder에 categories인자에 Data dictionary를 넘겨주면 된다. 이때 Data dictionary에 존재하지 않은 데이터는 들어올 수 없도록 설정해야한다. 애초에 이런 경우가 없게 설정해야한다.