인코딩(Encoding)은 범주형 데이터를 숫자형 데이터로 변환하는 과정입니다. 머신러닝 모델은 대부분 숫자 데이터를 다룰 수 있기 때문에, 데이터가 문자, 텍스트, 혹은 범주형 값으로 이루어져 있다면 이를 숫자로 변환해야 합니다.
왜 인코딩이 필요한가?
- 머신러닝 모델은 수치형 데이터만 처리할 수 있습니다.
- 범주형 데이터를 숫자로 변환하면 모델이 데이터의 패턴을 학습할 수 있습니다.
- 데이터 분석 및 전처리 과정에서 필수적인 작업입니다.
인코딩의 기본 목적
- 데이터를 머신러닝 모델에 적합한 형식으로 변환
- 예: '남자', '여자' → 0, 1
- 범주 간 관계를 모델이 올바르게 이해할 수 있도록 보장
- 예: 순서가 있는 데이터는 순서를 유지하면서 변환, 순서가 없는 데이터는 편향 없이 변환.
인코딩의 종류
- 레이블 인코딩 (Label Encoding)
범주형 값을 고유한 정수로 변환. - 원-핫 인코딩 (One-Hot Encoding)
범주를 이진 벡터로 변환. - 순서형 인코딩 (Ordinal Encoding)
범주형 데이터를 순서를 유지하며 정수로 변환. - 차원 축소 인코딩 (Dimensionality Reduction Encoding)
고차원 데이터를 저차원 벡터로 축소. - 임베딩 (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]]
정리
인코딩 방법 | 특징 | 장점 | 단점 |
레이블 인코딩 | 범주형 데이터를 고유한 정수로 변환 | 간단하고 효율적 | 순서 없는 데이터에 적용 시 잘못된 관계 학습 가능 |
원-핫 인코딩 | 각 범주를 이진 벡터로 변환 | 편향 위험이 적고 안전 | 차원이 커질 수 있어 비효율적 |
순서형 인코딩 | 범주 간 순서를 유지하며 정수로 변환 | 순서를 반영 가능 | 순서 없는 데이터에 사용 시 문제 발생 |
차원 축소 인코딩 | 고차원 데이터를 저차원 벡터로 축소 | 효율적이고 메모리 절약 | 정보 손실 가능, 구현 복잡 |
임베딩 | 범주를 고차원 벡터로 표현, 유사성을 학습함 | 데이터의 관계를 효과적으로 학습 가능 | 학습 필요, 데이터 부족 시 성능 저하 가능 |
'Python' 카테고리의 다른 글
데이터 전처리: 데이터 정규화와 표준화 (비선형 변환 포함) (0) | 2024.12.03 |
---|---|
데이터 전처리: 데이터 정규화와 표준화 (0) | 2024.12.03 |
데이터 전처리: 이상치 탐지 및 처리 (0) | 2024.12.03 |
데이터 전처리: 결측치 탐지와 처리 방법 (0) | 2024.12.03 |
4.2.4 연습 문제: 각 자리 숫자의 합을 구하는 함수(리스트를 이용) (0) | 2024.11.29 |