소소한 컴퓨터 이야기

Label Encoding

by Cori

개요

Label Encoding이 무엇인지, 어떻게 사용되는지에 대해 알아본다.

 

내용 정리

0. 범주형 데이터

-> scikit-learn의 머신러닝 API들은 Feature나 Label의 값들이 숫자 (정수 / 실수)인 것만 처리할 수 있기 때문에, 문자열일 경우 

숫자형으로 변환하여 처리해야 한다. 

 

* 범주형이 아닌 단순 문자열인 경우, 일반적으로 제거함 

 

1. 레이블 인코딩 (Label Encoding)

0) 정의

-> 문자열(범주형) 값을 오름차 순으로 정렬 후 0부터 1씩 증가하는 값으로 변환한다.

 

숫자의 차이가 모델에 영향을 주지 않는 트리 계열 모델(의사결정나무, 랜덤포레스트)에 적용하며,

숫자의 차이가 모델에 영향을 미치는 선형 계열 모델 (로지스틱회귀, SVM, 신경망)에는 사용할 수 없다. 

 

1) 함수

-> sklearn.preprocessing.LabelEncoder()

더보기

· fit(): 어떻게 변환할 지 학습 

· transform: 문자열을 숫자로 변환 

· fit_transform: 학습과 변환을 한번에 처리

· inverse_transform: 숫자를 문자열로 변환

· classes_: 인코딩한 클래스 조회 

 

2) 예제

-> 다음 그림과 같이 TV, 냉장고 등의 가전제품에 대해 레이블 인코딩을 진행해보자.

· 라벨 인코더 라이브러리 import

· 라벨 인코더 객체 생성 및 학습

-> 학습(fit)시에 고유값을 찾아서 정렬한 후, 0부터 1씩 증가하는 정수를 매핑한다. 

· 인코딩 변환 값 출력

-> TV: 0, 냉장고: 1, 컴퓨터: 3, 에어컨: 2 로 변환된 것을 확인할 수 있음 

· 인코딩 클래스 출력, classes_

· 디코딩 원본 값 출력, inverse_transform

* 레이블 인코딩의 경우, 학습하지 않은 값을 transform할 경우 에러가 발생한다.

ex) '냉장고', 'TV', '에어컨', '컴퓨터'에 대해 학습한 Label Encoder에 '핸드폰'을 transform할 경우 다음과 같은 에러 발생

3) 응용

-> 1994년 인구조사 데이터베이스에서 추출한 미국 성인의 소득 데이터셋인 Adult Dataset에 Label Encoding을 적용해보자.

 

* 다운로드 링크

 

UCI Machine Learning Repository: Adult Data Set

Adult Data Set Download: Data Folder, Data Set Description Abstract: Predict whether income exceeds $50K/yr based on census data. Also known as "Census Income" dataset. Data Set Characteristics:   Multivariate Number of Instances: 48842 Area: Social Attr

archive.ics.uci.edu

· 필요 라이브러리 import

· 데이터 불러오기

columns 명을 직접 지정하고, 결측치 데이터는 '?' 형태로 읽어들이도록 설정하여 데이터를 불러왔다.

문자열 인코딩을 위해 데이터셋 구조를 확인하고,

결측치 데이터를 제거한다. (data.isnull.sum()를 통해, 컬럼별로 결측치가 몇 개씩 들어있는지 확인 가능)

 

· Label Encoding

Adult-data의 컬럼들을 정리해보면 다음과 같다. 

이에 인코딩할 컬럼들과, 인코딩하지 않은 컬럼들을 다음과 같이 나누었다.

encoding_columns에 들어있는 컬럼들 각각에 대해 LabelEncoder를 생성하고, 학습하여 고유값을 생성하는 과정을 반복하였다. 

다음은 강사님 Code (dictionary 이용)

* 더 좋은 방법이 있는데, apply 함수를 적용하면 각각의 컬럼에 대해 개별 수행을 하지 않고 단체로 적용할 수 있다.

data[encoding_columns]에 대해 apply 함수를 적용하여 레이블 인코딩을 적용하였다. 

Label Encoding한 컬럼들에 대해, non-encoding 컬럼들과 다시 병합해야 함 -> DataFrame join 하기 

· Train set, Test set 데이터 분할

우리가 최종적으로 예측할 데이터는 'income'이다. 이를 활용해 X, y 데이터를 구분하였다.

· 모델 학습 (DecisionTree)

DecisionTree 모델을 생성하고 X_train, y_train set을 활용하여 의사결정 나무를 학습시켰다.

· 모델 검증

X_train set과 X_val set을 이용하여 모델 예측 수행

train set, validation set의 실제 값과 예측 값을 scikit-learn 라이브러리의 accuracy_score 함수를 사용하여 검증해 보았을 때

train set의 정확도는 0.82, validation set의 정확도는 0.81 정도가 나온 것을 알 수 있다.

· 모델 평가

test set에 대해서도 위와 같은 작업을 진행하여, 최종적으로 모델 평가를 마무리하였다.

'AI > Machine Learning' 카테고리의 다른 글

불균형 클래스 분류 다루기  (0) 2021.11.28
과적합과 일반화  (0) 2021.11.26
수치형 데이터 전처리  (0) 2021.11.25
One-Hot Encoding  (0) 2021.11.24
데이터셋 나누기 & 교차 검증  (0) 2021.11.22

블로그의 정보

코딩하는 오리

Cori

활동하기