데이터 인코딩 (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' 카테고리의 다른 글
python - concat 함수 (1) | 2024.10.22 |
---|---|
python upper, lower 함수시 유의사항 - str (0) | 2024.10.22 |
python unique 사용시 주의사항 (1) | 2024.10.22 |
python pandas 기초함수 apply (0) | 2024.10.21 |
데이터 전처리 - 피처 스케일링과 정규화 (0) | 2023.12.13 |