HAYOUNG'S MEMO
Label Encoding and One Hot Encoding 본문
0.Encoding
인코딩은 카테고리 값이나 텍스트 정보를 처리가 쉬운 정수로 변환하는 과정이다.
1.Label Encoding
숫자가 아닌 단어나 글자를, 숫자로 바꿔줘야 딥러닝이 학습할 수 있다.
이럴 대, 글자를 숫자로 바꿔주는 함수가 label encoding이다.
예를들어 , 데이터셋에서 어떤 칼럼이 국가명으로 되어있다고 하자.
... country name (컬럼명)
... KR
... US
... UK
... CN
위의 국가 코드를 숫자로 바꿔주기 위해서는 다음과 같이 한다.
이런식으로 숫자로 바뀐다.
------------------
Label Encoder는 독립 변수가 아닌 종속 변수(라벨)에 대해 사용한다. 문자열이나 정수로된 라벨 값을 ~ 까지의 정수로 변환한다. 변환된 규칙은 classes_
속성에서 확인할 수 있다. 예측 결과에 적용할 수 있도록 역변환을 위한 inverse_transform
메서드도 지원한다.
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = ['A', 'B', 'A', 'A', 'B', 'C', 'C', 'A', 'C', 'B']
le.fit(y)
le.classes_
y2 = le.transform(y)
y2
le.inverse_transform(y2)
------------------------------------------------------------------------------------------------------------
LabelEncoder
0과 n_classes-1 사이의 값만 포함하도록 레이블을 표준화하는 데 도움이되는 유틸리티 클래스입니다. 이것은 종종 효율적인 Cython 루틴을 작성하는 데 유용합니다. LabelEncoder
다음과 같이 사용할 수 있습니다.
It can also be used to transform non-numerical labels (as long as they are hashable and comparable) to numerical labels:
숫자가 아닌 라벨을 (수치 비교가 가능하고 비교할 수있는 한) 숫자 라벨로 변환하는 데에도 사용할 수 있습니다.
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 )
이렇게 만들어 주어야 한다. 이렇게 해주는것이 원 핫 인코딩 이다.
------------------------------------------------------------------------------
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
메서드를 사용한다.
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
X = np.array([[0], [1], [2]])
X
ohe.fit(X)
ohe.n_values_, ohe.feature_indices_, ohe.active_features_
ohe.transform(X).toarray()
X = np.array([[0, 0, 4], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
X
ohe.fit(X)
ohe.n_values_, ohe.feature_indices_, ohe.active_features_
ohe.transform(X).toarray()
ohe = OneHotEncoder(categorical_features=[False, True, False])
ohe.fit_transform(X).toarray()
ohe.n_values_, ohe.feature_indices_, ohe.active_features_
'자연어처리' 카테고리의 다른 글
scikit-learn 패키지 (0) | 2019.01.29 |
---|---|
pandas 패키지의 dataframe 인덱싱(열/행/boolean 인덱싱), .iloc, .loc (0) | 2019.01.29 |
파이썬 KoNLPy 패키지 사용 방법 (0) | 2019.01.23 |
형태소 분석기 성능 비고 (0) | 2019.01.23 |
파이썬의 문자열 인코딩 (0) | 2019.01.22 |