ML

[머신러닝/사이킷런] 데이터 인코딩(레이블 인코딩, 원-핫 인코딩)

helena1129 2025. 2. 10. 20:34

학습 자료: 파이썬 머신러닝 완벽 가이드(개정2판), 위키북스

데이터 인코딩

문자열 피처를 머신러닝에 활용될 수 있는 방식의 숫자형으로 변환하는 과정

데이터 전처리(Preprocessing) 과정에 포함 


1. 레이블 인코딩

개요

카테고리 피처를 코드형 숫자 값으로 변환

 

주의할 점

변환 시 숫자 값의 대소가 알고리즘에 가중치를 부여하는 방식으로 작용할 위험이 있다.

따라서, 다음 머신러닝 알고리즘에서는 사용하면 안된다.

 

KNN, K-means Clustering, SVM, 선형 회귀, 로지스틱 회귀

 

트리 계열의 알고리즘에는 일반적으로 문제가 없다. 그러나, 거리나 우선순위 기반인지 알아보고 처리하는 것이 좋다.

 

사이킷런

LabelEncoder(): 객체

fit(): 데이터 변환을 위한 기준 정보 설정

transform(): fit으로 설정된 정보를 이용해 데이터 변환(사용 시 주의점 존재, 하단 참고)

 


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

개요

새로운 피처를 추가해 고유 값에 해당하는 컬럼에만 1을 표시하고 나머지 컬럼에는 0을 표시하는 방식

 

주의할 점

원-핫 인코딩은 피처의 개수만큼 새로운 컬럼이 추가되므로, 차원이 급격히 증가할 위험이 있다. 범주의 개수가 매우 많은 경우, 이는 메모리 사용량 증가와 모델 성능 저하로 이어진다.

따라서, PCA와 같은 차원 축소 기법을 적용하거나 카테고리를 그룹화하는 방식을 이용할 수 있다.

 

트리 계열에는 보통 잘 사용하지 않는다.

 

사이킷런

입력값으로 2차원 데이터가 필요하다.

 

OneHotEncoder(): 객체

toarray(): OneHotEncoder로 변환한 결과를 밀집 행렬로 변환

 

get_dummies(df): 문자열 카테고리 값을 바로 변환하는 간편한 원-핫 인코딩 방식

 


중요) 사이킷런 fit/transform 사용 시 주의할 점

앞서 말했듯 데이터 전처리 과정에서 fit은 데이터 변환을 위한 기준 정보 설정, transform은 fit으로 설정된 정보를 이용해 데이터를 변환하는 메서드에 해당한다.

그러나 train, test 데이터셋에 이를 적절하게 활용하기 위해서는 몇 가지 주의해야 할 점이 존재한다.

 

데이터 전처리 시에는 학습 데이터셋에 fit()과 transform()을 적용하고 나서 테스트 데이터셋에 다시 fit()을 적용해서는 안 된다.

왜냐하면, 테스트 데이터셋에 다시 fit()을 적용하게 되면 테스트 데이터와 학습 데이터의 매핑된 정보가 서로 달라지기 때문이다.

따라서, 학습 데이터셋에는 fit()과 transform()을 적용하고(fit_transform()도 가능), 테스트 데이터셋에는 학습 데이터셋에 fit된 정보를 활용해서 transform()만 진행해 주면 된다.

다만, 학습 데이터셋에 없는 범주가 테스트 데이터셋에 새롭게 등장하게 된 경우도 생각해서 처리해 줘야 한다.

 

덧붙여서 책에서는 데이터셋을 분리하기 전 전처리를 먼저 진행하는 방식을 권장하지만, 이 방식은 데이터 누수(Data Leakage) 위험이 있다. 따라서,  데이터셋을 우선 분리한 뒤에 위의 방식으로 처리해 주는 것이 맞다.

 

표로 정리하자면 다음과 같다.

  fit() transform() fit_transform()
학습 데이터 O O O
테스트 데이터 X O X

 

참고로 이 방식은 다음에 다룰 스케일링 파트에서도 적용된다.