범주형 데이터는 머신러닝 모델에서 중요한 역할을 하지만, 컴퓨터는 숫자만 이해할 수 있기 때문에 범주형 데이터를 숫자로 변환하는 작업이 필요하다. 이 과정을 통해 모델이 범주형 데이터를 잘 학습할 수 있게 된다. 범주형 데이터를 처리하는 주요 방법에는 원-핫 인코딩, 라벨 인코딩, 타깃 인코딩이 있다. 각 방법에 대해 자세히 살펴보자.
1. 원-핫 인코딩 (One-Hot Encoding)
1.1 정의
범주형 변수의 각 범주를 이진 변수(0과 1)로 변환하는 방법이다. 각 범주에 대해 하나의 새로운 열을 생성하고, 해당 범주에 해당하는 행에는 1을, 나머지에는 0을 할당한다. 범주 간 순서나 크기가 없고, 범주 수가 적은 경우에 적합하다.
위 그림을 살펴보면 각각 상품명에 해당하는 열을 만들고, 해당하는 행에는 1을, 나머지에는 0을 할당하는 것을 확인할 수 있다.
1.2 장점
- 범주형 변수를 독립적으로 처리하므로 모델이 범주 간의 관계를 잘못 해석하지 않는다.
- 순서가 없는 범주형 변수에 적합한 처리 방식이다.
1.3 단점
- 범주의 수가 많을 경우 데이터 차원이 커져 메모리 사용량과 계산 시간이 늘어난다.
- 희소 행렬(Sparse Matrix)로 변환되므로 메모리 효율성이 낮아질 수 있다.
1.4 예제 코드
원-핫 인코딩은 사이킷런에서 제공하는 OneHotEncoder()를 사용하는 방법과 Pandas에서 제공하는 get_dummies()를 사용하는 방법이 존재한다. 보통 OneHotEncoder() 보다는 get_dummies를 많이 사용한다.
OneHotEncoder()를 사용할 때는 주의할 점이 두가지가 있다. 첫번째로는 입력값으로 2차원의 데이터가 필요하다. 두번째로는 OneHotEncoder를 이용해 변환한 값이 희소 행렬(Sparse Matrix) 형태이므로 이를 다시 toarray() 메서드를 이용해 밀집행렬(Dense Matrix)로 변환해야 한다.
OneHotEncoder()를 이용한 원-핫 인코딩 예제 코드는 아래와 같다.
from sklearn.preprocessing import OneHotEncoder
import numpy as np
import pandas as pd
products = [['TV'], ['냉장고'], ['믹서'], ['선풍기'], ['전자레인지'], ['컴퓨터']]
# 원-핫 인코딩 적용
encoder = OneHotEncoder(sparse_output=False) # 출력을 밀집 행렬로 변환
encoder.fit(products)
encoder_data = encoder.transform(products)
# 결과 출력
df = pd.DataFrame(data=encoder_data, columns=encoder.categories_[0])
print(df)
판다스에서 제공하는 get_dummies()를 이용해 원-핫 인코딩을 좀 더 쉽게 구현할 수 있다. get_dummies()는 OneHotEncoder 클래스와는 다르게 숫자 형으로 변환하는 것을 생략할 수 있다.
get_dummies()를 이용한 원-핫 인코딩 예제 코드는 아래와 같다.
import pandas as pd
df = pd.DataFrame({'products': ['TV', '냉장고', '믹서', '선풍기', '전자레인지', '컴퓨터']})
print(pd.get_dummies(df))
2. 레이블 인코딩 (Label Encoding)
2.1 정의
범주형 변수의 각 범주를 고유한 숫자로 변환하는 방법이다. 각 범주에 숫자를 매핑하여 변환한다. 범주 간의 순서나 크기가 있을 때는 유용하지만, 순서가 없을 경우 사용을 피하는 것이 좋다.
위 그림을 살펴보면 State열의 범주형 변수들이 고유한 숫자로 변환된 것을 확인할 수 있다.
2.2 장점
- 메모리 사용이 효율적이며, 계산 속도가 빠르다.
- 범주 수가 많을 때 적합하다.
2.3 단점
- 범주 간에 순서나 크기 관계가 없더라도 숫자가 순서를 가진 것처럼 모델이 해석할 수 있어, 모델 성능에 악영향을 미칠 수 있다.
2.4 예제 코드
레이블 인코딩은 사이킷런에서 제공하는 LabelEncoder 클래스로 구현할 수 있다.
LabelEncoder()를 이용한 레이블 인코딩 예제 코드는 아래와 같다.
from sklearn.preprocessing import LabelEncoder
products = ['TV', '냉장고', 'TV', '믹서', '선풍기', '전자레인지', '컴퓨터', '선풍기', '냉장고']
encoder = LabelEncoder()
encoder.fit(products)
labels = encoder.transform(products)
print("인코딩 변환값:", labels)
print("인코딩 클래스", encoder.classes_)
print("디코딩 원본값:",encoder.inverse_transform([0,1,0,2,3,4,5,3,1]))
3. 타겟 인코딩 (Target Encoding)
3.1 정의
범주형 변수의 각 범주에 대해 타겟 변수의 평균값을 계산하여 해당 범주를 숫자로 변환하는 방법이다. 타겟 변수와의 관계가 중요한 경우에 유용하며, 범주가 많고, 타겟 변수가 연속형인 경우에 유리하다.
3.2 장점
- 타겟 변수와의 관계를 반영하여 모델의 예측 성능을 향상시킬 수 있다.
- 범주 간의 관계를 보다 정확하게 표현하기에 용이하다.
3.3 단점
- 과적합(overfitting)의 위험이 있다. (특히 학습 데이터에서 타겟 평균값을 직접 사용하기 때문에 새로운 데이터에 대한 일반화 성능이 떨어질 수 있다)
- 이를 방지하기 위해 교차 검증을 통한 인코딩이나 스무딩 기법을 사용하는 것이 좋다.
3.4 예제 코드
타겟 인코딩(Target Encoding)은 따로 구현되어 있는 라이브러리는 존재하지 않아 판다스 데이터프레임의 groupby함수를 이용해 각 범주형 변수 별 타겟 변수의 평균값을 구한 후 타겟 인코딩을 수행했다.
타겟 인코딩의 예제 코드는 아래와 같다.
import pandas as pd
# 데이터 생성
products = [['TV'], ['냉장고'], ['믹서'], ['선풍기'], ['전자레인지'],
['컴퓨터'], ['TV'], ['냉장고'], ['믹서'], ['선풍기'],
['전자레인지'], ['컴퓨터'], ['TV'], ['냉장고'], ['믹서'],
['선풍기'], ['전자레인지'], ['컴퓨터'], ['TV'], ['냉장고']]
prices = [500000, 600000, 150000, 80000, 200000, 1000000,
550000, 650000, 180000, 90000, 250000, 950000,
510000, 630000, 160000, 85000, 210000, 1050000,
530000, 640000]
# DataFrame 생성
df = pd.DataFrame(products, columns=['제품'])
df['가격'] = prices
# 제품별 평균 가격 계산
target_mean = df.groupby('제품')['가격'].mean()
# 타겟 인코딩 적용
df['제품_타겟_인코딩'] = df['제품'].map(target_mean)
# 결과 출력
print(df)
4. 결론
범주형 데이터 처리 방법에는 원-핫 인코딩, 레이블 인코딩, 타겟 인코딩이 있으며, 각 방법은 데이터의 특성에 따라 다르게 적용할 수 있다.
- 원-핫 인코딩은 순서가 없는 범주에 적합하지만, 범주가 많을 경우 메모리 문제를 일으킬 수 있다.
- 레이블 인코딩은 계산 효율성이 높지만, 범주 간의 순서가 없을 경우 잘못된 해석을 초래할 수 있다.
- 타겟 인코딩은 타겟 변수와의 관계를 반영하여 예측 성능을 높일 수 있지만, 과적합을 방지하는 기법이 필요하다.
따라서 각 방법의 특성을 잘 이해하고, 데이터의 특성에 맞는 적절한 방법을 선택하는 것이 중요하다.
'데이터 분석' 카테고리의 다른 글
데이터 전처리 (Data Preprocessing) (0) | 2025.03.12 |
---|---|
탐색적 데이터 분석 (EDA : Exploratory Data Analysis) (0) | 2025.03.10 |
특징 선택(Feature Selection) (0) | 2025.03.10 |
표준화(Standardization)와 정규화(Normalization) (0) | 2025.03.09 |
데이터 분석에서 왜도, 첨도, 로그 변환이 중요한 이유 (0) | 2025.03.09 |