Python/Pandas

[Pandas] 인코딩 ( Encoding )

죵욜이 2024. 12. 26. 07:12

인코딩 ( Encoding ) 이란?

범주형 데이터를 수치형 데이터로 변환하는 과정

 

많은 머신러닝 모델은 수치형 데이터만 처리할 수 있기에, 범주형 데이터를 인코딩하는 것이 필수적


1. 라벨 인코딩 ( Label Encoding )

  • 각 범주를 고유한 숫자로 변환하는 방식 ex) '빨강', '파랑', '초록' 이 있을경우 각각 0, 1, 2 로 변환
  • 주의할점 : 수치간에 순서가 있는 것으로 해석될 수 있다
  • 예를 들어, "빨강" = 0, "파랑" = 1, "초록" = 2로 변환되면 "파랑"이 "빨강"보다 크다는 의미로 잘못 해석될 수 있습니다.
from sklearn.preprocessing import LabelEncoder

# 데이터
categories = ["빨강", "파랑", "초록", "파랑", "빨강"]

# 라벨 인코딩
encoder = LabelEncoder()
encoded_labels = encoder.fit_transform(categories)

print(encoded_labels)  # [0 1 2 1 0]

2. 원-핫 인코딩 ( one-Hot Encoding )

  • 각 범주를 이진벡터 로 변환하는 방법
  • 각 범주에 대해 열 하나 를 할당하고 해당 범주에 해당하는 열에 1, 나머지 열에는 0 을 할당

 

  • 예를 들어, "빨강", "파랑", "초록"이 있을 때, 원-핫 인코딩은 다음과 같이 변환됩니다:
    • "빨강" → [1, 0, 0]
    • "파랑" → [0, 1, 0]
    • "초록" → [0, 0, 1]
  • 장점: 범주 간의 순서나 크기 차이를 없애므로, 순서가 없는 범주형 데이터를 처리할 때 유용합니다.
  • 단점: 범주가 많을 경우, 희소 행렬(sparse matrix)로 변환되며 메모리 사용량이 증가할 수 있습니다.
from sklearn.preprocessing import OneHotEncoder

# 데이터
categories = [["빨강"], ["파랑"], ["초록"], ["파랑"], ["빨강"]]

# 원-핫 인코딩
encoder = OneHotEncoder(sparse=False)
encoded_categories = encoder.fit_transform(categories)

print(encoded_categories)

 

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]
 [0. 1. 0.]
 [1. 0. 0.]]

3. 빈도 인코딩 ( Frequency Encoding )

  • 각 범주를 해당 범주가 데이터셋에서 나타나는 빈도수 로 변환
  • 예를 들어, "빨강"이 2번, "파랑"이 2번, "초록"이 1번 나타나면, "빨강"은 2로, "파랑"은 2로, "초록"은 1로 변환됩니다.
  • 장점: 많은 범주가 있을 때, 원-핫 인코딩보다 메모리 효율적입니다.
  • 단점: 빈도가 높은 범주더 중요한 범주로 해석될 수 있습니다.
import pandas as pd

# 데이터 예시
data = {"색상": ["빨강", "파랑", "초록", "파랑", "빨강", "초록", "빨강"]}
df = pd.DataFrame(data)

# 빈도수 계산
freq_encoding = df['색상'].value_counts()

# 빈도 인코딩 적용
df['색상_빈도'] = df['색상'].map(freq_encoding)

print(df)
   색상  색상_빈도
0  빨강     3
1  파랑     2
2  초록     2
3  파랑     2
4  빨강     3
5  초록     2
6  빨강     3

4. 타깃 인코딩 ( Target Encoding )

 

  • 각 범주를 타깃 변수의 평균값으로 인코딩하는 방법입니다. 예를 들어, 각 범주에 대해 타깃 값의 평균을 계산하여 해당 범주를 그 값으로 변환합니다.
  • 주로 회귀 문제에서 사용됩니다. 예를 들어, "빨강", "파랑", "초록" 범주에 대해 각 범주가 타깃 값의 평균을 가질 수 있습니다.
  • 장점: 범주형 데이터에 대한 유용한 정보를 잘 포착할 수 있습니다.
  • 단점: 과적합(overfitting)이 발생할 수 있습니다. 이를 방지하기 위해 정규화교차 검증을 활용해야 합니다.
import pandas as pd

# 데이터 예시
data = {
    "색상": ["빨강", "파랑", "초록", "파랑", "빨강", "초록", "빨강"],
    "타깃": [1.2, 2.3, 1.8, 2.1, 1.5, 1.9, 1.4]
}
df = pd.DataFrame(data)

# 색상별 타깃 평균 계산
target_encoding = df.groupby('색상')['타깃'].mean()

# 타깃 인코딩 적용
df['색상_타깃'] = df['색상'].map(target_encoding)

print(df)

 

   색상  타깃  색상_타깃
0  빨강  1.2    1.366667
1  파랑  2.3    2.200000
2  초록  1.8    1.850000
3  파랑  2.1    2.200000
4  빨강  1.5    1.366667
5  초록  1.9    1.850000
6  빨강  1.4    1.366667

5. 이진 인코딩 ( Binary Encoding )

 

  • 라벨 인코딩과 원-핫 인코딩의 중간 형태로, 각 범주를 이진수로 변환하여 여러 개의 이진 특성으로 나누는 방법입니다. 범주의 개수가 많을 때 효과적입니다.
  • 장점: 범주가 많을 경우, 원-핫 인코딩보다 메모리 효율적입니다.
  • 단점: 이진수 변환 방식이 직관적이지 않아 해석이 어려울 수 있습니다.
import pandas as pd
import category_encoders as ce

# 데이터 예시
data = {"색상": ["빨강", "파랑", "초록", "파랑", "빨강", "초록", "빨강"]}
df = pd.DataFrame(data)

# 이진 인코딩 적용
encoder = ce.BinaryEncoder(cols=['색상'])
df_encoded = encoder.fit_transform(df)

print(df_encoded)

 

   색상_0  색상_1
0     1     0
1     0     1
2     0     0
3     0     1
4     1     0
5     0     0
6     1     0

6. 해싱 인코딩 ( Hashing Encoding )

 

  • 범주형 데이터를 해시 함수를 사용하여 고정된 크기의 벡터로 변환하는 방법입니다.
  • 해싱 인코딩은 특히 범주형 변수가 매우 많을 때 유용합니다.
  • 장점: 메모리 사용이 적고, 많은 범주를 다룰 때 유용합니다.
  • 단점: 해시 충돌(hash collision)로 인해, 다른 범주가 동일한 값으로 변환될 수 있습니다.

- 예시 (해싱 인코딩은 category_encoders 패키지를 사용하여 적용)

import pandas as pd
import category_encoders as ce

# 데이터 예시
data = {"색상": ["빨강", "파랑", "초록", "파랑", "빨강", "초록", "빨강"]}
df = pd.DataFrame(data)

# 해싱 인코딩 적용
encoder = ce.HashingEncoder(cols=['색상'], n_components=3)
df_encoded = encoder.fit_transform(df)

print(df_encoded)

 

   색상_0  색상_1  색상_2
0     0     1     1
1     0     0     1
2     0     1     0
3     0     0     1
4     0     1     1
5     0     1     0
6     0     1     1

언제 어떤 인코딩 방법을 선택할까?

  • 라벨 인코딩: 범주형 변수들 간에 순서가 존재할 때 적합합니다. 예를 들어, "Low", "Medium", "High"와 같은 순서가 있는 범주에서 유용합니다.
  • 원-핫 인코딩: 범주형 변수들 간에 순서가 없을 때 사용합니다. 예를 들어, 색깔, 도시명 등 순서가 없는 데이터에 적합합니다.
  • 빈도 인코딩: 범주가 많고, 범주 간의 빈도가 중요한 경우에 사용합니다.
  • 타깃 인코딩: 회귀 문제에서 타깃 변수와의 관계를 반영하고 싶을 때 유용합니다.
  • 이진 인코딩: 범주가 많을 때 메모리 효율을 고려한 방법입니다.
  • 해싱 인코딩: 범주형 데이터가 너무 많을 때, 메모리와 계산 효율성을 고려한 방법입니다.

적합한 인코딩 방법은 데이터의 특성, 문제의 종류, 그리고 모델의 요구 사항에 따라 달라집니다.