인코딩 ( 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"와 같은 순서가 있는 범주에서 유용합니다.
- 원-핫 인코딩: 범주형 변수들 간에 순서가 없을 때 사용합니다. 예를 들어, 색깔, 도시명 등 순서가 없는 데이터에 적합합니다.
- 빈도 인코딩: 범주가 많고, 범주 간의 빈도가 중요한 경우에 사용합니다.
- 타깃 인코딩: 회귀 문제에서 타깃 변수와의 관계를 반영하고 싶을 때 유용합니다.
- 이진 인코딩: 범주가 많을 때 메모리 효율을 고려한 방법입니다.
- 해싱 인코딩: 범주형 데이터가 너무 많을 때, 메모리와 계산 효율성을 고려한 방법입니다.
적합한 인코딩 방법은 데이터의 특성, 문제의 종류, 그리고 모델의 요구 사항에 따라 달라집니다.
'Python > Pandas' 카테고리의 다른 글
[Pandas] 데이터 정규화 와 표준화 (0) | 2024.12.26 |
---|---|
[Pandas] 이상치 탐지와 처리 (1) | 2024.12.26 |
[Pandas] 결측치 탐지와 처리 (1) | 2024.12.26 |
[Pandas] 피벗 테이블 - pivot_table() (4) | 2024.12.16 |
[Pandas] 그룹화 및 집계함수 (1) | 2024.12.16 |