티스토리 뷰

반응형

모델은 문자 데이터를 인식하지 못하므로, 숫자 데이터로 바꿔주는 라벨링을 해야 한다.

 

레이블 인코딩

범주형 데이터를 숫자로 일대일 매핑해주는 인코딩 방식

https://www.kaggle.com/werooring/ch5-categorical-data-encoding

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]

 

레이블 인코딩은 간단하지만 단점이 있다.

명목형 데이터를 레이블 인코딩하면 모델 성능 하락. 

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

이 문제를 원-핫 인코딩으로 해결한다.

 

원-핫 인코딩

 

여러 값 중 하나만 활성화 하는 인코딩

 

1. 피처의 교유값 개수를 구한다.

 

2. 피처의 고유값 개수만큼 열을 추가

 

3. 각 고유값에 해당하는 열에 1을 포시하고 나머지 열에는 0을 표시

 

한마디로 각 고유값이 1이고, 나머지는 0인 열들을 가로로 이어붙인다.

 

그러나 원-핫 인코딩도 열 개수가 지나치게 많아진다는 단점이 있어 모델 훈련속도가 느려질 수 있다.

 

따라서 고윳값이 상당히 많다면

 

1. 비슷한 고윳값끼리 그룹화

2. 빈도가 낮은 고윳값을 기타(etc)로 처리하기

3. 다른 인코딩 적용하기 - 타깃 인코딩, 프리퀀시 인코딩 등

 

고윳값 개수가 많아도 데이터 크기가 그렇게 크지 않다면 그냥 원-핫 적용

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.]]

 

레이블 인코딩 후에 원핫 인코딩 적용

 

reshape 메소드

 

배열 형상 바꿀 때 사용

 

fruits_label_encoded
array([3, 2, 1, 0, 2, 1, 1, 3])

fruits_label_encoded.reshape(4, 2)
array([[3, 2],
       [1, 0],
       [2, 1],
       [1, 3]])

fruits_label_encoded.reshape(-1, 1)
array([[3],
       [2],
       [1],
       [0],
       [2],
       [1],
       [1],
       [3]])

-1,1은 원본 데이터와 나머지 형상을 참고해서 최종 형상을 적절히 바꿔준다.

reshape (3,-1) 같은 걸 호출하면 오류가 난다. (왜냐하면 원본 데이터가 8개가 3으로 나눠지지 않기 때문)

 

reshape(-1,4)는 2,4 형상, reshape(4,-1)이면 4,2 형상

 

원 핫 인코딩의 코드는 CSR 행렬로 돌려준다.

.toarray()는 CSR 형태의 행렬을 일반 배열로 바꿔주는 역할

 

pandas의 get_dummies() 함수를 사용하면 숫자형으로 바꾸지 않고도 바로 원-핫 인코딩이 된다.

 

 

출저 : 머신러닝 문제해결 전략 / 골든래빗 저

https://wikidocs.net/book/13313

반응형