[머신러닝] 범주형 데이터 인코딩 방법 정리
- 데이터 사이언스/머신러닝 딮러닝
- 2023. 11. 27.
반응형
반응형
범주형 데이터 인코딩하기
머신러닝 모델은 글자를 인식하지 못합니다. 이 사실만으로도 인코딩을 반드시 해야한다는 걸 이해하실 수 있을겁니다. 컴퓨터는 사람처럼 소통하는 게 아니기 때문에 이것이 범주형 데이터라는 것을 알려주어야 합니다. 그런 의미에서 판다스에서 타입이 object로 분류되는 데이터는 인코딩을 해주어야 합니다.
인코딩 방법
데이터 인코딩하는 방법은 굉장히 많습니다. 그 중에서 주요한 방법인
레이블 인코딩, 원핫인코딩, 더미 변수, 빈도 인코딩, 순서 인코딩에 대해 간단히 정리합니다.
레이블 인코딩 (Label Encoding)
- 개념: 각 범주에 고유한 정수를 할당하는 방식입니다.
- 카테고리가 확실할 때 사용합니다.
- 문자를 정수로 반환하는 역할만 합니다.
- 원 데이터의 손실이 없습니다.
- 예시:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data['카테고리'] = le.fit_transform(data['카테고리'])
# train 데이터인 경우
x_train_encoder = le.fit_transform(x_train)
# test 데이터인 경우
x_test_encoder = le.transform(x_test)
원-핫 인코딩 (One-Hot Encoding)
- 개념: 각 범주를 이진수로 표현하여 고유한 열로 변환합니다.0과 1로만 표현하며 벡터형식으로 나타납니다.
- 0과 1로만 이루어진 특성 벡터를 생성하므로, 희소한 데이터를 효과적으로 다룰 수 있습니다.
- 계산이 용이해서 많이 쓰입니다.
- 분류 모델에서도 작동하지만 회귀모델에서 보다 잘 작동합니다.
- 범주 간 순서나 관계 정보는 사라집니다.
- 예시:
# sklearn 을 이용한 방법
import sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
data['카테고리'] =encoder.fit_transform(data['카테고리'])
# train 데이터인 경우
x_train_encoder = encoder.fit_transform(x_train)
# test 데이터인 경우
x_test_encoder = encoder.transform(x_test)
Iris 데이터의 target 데이터는 세종률의 꽃을 라벨링해놓은 데이터인데 이를 원핫인코딩을 돌려보겠습니다. 라벨은 (0,1,2) 로 되어있습니다.
target이 0일 때는 (1,0,0) 벡터가 생성되고 2일 때는 (0,0,1)로 0,1로만 이루어진 벡터가 생성됩니다.
더미 변수 (Dummy Variables)
- 개념: 범주형 변수를 여러 개의 이진 변수로 분해합니다. 원-핫 인코딩과 유사하지만, 카테고리가 n개일 때 n-1개의 열을 생성합니다.
- 예시:
data = pd.get_dummies(data, columns=['카테고리'], drop_first=True)
빈도 인코딩 (Frequency Encoding)
- 개념: 범주의 등장 빈도를 이용하여 인코딩합니다.
- 빈도에 기반하므로 정보 손실이 적습니다.
- 빈도가 중요시 되는 데이터인 경우 유용합니다.
- 범주의 순서나 관계를 반영하지 않으므로 관계가 중요한 데이터에는 쓸 수 없습니다.
- 이상치보다는 범주의 크기에 영향을 많이 받으므로 가중치를 적절하게 주어서 하나만 튀지 않도록 조절해야합니다.
- 범주의 수가 많을 때 cardinality를 줄일 수 있습니다.
- 예시:
frequency_map = data['카테고리'].value_counts().to_dict()
data['카테고리_빈도'] = data['카테고리'].map(frequency_map)
순서 인코딩 (Ordinal Encoding)
- 개념: 범주 간에 순서 또는 중요도가 있는 경우에 사용됩니다.
- 순서를 정수로만 변환하므로 정보가 유지됩니다.
- 실제 데이터에 순서가 있는 경우 범주 간 거리가 균등하지 않습니다.인코딩을 하더라도 이 문제는 해결하지 못합니다.
- cardinality는 줄어들지 않습니다.
- 예시:
ordinal_mapping = {'낮음': 1, '보통': 2, '높음': 3}
data['중요도'] = data['중요도'].map(ordinal_mapping)
마치며
인코딩 방법을 정리하다보니 몇몇 방법들은 내용을 다 넣지 못했습니다. 자세한 내용이 필요한 경우는 추후에 따로 떼서 포스팅할 예정입니다.
'데이터 사이언스 > 머신러닝 딮러닝' 카테고리의 다른 글
빅데이터 분석 흐름 단계 (6) | 2024.09.14 |
---|---|
[머신러닝]이진분류 모델 종류 (0) | 2024.08.23 |
[머신러닝] 숫자형 데이터 스케일링 방법 정리 (0) | 2023.11.25 |
[파이썬] 선형회귀 간단하게 구현 (0) | 2023.10.19 |
머신러닝이란? (0) | 2023.06.26 |