HAYOUNG'S MEMO

Label Encoding and One Hot Encoding 본문

자연어처리

Label Encoding and One Hot Encoding

HAyOunG0518 2019. 1. 29. 11:00

0.Encoding



인코딩은 카테고리 값이나 텍스트 정보를 처리가 쉬운 정수로 변환하는 과정이다.



1.Label Encoding


숫자가 아닌 단어나 글자를, 숫자로 바꿔줘야 딥러닝이 학습할 수 있다.

이럴 대, 글자를 숫자로 바꿔주는 함수가 label encoding이다. 

예를들어 , 데이터셋에서 어떤 칼럼이 국가명으로 되어있다고 하자.


... country name (컬럼명)

...      KR

...      US

...      UK

...      CN

위의 국가 코드를 숫자로 바꿔주기 위해서는 다음과 같이 한다.

from sklearn.preprocessing import LabelEncoder
 
# encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)

그러면 KR->0, US->1, UK->2, CN->3

이런식으로 숫자로 바뀐다.

------------------




Label Encoder는 독립 변수가 아닌 종속 변수(라벨)에 대해 사용한다. 문자열이나 정수로된 라벨 값을 0 ~ K1까지의 정수로 변환한다. 변환된 규칙은 classes_ 속성에서 확인할 수 있다. 예측 결과에 적용할 수 있도록 역변환을 위한 inverse_transform 메서드도 지원한다.

In [29]:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = ['A', 'B', 'A', 'A', 'B', 'C', 'C', 'A', 'C', 'B']
le.fit(y)
le.classes_
array(['A', 'B', 'C'], dtype='<u1')< pre>
In [30]:
y2 = le.transform(y) 
y2
array([0, 1, 0, 0, 1, 2, 2, 0, 2, 1])
In [31]:
le.inverse_transform(y2)
array(['A', 'B', 'A', 'A', 'B', 'C', 'C', 'A', 'C', 'B'], dtype='<u1')< pre>


































------------------------------------------------------------------------------------------------------------

LabelEncoder0과 n_classes-1 사이의 값만 포함하도록 레이블을 표준화하는 데 도움이되는 유틸리티 클래스입니다. 이것은 종종 효율적인 Cython 루틴을 작성하는 데 유용합니다. LabelEncoder다음과 같이 사용할 수 있습니다.



>>> from sklearn import preprocessing
>>> le = preprocessing.LabelEncoder()
>>> le.fit([1, 2, 2, 6])
LabelEncoder()
>>> le.classes_
array([1, 2, 6])
>>> le.transform([1, 1, 2, 6])
array([0, 0, 1, 2])
>>> le.inverse_transform([0, 0, 1, 2])
array([1, 1, 2, 6])

It can also be used to transform non-numerical labels (as long as they are hashable and comparable) to numerical labels:


숫자가 아닌 라벨을 (수치 비교가 가능하고 비교할 수있는 한) 숫자 라벨로 변환하는 데에도 사용할 수 있습니다.

>>>
>>> le = preprocessing.LabelEncoder()
>>> le.fit(["paris", "paris", "tokyo", "amsterdam"])
LabelEncoder()
>>> list(le.classes_)
['amsterdam', 'paris', 'tokyo']
>>> le.transform(["tokyo", "tokyo", "paris"])
array([2, 2, 1])
>>> list(le.inverse_transform([2, 2, 1]))
['tokyo', 'tokyo', 'paris']


















2. One Hot Encoding 


Supervised Learning 감독학습의 분류(Classification)문제에서, 기계에게 학습 시킬 Lable값이 숫자 이외로 되어 있을경우, 숫자로 먼저 만들어 주는 것이 위에서 한 Label Encoding 이고,


위처럼 한 후, Loss 를 계산하기 쉽게 만들어 주기 위해 벡터의 딱 한개의 요소만 1이고, 나머지 요소는 모두 0인 벡터로 , 즉 이진...?으로 만들어주는것이 바로 OneHotEncoding이다. 


위의 예에서   KR->0, US->1, UK->2, CN->3 이렇게 바뀌었는데,


이 값들이 학습(Training)시킬 y값, 즉 Label 값(Supervised learning)이라면,

이값들은 벡터로 바뀌어야한다.


나라명이 전부 4개만 나오므로, 4개로 분류하는 문제에 해당하기 때문에, 벡터의 elements 갯수는 4개가 되며,

KR  => ( 1 , 0, 0, 0 )

US  => ( 0, 1, 0, 0 )

UK  => ( 0, 0, 1, 0 )

CN  => ( 0 , 0, 0, 1 )

이렇게 만들어 주어야 한다. 이렇게 해주는것이 원 핫 인코딩 이다.

from keras.utils import np_utils
 
# convert integers to dummy variables (i.e. one hot encoded)
one_hot_y = np_utils.to_categorical(encoded_Y)



------------------------------------------------------------------------------

One-Hot-Encoder는 one-of-K 인코딩이라고도 불리며 0 ~ K-1 의 값을 가지는 정수 스칼라값을 0 또는 1 값을 가지는 K-차원 벡터로 변환한다. 만약 입력이 스칼라가 아니라 벡터이면 각 원소에 대해 인코딩된 결과를 모두 연결한다. 각 원소의 위치 정보는 feature_indices_ 속성에 저장된다. 또 입력이 벡터인 경우에 특정한 열만 카테고리 값이면 categorical_features 인수를 사용하여 인코딩이 되지 않도록 지정할 수 있다. 이 때 인코딩 결과의 순서가 바뀔 수 있으므로 주의한다.

fit 메서드를 호출하면 다음과 같은 속성이 지정된다.

  • n_values_ : 각 변수의 최대 클래스 갯수
  • feature_indices_ : 입력이 벡터인 경우 각 원소를 나타내는 슬라이싱(slice) 정보
  • active_features_ : 실제로 사용된 클래스 번호의 리스트

One-Hot-Encoding 결과는 메모리 절약을 위해 스파스 행렬(sparse matrix) 형식으로 출력된다. 일반적인 배열로 바꾸려면 toarray 메서드를 사용한다.

In [10]:
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
In [11]:
X = np.array([[0], [1], [2]])
X
array([[0],
       [1],
       [2]])
In [12]:
ohe.fit(X)
ohe.n_values_, ohe.feature_indices_, ohe.active_features_
(array([3]), array([0, 3]), array([0, 1, 2]))
In [13]:
ohe.transform(X).toarray()
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
In [14]:
X = np.array([[0, 0, 4], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) 
X
array([[0, 0, 4],
       [1, 1, 0],
       [0, 2, 1],
       [1, 0, 2]])
In [15]:
ohe.fit(X)
ohe.n_values_, ohe.feature_indices_, ohe.active_features_
(array([2, 3, 5]), array([ 0,  2,  5, 10]), array([0, 1, 2, 3, 4, 5, 6, 7, 9]))
In [16]:
ohe.transform(X).toarray()
array([[1., 0., 1., 0., 0., 0., 0., 0., 1.],
       [0., 1., 0., 1., 0., 1., 0., 0., 0.],
       [1., 0., 0., 0., 1., 0., 1., 0., 0.],
       [0., 1., 1., 0., 0., 0., 0., 1., 0.]])
In [17]:
ohe = OneHotEncoder(categorical_features=[False, True, False])
ohe.fit_transform(X).toarray()
array([[1., 0., 0., 0., 4.],
       [0., 1., 0., 1., 0.],
       [0., 0., 1., 0., 1.],
       [1., 0., 0., 1., 2.]])
In [18]:
ohe.n_values_, ohe.feature_indices_, ohe.active_features_
(array([3]), array([0, 3]), array([0, 1, 2]))