ML (3) - Preprocessing 2 : Label Encoding, One-Hot Encoding

govldbstj·2023년 2월 16일
0

수치형 데이터, 범주형 데이터

일반적으로 데이터는 수치형 데이터(Numerical Data) 와 범주형 데이터(Categorical Data)로 구분할 수 있다.

수치형 데이터(Numerical Data) : 숫자의 형태로 나타나는 데이터. 양적 데이터라고 함.
수치형 데이터는 다시 연속형 데이터(Continuous Data)와 이산형 데이터(Discrete Data)로 구분할 수 있다. 연속형 데이터는 주로 키, 몸무게 등 '측정'을 통해 얻을 수 있는 값이고, 이산형 데이터는 개수를 세서 얻을 수 있는 값이다.

범주형 데이터(Categorical Data) : 카테고리별로 분류되어 나타나는 데이터. 질적 데이터라고 함.
범주형 데이터는 다시 순위형 데이터(Ordinal Data)와 명목형 데이터(Nomial Data)로 나뉜다. 만족도, 학점과 같이 범주에 해당하는 데이터들 간에 순위가 있는 경우를 순위형 데이터라고 한다. 성별, 혈액형과 같이 데이터 간 순위가 없는 경우를 명목형 데이터라고 한다.

# qualitative to quantitative
qual_col = ['LINE', 'PRODUCT_CODE']

for i in qual_col:
    le = LabelEncoder()
    le = le.fit(train_x[i])
    train_x[i] = le.transform(train_x[i])
    
    for label in np.unique(test_x[i]): 
        if label not in le.classes_: 
            le.classes_ = np.append(le.classes_, label)
    test_x[i] = le.transform(test_x[i]) 
print('Done.')

위 코드는 데이콘에서 분류 문제의 베이스라인으로 제공하는 코드 중 일부이다.

범주형 데이터를 label encoding이라는 방법을 통해 수치형 데이터로 변환하는 함수이다.

Encoding

모델을 학습시키기 위해서는 숫자 또는 벡터로 데이터를 바꿔 넣어주어야 한다. 이 과정을 인코딩이라고 한다!
선형 모델의 경우 One-hot Encoding, 트리 기반의 비선형 모델의 경우 Label Encoding을 많이 사용한다.

참고로 선형 모델은 계수들이 선형 결합의 관계에 있을 때를 의미한다. 비선형 모델은 데이터를 어떻게 변형하더라도 파라미터들을 선형 결합식으로 표현할 수 없는 모델을 의미한다.

Label Encoding

레이블 인코딩 : 문자열 카테고리 값을 숫자형 카테고리 값으로 변환하는 방법.
ex) 사과 -> 1, 바나나 -> 2, 키위 -> 3 등으로 변환
사이킷런의 LabelEncoder을 이용한다.

from sklearn.preprocessing import LabelEncoder

items = ['사과', '바나나', '키위']

encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)

위에서 언급한 것처럼 레이블 인코딩은 트리 기반의 비선형 모델에서 많이 이용한다. 의사결정트리가 모여서 구성되는 트리 기반의 비선형 모델에서는 레이블값의 대소로 분기점을 나누기 때문에 유용하다. 그러나 선형 모델에 레이블 인코딩을 적용하면 아까 분류한 사과 1, 바나나 2, 키위 3을 수치로 인식할 수 있기 때문에 위험할 수 있다.

One-Hot Encoding

원핫 인코딩 : 피쳐값을 열 형태로 변환한 뒤 벡터로 표현하는 방법
사이킷런의 OneHotEncoder을 이용한다.
(1) 문자열 값을 숫자형 값으로 변환 (레이블 인코딩으로)
(2) 입력값을 2차원 데이터로 변환
(3) onehotencoding 적용

from sklearn.preprocessing import OneHotEncoder
import numpy as np

# 1) 문자열 값을 숫자형 값으로 변환 (레이블 인코딩 사용)
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)

# 2) 입력 값을 2차원 데이터로 변환
labels = labels.reshape(-1, 1) # 컬럼수 1로 고정 행은 자동으로 구성 (-1)
labels

# 3) OneHotEncoder 클래스로 원-핫 인코딩 적용
onehot_encoder = OneHotEncoder()onehot_encoder.fit(labels)
onehot_labels = onehot_encoder.transform(labels)
onehot_labels
# (1)
array([0, 1, 2])
# (2) 
array([[0],
       [1],       
       [2]])
# (3)
[[1. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0.]
[0. 0. 1. 0. 0. 0.]]
profile
ajou software 20

0개의 댓글