데이터 과학과 머신러닝의 세계에서 원 핫 인코딩(One-Hot Encoding)은 범주형 변수를 수치형 변수로 변환하는 중요한 기법입니다. 이 기법은 특히 Pandas와 함께 사용할 때 강력한 도구가 될 수 있습니다. 이번 글에서는 원 핫 인코딩에 대한 5가지 기법을 소개하고, 실용적인 팁과 사례를 통해 이해를 돕겠습니다.
1. 기본 원 핫 인코딩
원 핫 인코딩의 가장 기본적인 형태는 Pandas의 get_dummies() 함수를 사용하는 것입니다. 이 함수는 범주형 데이터를 자동으로 인코딩하여 새로운 데이터프레임을 생성합니다. 예를 들어, 다음과 같은 데이터가 있을 때:
이름 | 과일 |
---|---|
철수 | 사과 |
영희 | 바나나 |
민수 | 사과 |
수진 | 체리 |
다음과 같이 인코딩할 수 있습니다:
import pandas as pd
data = {'이름': ['철수', '영희', '민수', '수진'],
'과일': ['사과', '바나나', '사과', '체리']}
df = pd.DataFrame(data)
one_hot = pd.get_dummies(df['과일'])
df = df.join(one_hot)
print(df)
이 결과는 다음과 같습니다:
이름 | 과일 | 사과 | 바나나 | 체리 |
---|---|---|---|---|
철수 | 사과 | 1 | 0 | 0 |
영희 | 바나나 | 0 | 1 | 0 |
민수 | 사과 | 1 | 0 | 0 |
수진 | 체리 | 0 | 0 | 1 |
2. 특정 범주만 인코딩하기
때때로 모든 범주가 필요하지 않을 수 있습니다. 이 경우, get_dummies()의 columns
매개변수를 사용하여 특정 열만 인코딩할 수 있습니다. 예를 들어:
one_hot = pd.get_dummies(df['과일'], columns=['과일'], drop_first=True)
이렇게 하면 첫 번째 범주가 자동으로 제외되어 다중 공선성을 피할 수 있습니다. 이 기법은 모델의 성능을 높이는 데 유용합니다.
3. 사용자 정의 원 핫 인코딩
Pandas의 기본 기능을 넘어, apply() 함수를 사용하여 더 복잡한 인코딩 로직을 구현할 수 있습니다. 예를 들어, 특정 조건에 따라 인코딩을 다르게 할 수 있습니다:
def custom_encoding(fruit):
if fruit == '사과':
return [1, 0, 0]
elif fruit == '바나나':
return [0, 1, 0]
else:
return [0, 0, 1]
df[['사과', '바나나', '체리']] = df['과일'].apply(custom_encoding).tolist()
이렇게 하면 사용자가 정의한 조건에 따라 인코딩된 결과를 얻을 수 있습니다.
4. 다중 인코딩
원 핫 인코딩을 여러 열에 동시에 적용할 수 있습니다. pd.get_dummies()를 여러 번 사용할 필요 없이 한번에 처리할 수 있습니다:
data = {'이름': ['철수', '영희', '민수', '수진'],
'과일': ['사과', '바나나', '사과', '체리'],
'색상': ['빨강', '노랑', '빨강', '초록']}
df = pd.DataFrame(data)
one_hot = pd.get_dummies(df, columns=['과일', '색상'])
여기서 각각의 범주형 변수에 대해 원 핫 인코딩이 진행됩니다. 이 방법은 복잡한 데이터셋을 다룰 때 매우 유용합니다.
5. 원 핫 인코딩 후 스케일링
원 핫 인코딩을 완료한 후, 스케일링을 통해 모델의 성능을 향상시킬 수 있습니다. StandardScaler 또는 MinMaxScaler와 같은 스케일러를 사용할 수 있습니다:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df[['사과', '바나나', '체리']])
이렇게 하면 데이터의 분포를 표준화하여 모델 학습에 더 효과적입니다.
실용적인 팁 5가지
1. 결측치 처리 후 인코딩
원 핫 인코딩을 수행하기 전에 결측치를 처리하는 것이 중요합니다. 결측치를 적절히 처리하지 않으면 인코딩된 데이터에 오류가 발생할 수 있습니다. Pandas의 fillna() 함수를 사용하여 결측치를 대체할 수 있습니다. 예를 들어:
df['과일'].fillna('unknown', inplace=True)
2. 큰 데이터셋에서의 성능 고려
데이터셋이 클수록 원 핫 인코딩으로 생성되는 열의 수가 많아질 수 있습니다. 이 경우 feature selection 기법을 사용하여 불필요한 열을 제거하여 성능을 저하시키지 않도록 해야 합니다. 이를 통해 모델의 복잡성을 줄이고 학습 시간을 단축할 수 있습니다.
3. 데이터 유형에 따라 적절한 인코딩 선택
모든 범주형 데이터에 원 핫 인코딩이 적합한 것은 아닙니다. Label Encoding이 더 적합할 수 있는 경우도 있으므로, 데이터의 특성을 잘 분석하여 인코딩 방식을 선택하는 것이 중요합니다.
4. 원 핫 인코딩 후 데이터 확인
인코딩 후 데이터프레임을 항상 확인해야 합니다. head() 함수를 사용하여 인코딩된 데이터를 검토하고, 원하지 않는 열이 생기지 않았는지 확인하는 것이 중요합니다.
5. 모델링 전에 데이터 시각화
원 핫 인코딩이 끝난 후, 데이터의 분포를 시각화하는 것이 좋습니다. Seaborn이나 Matplotlib를 사용하여 데이터의 경향성을 살펴보면 더 나은 모델을 구축하는 데 도움이 됩니다.
요약 및 실천 팁
원 핫 인코딩은 머신러닝의 중요한 기법 중 하나로, 범주형 데이터를 효과적으로 수치형 데이터로 변환할 수 있습니다. Pandas를 활용하면 이 과정을 간단하게 수행할 수 있으며, 다양한 방법으로 데이터를 인코딩할 수 있습니다. 이번 글에서 소개한 기법과 팁을 바탕으로 데이터를 처리해보세요. 실습을 통해 자신의 데이터에 맞는 최적의 인코딩 방법을 찾아보는 것이 중요합니다.
마지막으로, 원 핫 인코딩을 활용할 때는 항상 데이터의 품질을 확인하고, 모델링 전에 충분한 탐색적 데이터 분석을 수행하는 것을 잊지 마세요!