본문 바로가기
ML,DL

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

by 공부기 2022. 9. 19.

 

데이터 인코딩에 대해 정리한 내용이다.

 

 

데이터 인코딩

머신러닝 모델은 문자 데이터를 인식하지 못하기 때문에 문자로 구성된 범주형 데이터는 숫자로 바꿔야 한다.

이미 숫자로 구성된 범주형 데이터도 모델 성능 향상을 위해 다른 숫자 데이터로 바꾸기도 한다.

 

 

 

1. 레이블 인코딩 (label encoding)

  • 레이블 인코딩은 범주형 데이터를 숫자로 일대일 매핑해주는 인코딩 방식
  • 범주형 데이터를 숫자로 치환
  • 사이킷런의 LabelEncoder로 구현

 

다음은 사이킷런의 LabelEncoder로 레이블 인코딩을 적용해 과일 문자열 데이터를 숫자형으로 변환하는 코드다.

from sklearn.preprocessing import LabelEncoder # 레이블 인코더

fruits = ['사과', '블루베리', '바나나', '귤', '블루베리', '바나나', '바나나', '사과']

# 레이블 인코더 생성
label_encoder = LabelEncoder()

# 레이블 인코딩 적용
fruits_label_encoded = label_encoder.fit_transform(fruits)

print('레이블 인코딩 적용 후 데이터: ', fruits_label_encoded)

 

레이블 인코딩 적용 후 데이터:  [3 2 1 0 2 1 1 3]

 

레이블 인코딩을 적용하니 귤 0, 바나나 1, 블루베리 2, 사과 3 으로 바뀌었다.

 

 

 

 

레이블 인코딩의 단점

 

명목형 데이터를 인코딩하면 모델 성능이 떨어질 수 있다.

머신러닝 모델이 서로 가까운 숫자를 비슷한 데이터라고 판단하기 때문이다.

 

무슨 말이냐면, 0(귤)과 2(블루베리)보다

0(귤)과 1(바나나)를 더 비슷한 데이터라고 인식하는 것이다.

실제로는 네 과일 모두 별개의 데이터다.

 

이 문제는 원-핫 인코딩으로 해결할 수 있다.

 

 

 

 

2. 원-핫 인코딩 (one-hot encoding)

원-핫 인코딩은 여러 값 중 하나(one)만 활성화(hot)하는 인코딩이다.

 

<실행절차>

1. 인코딩하려는 피처의 고윳값 개수를 구한다.

2. 피처의 고윳값 개수만큼 열을 추가한다.

3. 각 고윳값에 해당하는 열에 1을 표시하고 나머지 열에는 0을 표시한다.

 

원-핫 인코딩을 적용하면 다음과 같이 된다.

 

 

원-핫 인코딩은 레이블 인코딩의 문제(서로 가까운 숫자를 비슷한 데이터로 판단)를 해결한다.

하지만 이렇게 열 개수가 늘어나서 지나치게 많아지면 모델 훈련 속도가 느려지는 단점이 있다.

 

명목형 피처에 고윳값이 많을 때 해결하는 방법

  • 비슷한 고윳값끼리 그룹화
  • 빈도가 낮은 고윳값을 기타(etc)로 처리
  • 다른 인코딩 적용

 

 

다음은 위의 과일 데이터를 원-핫 인코딩하는 코드다.

 

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

fruits = ['사과', '블루베리', '바나나', '귤', '블루베리', '바나나', '바나나', '사과']

# 레이블 인코더, 원-핫 인코더 생성
label_encoder = LabelEncoder()
onehot_encoder = OneHotEncoder()

# 레이블 인코딩 적용(문자 데이터 -> 숫자 데이터)
fruits_label_encoded = label_encoder.fit_transform(fruits)

# 원-핫 인코딩 적용
fruits_onehot_encoded = onehot_encoder.fit_transform(fruits_label_encoded.reshape(-1,1))

print('원-핫 인코딩 적용 후 데이터: \n', fruits_onehot_encoded.toarray())

 

원-핫 인코딩 적용 후 데이터: 
 [[0. 0. 0. 1.]
 [0. 0. 1. 0.]
 [0. 1. 0. 0.]
 [1. 0. 0. 0.]
 [0. 0. 1. 0.]
 [0. 1. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 0. 1.]]

 

코드 실행 결과 위의 그림 과 같다.

 

 

 

 

 

 

 

 

 

 

참고 교재

 

머신러닝·딥러닝 문제해결 전략 |  신백균

 

[머신러닝·딥러닝 문제해결 전략 - chapter5]