본문 바로가기
머신러닝 (Machine Learning)

[머신러닝]Label Encoder vs One Hot Encoder(레이블인코더, 원핫인코더)

by moveho 2022. 11. 29.

머신러닝에 사용되는 대표적인 인코딩 방법에는 Label Encoder, One Hot Encoder 방식이 있다.

인코딩이 중요한 이유는 머신러닝에 들어가는 데이터가 어떤 데이터인지에 따라 성능이 좌우 되기 때문이다.

 

우선 기본적으로는 결측치(NULL)값은 허용되지 않는다. 데이터분석과는 다르게 머신러닝 모델을 돌리기 위해서는

결측치가 대부분이라면 해당 데이터 Feature 들은 제거 하는것이 좋다.

 

단순 아이디나, 관리번호 등 단순한 행의 식별역할로써 쓰이는 요소들은 예측에 중요한 요소가 절대 될 수 없고

오히려 알고리즘을 복잡하고 무겁게 만들어 예측 성능을 떨어뜨린다.

 

Label Encoder

 

레이블 인코딩은 Feature 들을 코드형 숫자값으로 변환 하는것이다. 레이블 인코딩은 문자열 데이터를 숫자형 카테고리로 변환해준다. 임의적으로 숫자가 할당 되기 때문에 특정 알고리즘에 이를 적용했을 때 성능이 저하 될 수 있는 문제점이 있다. 또한 숫자로 되어있어 가중치로 인식될수도 있어 왜곡(Bias)이 생길 수 있다. 이러한 이유로 선형회귀와 같은 알고리즘에는 적용하지 않는다. 의사결정트리 및 랜덤포레스트 머신러닝 알고리즘에는 이런 특성들이 반영되지 않으므로 레이블 인코딩이 자주 쓰인다.

 

예시

Country = ['France','Spain','Germany','Spain','Germany','France','Spain','France','Germany','France']
Age = [44,27,30,38,40,35,np.nan,48,50,37]
Salary=[72000,48000,54000,61000,np.nan,58000,52000,79000,83000,67000]
Purchased=['No','Yes','No','No','Yes','Yes','No','Yes','No','Yes']
df = pd.DataFrame({'Country': Country,
                   'Age': Age,
                   'Salary': Salary,
                   'Purchased': Purchased})
df

해당 데이터 프레임을 만든 후 레이블 인코더를 사용해보자.

le1= LabelEncoder()
country = le1.fit_transform(df.Country)
country

레이블 인코더로  Country 컬럼 변환

이렇게 변환되는 모습을 볼 수 있다.

 

le1.inverse_transform(country) #복구

 

또한 해당 코드로 다시 인코딩 전으로 복구 할 수 있다.

다만 , 주의점은 각각의 인코더를 사용해 각각 변환 해줬어야만 복구 가능하다.

 

 

One-Hot-Encoder

Feature 의 원래 값에 해당하는 columns 에만 1을 표시하고 나머지 컬럼에는 0을 표시하는 방법이다. 즉, 행 형태로 되어 있는 Feature 값을 차원 변환을 한 뒤, 원래의 값에 해당하는 컬럼에만 1을 표시하고 나머지엔 0을 표시하는 방법이다,!

 

원핫인코더

예시

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
ohe.fit_transform(df.Country.values.reshape(-1,1)).toarray()

array 형태로 country가 표시 된 모습

France, Germany, Spain 이렇게 총 3개의 나라를 표시해 주기 위해 차원이 변환된 모습을 볼 수 있다.

 

원핫인코더는 단어의 개수가 늘어날 수록, 벡터를 저장하기 위해 필요한 공간이 계속 늘어난다는 단점이 있다. 이는 차원이 늘어 나는 것인데, 단어 집합의 크기가 곧 벡터의 차원 수가 됩니다. 이는 저장 공간 측면에서는 매우 비효율적인 표현 방법이라 할 수 있다.

댓글