Python

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

수현조 2024. 12. 3. 13:51

인코딩(Encoding)은 범주형 데이터를 숫자형 데이터로 변환하는 과정입니다. 머신러닝 모델은 대부분 숫자 데이터를 다룰 수 있기 때문에, 데이터가 문자, 텍스트, 혹은 범주형 값으로 이루어져 있다면 이를 숫자로 변환해야 합니다.

왜 인코딩이 필요한가?

  • 머신러닝 모델은 수치형 데이터만 처리할 수 있습니다.
  • 범주형 데이터를 숫자로 변환하면 모델이 데이터의 패턴을 학습할 수 있습니다.
  • 데이터 분석 및 전처리 과정에서 필수적인 작업입니다.

인코딩의 기본 목적

  1. 데이터를 머신러닝 모델에 적합한 형식으로 변환
    • 예: '남자', '여자' → 0, 1
  2. 범주 간 관계를 모델이 올바르게 이해할 수 있도록 보장
    • 예: 순서가 있는 데이터는 순서를 유지하면서 변환, 순서가 없는 데이터는 편향 없이 변환.

인코딩의 종류

  1. 레이블 인코딩 (Label Encoding)
    범주형 값을 고유한 정수로 변환.
  2. 원-핫 인코딩 (One-Hot Encoding)
    범주를 이진 벡터로 변환.
  3. 순서형 인코딩 (Ordinal Encoding)
    범주형 데이터를 순서를 유지하며 정수로 변환.
  4. 차원 축소 인코딩 (Dimensionality Reduction Encoding)
    고차원 데이터를 저차원 벡터로 축소.
  5. 임베딩 (Embedding)
    범주형 값을 다차원 벡터로 변환해 유사성을 학습.

 

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

특징

  • 범주형 데이터를 고유한 정수로 변환합니다.
  • 각 범주에 순서가 부여되며, 0부터 시작하는 정수로 변환됩니다.

장점

  • 간단하고 메모리 효율적입니다.
  • 데이터에 순서가 있는 경우 적합합니다.

단점

  • 범주 간 순서가 없는 경우, 숫자의 크기가 관계를 나타낸다고 모델이 잘못 학습할 가능성이 있습니다.

예제

from sklearn.preprocessing import LabelEncoder
import pandas as pd

data = {'과일': ['사과', '바나나', '오렌지']}
df = pd.DataFrame(data)

encoder = LabelEncoder()
df['과일_인코딩'] = encoder.fit_transform(df['과일'])
print(df)

출력

     과일  과일_인코딩
0    사과       0
1   바나나       1
2   오렌지       2

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

특징

  • 각 범주를 이진 벡터로 변환합니다.
  • 데이터의 각 범주마다 별도의 열(column)이 생성됩니다.
  • 해당 열에 1은 해당 범주를 나타내고, 나머지는 0으로 표시됩니다.

장점

  • 범주 간 순서나 크기 관계가 없어도 데이터 편향 없이 사용할 수 있습니다.

단점

  • 범주의 수가 많아질수록 열이 증가(차원의 저주)하여 메모리와 계산 자원이 더 많이 필요합니다.

예제

import pandas as pd

data = {'과일': ['사과', '바나나', '오렌지']}
df = pd.DataFrame(data)

df_one_hot = pd.get_dummies(df['과일'], prefix='과일')
print(df_one_hot)

출력

   과일_사과  과일_바나나  과일_오렌지
0      1       0       0
1      0       1       0
2      0       0       1

3. 순서형 인코딩 (Ordinal Encoding)

특징

  • 범주형 데이터를 순서대로 정수로 변환합니다.
  • 범주 간 순서가 있는 경우 적합합니다.

장점

  • 순서를 유지하며 데이터 크기를 작게 유지할 수 있습니다.

단점

  • 순서가 없는 데이터에 적용하면 모델이 숫자의 크기를 순서로 잘못 이해할 가능성이 있습니다.

예제

from sklearn.preprocessing import OrdinalEncoder
import pandas as pd

data = {'등급': ['낮음', '중간', '높음']}
df = pd.DataFrame(data)

encoder = OrdinalEncoder(categories=[['낮음', '중간', '높음']])
df['등급_인코딩'] = encoder.fit_transform(df[['등급']])
print(df)

출력

     등급  등급_인코딩
0    낮음       0.0
1    중간       1.0
2    높음       2.0

4. 차원 축소 인코딩 (Dimensionality Reduction Encoding)

특징

  • 고차원 데이터를 저차원 벡터로 축소하여 표현합니다.
  • 주로 PCA(주성분 분석)과 같은 알고리즘을 활용합니다.

장점

  • 고차원 데이터의 메모리 사용량을 줄이고 계산 효율성을 높입니다.

단점

  • 일부 정보 손실이 발생할 수 있습니다.
  • 구현이 복잡하며 사전 알고리즘 지식이 필요합니다.

예제

from sklearn.decomposition import PCA
import numpy as np

data = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])

pca = PCA(n_components=2)
reduced_data = pca.fit_transform(data)
print(reduced_data)

출력

[[ 0.81649658 -0.        ]
 [-0.40824829  0.70710678]
 [-0.40824829 -0.70710678]]

5. 임베딩 (Embedding)

특징

  • 각 범주를 다차원 공간의 벡터로 표현합니다.
  • 데이터의 관계를 학습하며 유사성을 반영합니다.
  • 주로 신경망에서 임베딩 레이어를 통해 학습합니다.

장점

  • 데이터 간의 관계를 효과적으로 학습할 수 있습니다.
  • 메모리 사용량을 조절할 수 있습니다.

단점

  • 학습이 필요하며, 데이터가 부족하면 성능이 떨어질 수 있습니다.

예제

import tensorflow as tf

vocab_size = 3  # 범주 개수
embedding_dim = 2  # 임베딩 차원

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(input_dim=vocab_size, output_dim=embedding_dim)
])

input_data = tf.constant([0, 1, 2])
output = model(input_data)
print(output.numpy())

출력 (예시)

[[ 0.12 -0.23]
 [ 0.45  0.67]
 [-0.34  0.89]]

정리

인코딩 방법 특징 장점 단점
레이블 인코딩 범주형 데이터를 고유한 정수로 변환 간단하고 효율적 순서 없는 데이터에 적용 시 잘못된 관계 학습 가능
원-핫 인코딩 각 범주를 이진 벡터로 변환 편향 위험이 적고 안전 차원이 커질 수 있어 비효율적
순서형 인코딩 범주 간 순서를 유지하며 정수로 변환 순서를 반영 가능 순서 없는 데이터에 사용 시 문제 발생
차원 축소 인코딩 고차원 데이터를 저차원 벡터로 축소 효율적이고 메모리 절약 정보 손실 가능, 구현 복잡
임베딩 범주를 고차원 벡터로 표현, 유사성을 학습함 데이터의 관계를 효과적으로 학습 가능 학습 필요, 데이터 부족 시 성능 저하 가능