Feature Engineering 은 머신 러닝 알고리즘이 작동할 수 있도록 하는 Feature들을 만드는 과정으로 그 과정에서 데이터에 대한 도메인 지식을 사용한다.
Feature Engineering은 머신러닝의 적용에 있어서 근본적인 부분이며, 어려운 동시에 까다롭다. 하지만 이것이 적절히 수행되었을 때, 결과가 정말 좋다. 이것은 알고리즘이 잘 작동할지, 또는 작동하지 않을 지의 차이를 일으키는 중요한 요소이다.
인코딩이란 문자를 숫자로 변환하는 것으로 우리가 지금 배우고 있는 머신러닝에서는 문자형 변수가 있으면 오류가 발생하기 때문에 문자형 변수에 대해 인코딩 작업을 해주어야 한다.
레이블 인코딩 (Lable Encoding)
원-핫 인코딩 (Ont-Hot Encoding)
이 중에서도 One-Hot-Encoding에 대해 배워보자!
순서가 없는 데이터
에 사용**독립적**
임을 표현주요 Parameters
data: 적용할 데이터
prefix: 생성할 더미 데이터의 컬럼이름
prefixsep: `default=''`
dummpy_na: NaN
도 포함시킬지
columns: 대상이 되는 컬럼
dtype: 새로운 columns의 데이터 타입
get_dummies()를 사용해서 인코딩해보기
df["Embarked"].value_counts()
pd.get_dummies(df["Embarked"])
💡장점💡
수치형 변수만 알아서 인코딩을 해주기 때문에 편리하다.
💡단점 및 주의사항💡
pandas.get_dummies는 train data set과 test data set 각각에 인코딩이 적용된다.
따라서 train 데이터에만 있고 test 데이터에는 없는 카테고리를 test 데이터에서 One-Hot-Encoding 된 칼럼으로 바꿔주지 않는다.
⇒ train과 test의 컬럼 개수와 컬럼 명 등이 일치하는지를 확인해야 한다.
sklearn.preprocessing.OneHotEncoder
from sklearn.preprocessing import OneHotEncoder
# sparse : bool, default=True
# Will return sparse matrix if set True else will return an array.
# True로 설정하면 희소 행렬을 반환하고 그렇지 않으면 배열을 반환합니다.
ohe = OneHotEncoder(sparse=False)
# fit_transform은 train에만 사용하고 test에는 학습된 인코더에 fit만 해야한다
train_em = ohe.fit_transform(df[['Embarked']])
train_em
sklearn.preprocessing.OneHotEncoder를 사용하여 변환된 결과는 numpy.array이기 때문에 이를 데이터프레임으로 변환하는 과정이 필요하다. (concat 사용)
⇒ pandas.get_dummies를 사용할때보다는 손이 많이 가는 작업이지만 train 데이터에 있던 카테고리의 정보가 test 데이터에도 똑같이 반영할 수 있다.
One-Hot-Encoding은 표현하고 싶은 단어에 1 다른 곳에는 0으로 표현함으로써 구현하는 벡터 표현 방식이다. 이 때 표현된 벡터는 (One-Hot-Vector)라고 한다.
문장 : 나는 자연어 처리를 배운다
Okt 형태소 분석기를 통해서 문장에 대해서 토큰화를 수행합니다.
from konlpy.tag import Okt
okt = Okt()
tokens = okt.morphs("나는 자연어 처리를 배운다")
print(tokens)
['나', '는', '자연어', '처리', '를', '배운다']
각 토큰에 대해서 고유한 정수를 부여한다. 지금은 문장이 짧기 때문에 각 단어의 빈도수를 고려하지 않지만, 빈도수 순으로 단어를 정렬하여 정수를 부여하는 경우가 많다.
word_to_index = {word : index for index, word in enumerate(tokens)}
print('단어 집합 :',word_to_index)
단어 집합 : {'나': 0, '는': 1, '자연어': 2, '처리': 3, '를': 4, '배운다': 5}
토큰을 입력하면 해당 토큰에 대한 원-핫 벡터를 만들어내는 함수를 만든다.
def one_hot_encoding(word, word_to_index):
one_hot_vector = [0]*(len(word_to_index))
index = word_to_index[word]
one_hot_vector[index] = 1
return one_hot_vector
'자연어'라는 단어의 원-핫 벡터를 얻어보자.
one_hot_encoding("자연어", word_to_index)
[0, 0, 1, 0, 0, 0]
'자연어'는 정수 2이므로 원-핫 벡터는 인덱스 2의 값이 1이며, 나머지 값은 0인 벡터가 나오게 된다!