코딜기

[Python/ML] 범주형 변수 인코딩(Encoding)처리 Label Encoding/One-hot Encoding 본문

ML & DL Process/Data Preprocessing

[Python/ML] 범주형 변수 인코딩(Encoding)처리 Label Encoding/One-hot Encoding

코딜기 2022. 2. 27. 18:22
반응형

범주형 변수는 왜 인코딩을 해야 할까요??

  • 범주형 변수를 분류 모델에 넣으면 모델은 데이터를 인식하지 못하고 에러가 발생합니다.
  • 이를 해결하기 위해 범주형 변수를 수치형 변수로 인코딩 처리를 해줘야 합니다.
  • 인코딩 방법으로 대표적으로 Label Encoding One-hot Encoding이 있습니다.

Label Encoding

  • n개의 범주형 데이터를 0 ~ n-1의 연속적인 수치 데이터로 표현합니다.
  • 인코딩 된 데이터들 간의 차이가 수치적인 차이가 아니기 때문에 데이터의 범주가 3개 이상일 때는 주의해서 사용해야 합니다.
  • 두 개의 범주일 때는 독립적인 의미로 사용이 가능합니다.
  • 라벨 인코딩은 한번 실행시킬 때 단 하나의 컬럼만 실행이 가능합니다.
  • 트리 결정 나무의 분류 모델에서는 범주가 3개 이상이어도 라벨 인코딩을 사용해도 괜찮습니다.
from sklearn.preprocessing import LabelEncoder

# 라벨인코더 선언 및 Fitting
le = LabelEncoder()
le.fit(categorical_data)

# 인코딩한 데이터로 변환
le_encoded = le.transform(categorical_data)

# 결과물을 확인하면 array 형태로 나옵니다.
# 아래는 라벨 인코딩으로 만들어낸 데이터를 데이터 프레임으로 만들어주는 코드입니다.
new_cat = pd.DataFrame(le_encoded, columns = ['result'])

# 아래 코드를 실행시키면 인코딩된 class를 확인할 수 있습니다.
le.classes_

True는 1로 False는 0으로 인코딩된 걸 볼 수 있다.


One-hot Encoding

  • n개의 범주형 데이터를 n개의 비트(0,1) 벡터로 표현합니다.
  • 원핫 인코딩을 하게 되면 서로 다른 범주에 대해서는 벡터 내적을 취했을 때 내적 값이 0이 나오게 됩니다.
  • 이는 서로 다른 범주 데이터를 독립적인 의미로 사용이 가능하게 합니다.
  • 라벨 인코딩과 달리 원핫 인코딩은 여러 범주형 변수를 한 번에 인코딩할 수 있습니다.
  • 변수의 범주 수 만큼 차원이 확대되기 때문에 너무 많은 범주를 가진 변수를 원핫 인코딩을 할 때 주의해야 합니다.
from sklearn.preprocessing import OneHotEncoder

# 원핫인코더 선언 및 Fitting
ohe = OneHotEncoder(sparse=False)
ohe.fit(categorical_data)

# 인코딩한 데이터로 변환
ohe_encoded = ohe.transform(categorical_data)

# 결과물을 확인하면 array 형태로 나옵니다.
# 아래는 기존의 데이터와 원핫 인코딩으로 만들어낸 데이터를 concat하는 코드입니다.
new_cat = pd.DataFrame(ohe_encoded)
categorical_data = pd.concat([categorical_data, new_cat], axis=1)

# 아래 코드를 실행시키면 인코딩된 class를 확인할 수 있습니다.
ohe.categories_

변수의 각 범주별로 열을 할당받고 0 or 1로 차원의 확대가 발생했다.

 

 

반응형
Comments