운동하는 공대생

Data Preprocessing(데이터 전처리)-Label encoding(레이블 인코딩),One-Hot encoding(원-핫 인코딩) 본문

Machine Learning

Data Preprocessing(데이터 전처리)-Label encoding(레이블 인코딩),One-Hot encoding(원-핫 인코딩)

운동하는 공대생 2022. 11. 22. 16:01
728x90
반응형

Label encoding(레이블 인코딩)

데이터 예측 모델을 훈련 하가 위해서 많은 머신러닝 알고리즘은 문자열 데이터 형식을 지원하지 않는다. 그래서 모든 문자열 값은 인코딩 돼서 숫자 형으로 변황이 되어야 한다. 

 

문자의 종류는 연속적인 값인 수치형 데이터와 범주형 데이터가 있다. 범주형 데이터들은 예측값과 연관성을 분석해보면 예측하려 하는 컬럼과 연관성이 있다면 수치형으로 바꾸는 레이블 인코딩 방식을 사용하여 데이터를 바꿔 주어야 하지만 범주형 데이터에서도 식별자의 특징을 띄는 범주형 데이터는 오히려 예측 성능을 덜어 뜨리기도 한다. 식별자의 특징을 가지는 범주형 데이터는 예를 들어 주민번호, 아이디 같은 한 행이 다른 행과 다른 것을 식별이 가능한 테이터를 말한다. 

 

 

from sklearn.preprocessing import LabelEncoder

items=['TV', '냉장고', '전자레인지', '컴퓨터', '선풍기', '믹서', '믹서']

#LabelEncoder를 객체로 생성하여 fit(), transform()으로 데이블 인코딩 수행
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
print(labels)
#output: [0 1 4 5 3 3 2 2]

print(encoder.classes_)
#ouput: ['TV', '냉장고','믹서','선풍기',  '전자레인지', '컴퓨터']

print(encoder.inverse_transform([0 1 4 5 3 3 2 2]))
#output: ['전자레인지' '컴퓨터' '믹서' 'TV' '냉장고' '냉장고' '선풍기' '선풍기']

 

-단점

 레이블 인코딩 방식은 범주형 데이터를 모델이 학습을 하는게 가능하도록 형태를 바꿔주지만 범주형이라는 데이터 형식은 바뀌게 된다. 그래서 데이터를 모델에 적용시켜 학습을 진행하면 특정 알고리즘에서는 수치형으로 데이터를 생각하고 값이 더 큰 값에 가중치를 두고 학습하는 문제가 발생한다. 이러한 특징 때문에 선형 회귀와 같은 알고리즘에서는 적용하지 않아야 하고. 트리 계열의 알고리즘은 숫자의 이러한 특성을 반영하지는 않는다.

 

One-Hot encoding(원-핫 인코딩)

 원-핫 인코딩 방식은 새로운 피처를 추가를 해서 고유 값에 해당하는 컬럼에만 1을 표시하고 나머지는 모두 0으로 표시하는 방식을 말한다. 

 

 

 그림에서 본다면 이전의 범주형 데이터였던 'Food Name' 컬럼의칼럼의 데이터들이 칼럼의 이름으로 바뀌면서 각 행이 해당하는 칼럼에는 1 그리고 나머지는 0 값을 채워서 표시한다.

 

from sklearn.preprocessing import OneHotEncoder
import numpy as np

items=['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']

#2차원 ndarray 로 변환
items = np.array(items).reshape(-1,1)

#원-핫 인코딩을 적용합니다.
oh_encoder = OneHotEncoder()
oh_encoder.fit(items)
oh_labels = oh_encoder.transform(items)

#OneHotEncoder로 변환한 결과는 희소행렬이므로 toarray()를 이용해 밀집 행렬로 변환다.

print(oh_labels.toarray())
print(oh_labels.shape())

#output
#[[1,0,0,0,0,0],
#[0,1,0,0,0,0],
#[0,0,0,0,1,0],
#[0,0,0,0,0,1],
#[0,0,0,1,0,0],
#[0,0,0,1,0,0],
#[0,0,1,0,0,0],
#[0,0,1,0,0,0]]
#(8,6)

 

728x90
반응형
Comments