본문 바로가기
ASAC 5기/Machine Learning

03. 데이터 전처리 및 인코딩

by 망고 ෆ 2024. 6. 18.

1. 결측치 처리

데이터를 처리하는 과정에서 결측치를 처리해야 하는 방법을 선정하는 것이 중요하다.

Null값이 많지 않다면 피처의 평균값으로 대체할 수도 있고, Null값이 너무 많다면 그 피처는 드랍할 수도 있다.

하지만, 만약 그 피처가 중요한 피처이고 단순히 평균값이나 0으로 대체할 경우에 예측 왜곡이 심해질 수도 있으므로 이 결측치를 잘 채우는 것이 중요하다!

 

 

2. 인코딩

또, 중요한 것은 사이킷런에서 문자열은 입력값으로 허용하지 않으므로, 문자열 값들은 모두 숫자형으로 인코딩 해야 한다.

 

1) Label Encoding

문자열로 구성된 카테고리 형태의 데이터를 머신러닝에서 이용할 수 있도록 카테고리를 숫자형으로 바꿔주는 것이다.

from sklearn.preprocessing import LabelEncoder

fruits = ['apple','mango','lemon','orange']

encoder = LabelEncoder()
encoder.fit(fruits)
labels = encoder.transform(fruits)

 

fruits 라는 카테고리명들에 대해 LabelEncoder를 통해 라벨인코딩을 진행한 결과 아래와 같은 결과가 나왔다.

# 출력결과
array([0, 2, 1, 3])

 

순서대로 apple : 0, mango : 2, lemon : 1, orange : 3 으로 변환된 것을 의미한다.

인코딩된 값을 다시 디코딩하고 싶다면 inverse_transform() 을 통해 디코딩할 수 있다.

encoder.inverse_transform(labels)

 

아래와 같은 출력 결과를 통해 디코딩값을 확인할 수 있다.

array(['apple', 'mango', 'lemon', 'orange'], dtype='<U6')

 

혹시 0번부터 순서대로 값을 확인하고 싶다면 classes_를 통해 확인할 수 있다.

encoder.classes_

 

 

LableEncoding의 주의사항

LableEncoding의 경우 문자형을 숫자형으로 바꾸기 위해 임의로 숫자값을 부여하는데, 혹시 이것을 회귀와 같은 ML 알고리즘에 이용할 경우, 큰 숫자로 인코딩된 값을 가중치가 부여된 것이라 판단하고 더 중요하게 판단할 수도 있다.

따라서 , 회귀와 같은 ML 알고리즘에서는 라벨인코딩한 값을 피처로 사용하지 않아야 한다!

하지만, 트리 계열의 ML 알고리즘은 숫자의 이런 특성을 반영하지 않기에 괜찮다..!

 

2) One-Hot Encoding

피처 유형별로 피처를 모두 만들어서 자신에게 해당하는 컬럼에만 1, 나머지 컬럼은 0으로 채우는 방식을 말한다.

예를 들면, 아래와 같다.

  apple mango lemon orange
apple 1 0 0 0
mango 0 1 0 0
lemon 0 0 1 0
orange 0 0 0 1

 

이번에도 코드를 통해 실습해보겠다

from sklearn.preprocessing import OneHotEncoder
import numpy as np

# 2차원 ndarray로 변환
fruits = np.array(array).reshape(-1,1)

# one-hot encodig 적용
oh_encoder = OneHotEncoder()
oh_encoder.fit(fruits)
oh_labels = oh_encoder.transform(fruits)
oh_label.toarray()

.

OneHotEncoder로 변환한 결과는 희소 행렬이므로 결과를 확인하려면 toarray()를 통해 밀집 행렬로 변환해야 한다.

변환 결과, 위에 그렸던 표와 같은 형태로 저장된 것을 볼 수 있다.

array([[1., 0., 0., 0.],
       [0., 0., 1., 0.],
       [0., 1., 0., 0.],
       [0., 0., 0., 1.]])

 

위의 과정을 pandas의 get_dummies()를 이용하면 더 쉽게 변환할 수 있다.

 

import pandas as pd

df = pd.DataFrame({'fruits':['apple', 'mango', 'lemon', 'orange']})
pd.get_dummies(df)

 

 

'ASAC 5기 > Machine Learning' 카테고리의 다른 글

06. Regression Model  (0) 2024.07.22
05. Linear Regression 관련 용어  (2) 2024.07.17
04. 분류의 성능 평가 지표  (0) 2024.06.27
02. 교차 검증  (0) 2024.06.18
01. Numpy 기초  (0) 2024.04.08

댓글