본문 바로가기
python

데이터 전처리 - 데이터 인코딩 (Data Encoding)

by jinny-log 2023. 12. 13.

데이터 인코딩 (Data Encoding)

 

✅ 데이터 인코딩은 왜 하나요? 

 

데이터 인코딩은 주로 머신 러닝 및 통계 분석 모델에서 범주형 데이터를 처리할 때 필요한데, 특히 사이킷런의 머신러닝 알고리즘은 문자열 값을 입력값으로 허용하지 않기 때문에 모든 문자열 값은 숫자로 변환 필요함. 

 

✅ 데이터 인코딩 대표적 두가지 방법 

 

1. 레이블 인코딩 (Lable Encoding)

  • 레이블 인코딩은 각 범주형 값에 고유한 정수 레이블 할당하는 방법
  • 각 범주형 변수에 대해 정렬된 숫자로 맵핑하여 데이터 변환
  • 주의점
    • 숫자의 대소관계가 의미 없기 때문에 회귀분석과 같이 숫자 순서 중요한 모델에서는 사용하지 않아야 함.
    • 트리 계열의 ML 알고리즘은 숫자의 이러한 특성을반영하지 않으므로 레이블 인코딩 문제 없음.

사이킷런의 레이블 인코딩은 LabelEncoder 클래스로 구현.

LableEncoder를 객체로 생성한 후 fit()과 transform()을 호출해 인코딩 수행

from sklearn.preprocessing import LabelEncoder

# 예시 데이터
colors = ["red", "green", "blue", "red", "green"]

# 레이블 인코더 생성 및 적용
label_encoder = LabelEncoder()
encoded_colors = label_encoder.fit_transform(colors)

print(encoded_colors)
# 출력: [2, 1, 0, 2, 1]

# classes_ 속성 확인
print("LabelEncoder classes:", label_encoder.classes_)

LabelEncoder classes: ['blue' 'green' 'red']

 

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

  • 원핫 인코딩은 각 범주를 나타내는 열을 생성하고 해당 범주에 해당하는 열을 1을 할당하고 나머지 열에는 0을 할당하는 방법
  • 각 범주가 서로 독립적인 열로 표현되기 때문에 범주 간의 관계가 없어지며 회귀 분석과 같은 모델에서 사용하기 적합
  • 원핫 인코딩은 범주의 수가 많아질수록 많은 차원 생성
  • 주의점 
    • 사이킷런에서 OneHotEncoder 클래스로 변환 가능하지만
    • 단 LableEncoder아 다르게 입력값으로 2차원 데이터가 필요하고
    • OneHotEncoder를 이용해 변환한 값이 희소행렬(Sparse Matrix) 형태이므로
    • 이를 다시 toarray() 메서드를 이용해 밀집행렬로 변환 필요

원핫 인코딩 예시

from sklearn.preprocessing import OneHotEncoder
import numpy as np

# 예시 데이터
colors = ["red", "green", "blue", "red", "green"]

# 2차원 ndarray로 변환
colors = np.array(colors).reshape(-1, 1)

# 원-핫 인코딩
oh_encoder = OneHotEncoder()
oh_encoder.fit(colors)
oh_labels = oh_encoder.transform(colors)

# 원-핫 인코딩 결과는 희소 행렬이므로 toarray()를 이용해 밀집 행렬로 변환
print('원-핫 인코딩 데이터:')
print(oh_labels.toarray())
print('원-핫 인코딩 데이터 차원:')
print(oh_labels.shape)

 

원-핫 인코딩 데이터:
[[0. 0. 1.]
 [0. 1. 0.]
 [1. 0. 0.]
 [0. 0. 1.]
 [0. 1. 0.]]
원-핫 인코딩 데이터 차원:
(5, 3)

여기서 (5, 3)은 5개의 샘플과 3개의 범주를 가진 원-핫 인코딩 데이터라는 의미입니다. 각 행은 각각의 샘플에 대응하며, 열은 각각의 범주를 나타냅니다.

 

사이킷런 모델 아닌 판다스에서는 행렬을 전환하는 번거로운 작업 없이
원-핫 인코딩을 더 쉽게 활용할 수 있는 함수 get_dummies()가 있습니다.

 

 

import pandas as pd

# 예시 데이터
colors = ["red", "green", "blue", "red", "green"]

# 데이터프레임 생성
df = pd.DataFrame({'Color': colors})

# get_dummies()를 사용한 원-핫 인코딩
one_hot_encoded = pd.get_dummies(df['Color'], prefix='Color')

# 결과 출력
print('원-핫 인코딩 데이터:')
print(one_hot_encoded)

 

원-핫 인코딩 데이터:
   Color_blue  Color_green  Color_red
0           0            0          1
1           0            1          0
2           1            0          0
3           0            0          1
4           0            1          0

'python' 카테고리의 다른 글

데이터 전처리 - 피처 스케일링과 정규화  (0) 2023.12.13