머신러닝 or 딥러닝의 경우 컴퓨터를 이용하여 데이터를 분석하게 될 것이다.
데이터 분석도중에 문자열
에 관한 변수도 분명히 있을 것이다. 이러한 문자열
에 관한 속성은 아무 전처리없이는 알고리즘이 읽어들이기도 힘들 뿐더러 사용자가 분석에 사용하기에는 적합하지 않다.
그래서 이러한 분석하기 어려운 변수들을 숫자형
으로 변환시켜주는 것이 Encoding
이라고 할 수 있다. 머신러닝 모델에 학습을 시킬 때에는 이러한 전처리 기법을 사용하여 Feature Engineering
을 거쳐야 한다.
Encoding
에는 두가지 종류가 있다.
Label Encoding
Onehot Encoding
인간의 혈액형에는 4가지 종류가 있다. 'A', 'B', 'O', 'AB'가 있는것은 누구나 알 것이다. 이러한 범주형 속성을 그대로 머신러닝 모델에 넣기에는 적합하지 않다. 문자열이기 때문이다. 이를 숫자로 치환할 수 있다면??
'A' = 1, 'B' = 2, 'O' = 3, 'AB' = 4
처럼 말이다. 이와같은 인코딩 방법을 Label Encoding
이라고 한다.
from sklearn.preprocessing import LabelEncoder
blood = ['A','A','O','AB','O','B','O']
Label Encoding
을 하기 위해 sklearn.preprocessing
에서 LabelEncoder
을 import 실행한다.
인코더 실습을 실행하기 위해 임의로 blood라는 리스트를 생성했다.
blood
['A', 'A', 'O', 'AB', 'O', 'B', 'O']
Label = LabelEncoder()
Label.fit(blood)
labels = Label.transform(blood)
print("인코딩 후 : ", labels)
인코딩 후 : [0 0 3 1 3 2 3]
라벨 인코딩한 결과를 보면 'A'는 0으로, 'B'는 1, 'O'는 3, 마지막으로 'AB'는 2로 인코딩된것을 알 수 있다. 딱 보면 알 수 있듯이 알파벳순서대로 인코딩이 됬다.
fit()
: 데이터로 사이킷런 ML 모델을 학습시키는 메서드transform()
: 입력된 데이터의 형태에 맞추어 데이터를 직접 변환시키는 메서드즉, 위 코딩의 단계를 설명하자면
1. Label
변수에 LabelEncoder() 함수를 적용
2. Label
변수 (LaberEncoder())의 fit()
메서드를 이용하여 blood 데이터를 적용. 즉, blood 데이터로 LaberEncoder이라는 모델을 학습
3. transform()
메서드를 이용하여 학습된 LabelEncoder
이라는 모델을 blood에 적용
Label Encoding
은 객체 하나하나당 숫자를 부여한 인코더이다. 매우 간단한 방법!!
이번에 배울 Onehot Encoding
은 숫자가 아닌 벡터
를 부여한다.
위에서 예제로 봤던 혈액형을 가지고 예를 들어보자
혈액형 | Onehot Encoding |
---|---|
A | {1, 0, 0, 0} |
AB | {0, 1, 0, 0} |
B | {0, 0, 1, 0} |
O | {0, 0, 0, 1} |
즉, Feature 유형에 따라 새로운 Feature를 추가하여 고유 값에 해당하는 칼럼만 1, 나머지는 0으로 표시한다.
from sklearn.preprocessing import OneHotEncoder
Onehot Encoding
을 하기 위해 OneHotEncoder을 import한다.
Label Encoding
은 리스트 그 자체로 인코딩이 가능했다. 그런데
리스트인채로 Onehot
은 불가능했다. Onehot
은 Numpy에서 배열로 변환해줘야 한다. 배열도 1열 배열(?)로 변환시켜줘야 한다.
blood = ['A','A','O','AB','O','B','O']
blood = np.array(blood)
blood = blood.reshape(-1, 1)
blood 자체는 리스트라서 np.array로 배열변환을 했다. 그 후에 reshape(-1, 1)을 이용하여 1열 배열로 변환. reshape(-1, 1)은 나중에 다시 봐보자.
ohe = OneHotEncoder()
ohe.fit(blood)
oh_label = ohe.transform(blood)
print("OneHotEncoder")
print(oh_label.toarray())
print("OnehotEncoder dim()")
print(oh_label.shape)
그러면 정상적으로 출력이 된다.
(차원의 저주 문제)
Random Forest
같은 경우 일부 Feature만 샘플링하여 트리를 만들어나간다.