데이터 전처리(preprocessing)란, 데이터를 학습에 사용할 수 있도록, 보다 학습 결과가 좋게 나타날 수 있도록 데이터를 처리하는 과정이다. 전처리에서 사용하는 기법은 여러가지가 있는데 이번 글에서는 그 중 하나인 데이터 인코딩에 대해서 소개한다.
레이블 인코딩(label encoding)
사이킷런의 머신러닝 알고리즘은 문자열을 입력값으로 허용하지 않는다. 따라서 모든 문자열은 인코딩 돼서 숫자 형으로 변환해야 한다. 예를 들어 성별을 나타내는 피쳐의 경우 'male', 'female'과 같이 문자열의 형태로 데이터가 저장되어 있을 수 있다. 이는 바로 input으로 사용할 수 없기 때문에 male ->0, female -> 1과 같이 int형태로 바꾼 후 input으로 이용해야 한다.
위에서와 같이 각각의 카테고리 하나를 하나의 정수값에 대응시키는 방법을 레이블 인코딩이라고 한다. 사이킷런에서는 LabelEncoder클래스를 이용하여 레이블 인코딩을 구현할 수 있다.
다음과 같이 encoder에 LabelEncoder()를 할당하고 fit()메서드를 이용하면 각각의 카테고리 하나에 정수값 하나를 할당한다. 그 후 transform()메서드를 이용하여 items에 있는 문자열들을 fit()에서 지정해주었던 정수값으로 모두 변환할 수 있다.
fit(): 카테고리 하나에 정수값 하나를 할당. 참조표와 같은 역할을 한다.
문자열 | 정수 |
TV | 0 |
냉장고 | 1 |
믹서 | 2 |
선풍기 | 3 |
전자레인지 | 4 |
컴퓨터 | 5 |
transform(): fit()에서 할당한 정수값을 참조하여 데이터를 문자열에서 정수값으로 변환한다.
※정수값은 abc가나다 순으로 할당한다.
※이전 글에서 소개했듯이, 학습에서도 fit()메서드를 사용한다. 중요한 점은 학습에서는 fit()으로 모델을 학습한 이후 predict()를 이용하여 결과를 예측하지만, 전처리에서는 fit()으로 카테고리에 정수를 할당하고 transform()으로 데이터를 인코딩한 값으로 변환한다.
그런데 레이블 인코딩은 특정 알고리즘에서 사용했을 때 좋지 않은 성능을 보일 수 있다. 선형 회귀에서는 정수값이 높은 컴퓨터가 정수값이 낮은 TV와 동일하게 인식하지 않고 큰 값인 5를 더 중요하게 인식하거나 가중치가 부여될 수 있다. 실제로 컴퓨터와 TV의 차이는 그저 상품의 목록의 차이일 뿐 어떤 상품이 더 중요한 지의 정보를 담고있지 않기 때문에 레이블 인코딩을 통해 인코딩하면 잘못된 방향으로 학습이 이루어질 수 있다.
※트리 계열의 ML알고리즘은 숫자의 이러한 특성을 반영하지 않기 때문에 레이블 인코딩이 크게 문제되지 않는다.
원-핫 인코딩(One-Hot Encoding)
원-핫 인코딩은 위에서 언급한 문제를 해결하기 위해 나온 인코딩 기법이다.
피처 값의 유형(카테고리)에 따라 새로운 피처를 추가해 고유 값에 해당하는 column에만 1을 표시하고 나머지는 0을 표시하는 방법이다. 즉, 행 형태의 피처 고유값을, 열 형태로 변환하여 0과 1로 구분하는 것이다.
LabelEncoding과 비슷한 방식으로 사용된다. oh_encoder에 OneHotEncoder()를 할당하고, fit(), transform()을 이용하여 데이터를 인코딩한다. 주의할 점은 데이터그냥 사용하는 것이 아니라 reshape(-1,1)로 변환해 주어야 에러가 나지 않는다.
그런데 판다스에서는 원-핫 인코딩을 보다 쉽게 사용할 수 있도록 지원한다. get_dummies()를 이용하면 일련의 과정을 생략하고 바로 데이터가 변환된다.
※위의 예시처럼 꼭 DataFrame이여야할 필요는 없다 Series에서도 잘 동작한다.
#이 글은 권철민 작가님의 [파이썬 머신러닝 완벽가이드]를 통해 공부한 내용을 바탕으로 정리하였습니다.
'Machine Learning > Preprocessing' 카테고리의 다른 글
하이퍼 파라미터 튜닝 기법 (Grid Search, 베이지안 최적화) (0) | 2022.08.05 |
---|---|
타이타닉 생존자 예측 (0) | 2022.05.09 |
피처 스케일링(feature scaling) (0) | 2022.05.08 |
교차 검증 (Cross Validation) (0) | 2022.05.08 |
train_test_split(), fit(), predict() (0) | 2022.05.08 |