인코딩과 피처 엔지니어링

문호준·2022년 11월 10일
0

Feature Engineering

Feature Engineering 은 머신 러닝 알고리즘이 작동할 수 있도록 하는 Feature들을 만드는 과정으로 그 과정에서 데이터에 대한 도메인 지식을 사용한다.

Feature Engineering은 머신러닝의 적용에 있어서 근본적인 부분이며, 어려운 동시에 까다롭다. 하지만 이것이 적절히 수행되었을 때, 결과가 정말 좋다. 이것은 알고리즘이 잘 작동할지, 또는 작동하지 않을 지의 차이를 일으키는 중요한 요소이다.

인코딩?

인코딩이란 문자를 숫자로 변환하는 것으로 우리가 지금 배우고 있는 머신러닝에서는 문자형 변수가 있으면 오류가 발생하기 때문에 문자형 변수에 대해 인코딩 작업을 해주어야 한다.

머신러닝의 대표적인 인코딩 방식

  • 레이블 인코딩 (Lable Encoding)
    • 문자열 카테고리 값을 숫자형 카테고리 값으로 변환
  • 원-핫 인코딩 (Ont-Hot Encoding)
    • 행 형태의 피처값을 열 형태로 변환한 뒤 피처값 인덱스에 해당하는 컬럼에는 1로 표시하고 나머지 칼럼에는 0으로 표시하는 방식.

이 중에서도 One-Hot-Encoding에 대해 배워보자!

정의

  • 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식
  • 한 개의 요소는 True, 나머지 요소는 False로 만들어주는 기법
    • 순서가 없는 데이터에 사용
    • 해당 관계는 **독립적**임을 표현
    • 흩어져있을 뿐 모든 정보 유지
  • 즉, 모든 범주형 변수를 정수인 1과 0의 이진형 벡터로 표시하면서 범주형 변수를 열거하고, 해당하지 않는 모든 항목은 0(Flase 값)으로, 해당하는 항목은 1(True 값)로 표시하는 것이다.

필요성

  • ML 알고리즘은 데이터에 기반하고 있기 때문에 어떤 데이터를 입력하느냐에 따라 결과도 크게 달라진다.
  • 데이터를 컴퓨터가 인식할 수 있도록 변형해줘야 한다.
  • scikit-learn에서 제공하는 머신러닝 알고리즘은 문자열 값을 입력 값으로 허락하지 않기 때문에 모든 문자열 값들을 숫자형으로 인코딩하는 전처리 작업 후에 머신러닝 모델에 학습을 시켜야 한다.
    • 모든 데이터는 숫자형(정수, 실수)
    • 데이터에 빈 값이 없어야 함 (Null 안됨)
    • 문자열은 허용X

사용방법

1. pandas의 get_dummies()

주요 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의 컬럼 개수와 컬럼 명 등이 일치하는지를 확인해야 한다.

2. sklearn의 OneHotEncoder

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 데이터에도 똑같이 반영할 수 있다.

3. Okt 형태소 분석기를 통한 One-Hot-Encoding

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인 벡터가 나오게 된다!

profile
고수

0개의 댓글