머신러닝: 범주형 변수 처리하기
머신러닝 모델을 훈련시키기 전에 데이터를 효과적으로 준비하는 것은 매우 중요합니다. 특히, 범주형 변수는 머신러닝 알고리즘이 직접적으로 처리하기 어려운 형태를 가지고 있어 특별한 처리가 필요합니다. 이 글에서는 범주형 변수가 무엇인지, 왜 처리해야 하는지, 그리고 다양한 처리 방법에 대해 자세히 알아보겠습니다.
💡 범주형 변수 (Categorical Variables) 란?
범주형 변수는 '색상', '크기', '지역' 등과 같이 몇 개의 범주(category) 또는 클래스(class)로 값을 나타내는 변수를 말합니다. 이러한 변수는 숫자 형태로 표현되지 않기 때문에 머신러닝 모델에 직접적으로 입력하기 어렵습니다. 예를 들어, '빨강', '파랑', '초록'과 같은 색상 정보나 '대', '중', '소'와 같은 크기 정보가 범주형 변수에 해당합니다.
🤔 왜 범주형 변수를 처리해야 할까요?
대부분의 머신러닝 알고리즘은 숫자 데이터를 입력으로 받도록 설계되었습니다. 범주형 변수를 그대로 사용하면 알고리즘이 변수의 의미를 제대로 파악하지 못하거나, 잘못된 패턴을 학습할 수 있습니다. 예를 들어, '빨강', '파랑', '초록'을 숫자로 변환하지 않고 모델에 입력하면, 모델은 이 변수들 간의 크기 관계가 있다고 잘못 해석할 수 있습니다.
🛠️ 범주형 변수 처리 방법
범주형 변수를 처리하는 방법은 크게 세 가지로 나눌 수 있습니다: 레이블 인코딩(Label Encoding), 원-핫 인코딩(One-Hot Encoding), 그리고 임베딩(Embedding)입니다. 각 방법의 특징과 예시를 살펴보겠습니다.
- 레이블 인코딩 (Label Encoding)
레이블 인코딩은 범주형 변수의 각 범주에 고유한 정수 값을 할당하는 방법입니다. 간단하고 직관적이지만, 범주 간의 순서 관계가 존재하지 않는 경우, 모델이 잘못된 패턴을 학습할 수 있다는 단점이 있습니다. 예를 들어, '대', '중', '소'와 같이 순서가 있는 경우에는 레이블 인코딩이 유용할 수 있지만, '빨강', '파랑', '초록'과 같이 순서가 없는 경우에는 원-핫 인코딩이 더 적합합니다.
from sklearn.preprocessing import LabelEncoder
import pandas as pd
data = {'color': ['red', 'blue', 'green', 'red']}
df = pd.DataFrame(data)
encoder = LabelEncoder()
df['color_encoded'] = encoder.fit_transform(df['color'])
print(df)
# Output:
# color color_encoded
# 0 red 2
# 1 blue 0
# 2 green 1
# 3 red 2
- 원-핫 인코딩 (One-Hot Encoding)
원-핫 인코딩은 각 범주를 새로운 이진 변수(0 또는 1)로 변환하는 방법입니다. 각 범주에 대해 하나의 열을 생성하고, 해당 범주에 속하는 경우 1, 그렇지 않은 경우 0으로 값을 채웁니다. 원-핫 인코딩은 범주 간의 순서 관계를 고려하지 않으므로, 순서가 없는 범주형 변수에 적합합니다. 하지만, 범주의 수가 많아지면 데이터의 차원이 증가하여 모델 학습에 부담을 줄 수 있습니다.
import pandas as pd
data = {'color': ['red', 'blue', 'green', 'red']}
df = pd.DataFrame(data)
df_encoded = pd.get_dummies(df, columns=['color'])
print(df_encoded)
# Output:
# color_blue color_green color_red
# 0 0 0 1
# 1 1 0 0
# 2 0 1 0
# 3 0 0 1
- 임베딩 (Embedding)
임베딩은 단어나 범주를 저차원 벡터 공간에 매핑하는 방법입니다. 원-핫 인코딩과 달리, 임베딩은 범주 간의 의미적 유사성을 학습할 수 있습니다. 예를 들어, '파리'와 '프랑스'는 서로 연관된 단어이므로, 임베딩 공간에서 가까운 거리에 위치하도록 학습될 수 있습니다. 임베딩은 주로 자연어 처리(NLP) 분야에서 사용되지만, 범주형 변수의 차원을 축소하고 모델의 성능을 향상시키는 데에도 활용될 수 있습니다. 임베딩은 모델 학습 과정에서 자동으로 학습되거나, 미리 훈련된 임베딩을 사용할 수도 있습니다.
💡 어떤 방법을 선택해야 할까요?
어떤 범주형 변수 처리 방법을 선택할지는 다음과 같은 요소를 고려하여 결정해야 합니다:
- 범주의 수 (Number of Categories): 범주의 수가 많을수록 원-핫 인코딩은 차원의 저주 문제를 야기할 수 있습니다. 이 경우, 레이블 인코딩이나 임베딩을 고려해볼 수 있습니다.
- 범주 간의 순서 관계 (Ordinality): 범주 간에 순서 관계가 존재한다면 레이블 인코딩을, 순서 관계가 없다면 원-핫 인코딩을 사용하는 것이 일반적입니다.
- 모델의 종류 (Type of Model): 특정 모델은 범주형 변수를 처리하는 데 더 적합할 수 있습니다. 예를 들어, 트리 기반 모델은 원-핫 인코딩된 데이터를 잘 처리하는 경향이 있습니다.
- 데이터의 크기 (Size of Data): 데이터의 크기가 클수록 임베딩을 사용하는 것이 유리할 수 있습니다. 임베딩은 데이터의 차원을 축소하여 모델 학습 속도를 높이는 데 도움이 될 수 있습니다.
📚 핵심 용어 정리
- 범주형 변수 (Categorical Variable): 몇 개의 범주 또는 클래스로 값을 나타내는 변수.
- 레이블 인코딩 (Label Encoding): 범주형 변수의 각 범주에 고유한 정수 값을 할당하는 방법.
- 원-핫 인코딩 (One-Hot Encoding): 각 범주를 새로운 이진 변수로 변환하는 방법.
- 임베딩 (Embedding): 단어나 범주를 저차원 벡터 공간에 매핑하는 방법.
- 차원의 저주 (Curse of Dimensionality): 데이터의 차원이 증가함에 따라 모델의 성능이 저하되는 현상.
결론적으로, 범주형 변수를 효과적으로 처리하는 것은 머신러닝 모델의 성능을 향상시키는 데 매우 중요합니다. 각 처리 방법의 특징을 이해하고, 데이터의 특성과 모델의 종류에 맞춰 적절한 방법을 선택하는 것이 중요합니다.