본문 바로가기

공부한 것

Data Preprocessing

1. 데이터 값으로 NaN, 즉 null은 허용되지 않는다.

2. 문자열 값이 입력으로 허용되지 않아 숫자형으로 변환해야 한다 : feature vectorization / deletion

 

Label Encoding

- 카테고리형 피쳐 -> 코드형 숫자값

ex) TV: 1, 냉장고: 2, ...

from sklearn.preprocessing import LabelEncoder

items = [ 'TV', '냉장고', '전자레인지', '컴퓨터', '선풍기', '믹서', '믹서', '선풍기', ]

# LabelEncoder를 객체로 생성한 후, fit()과 transform()으로 레이블 인코딩 수행
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
  • - Regression ML Algorithm에는 적용 못한다.

         : 숫자 값에 따른 순서나 중요도로 인식될 가능성 존재

  • - Tree 계열 algorithm에 적용 가능

 

One Hot Encoding

- 피처값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 칼럼에만 1을 표시, 나머지는 0 표시

 

 

  • OneHotEncoder로 변환 전에 모든 문자열 값이 숫자형 값으로 변환되어 있어야 한다.
  • 입력 값으로 2차원 데이터 요구
from sklearn.preprocessing import OneHotEncoder
import numpy as np

items = [ 'TV', '냉장고', '전자레인지', '컴퓨터', '선풍기', '믹서', '믹서', '선풍기', ]

# 숫자 값으로 변환 위해 LabelEncoder로 변환
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)

# 2차원 데이터로 변환
labels = labels.reshape(-1, 1)

# One-Hot Encoding
oh_encoder = OneHotEncoder()
oh_encoder.fit(labels)
oh_labels = oh_encoder.transform(labels)

# Pandas의 One-Hot Encoding API
# 문자열 카테고리 값을 숫자 형으로 변환할 필요 없이 바로 가능
import pandas as pd

df = pd.DataFrame(items)
pd.get_dummies(df)

 

Feature Scaling

- 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업

 

Standardization 표준화

  • 데이터의 피처 각각 평균 0, 분산 1인 가우시안 정규 분포로 변환

x_new[i] = (x[i] - mean(x)) / stdev(x)

 

sklearn.StandardScaler

   표준화 지원 클래스

  • 개별 피처를 평균 0, 분산 1인 가우시안 분포 가진 값으로 변환
  • 선형 회귀, 로지스틱 회귀는 데이터가 가우시안 분포 가지고 있다는 가정 하에 구현: 사전 표준화 적용은 예측 성능 향상에 중요
from sklearn.datasets import load_iris
import pandas as pd

iris = load_iris()
iris_data = iris.data
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)

# StandardScaler로 각 피처 표준화하여 변환
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)

iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)

sklearn.MinMaxScaler

  데이터 값을 0 ~ 1 (음수 있을 경우 -1 ~ 1) 값으로 변환

  • 데이터 분포가 가우시안 분포가 아닐 경우 Min, Max scale 적용 가능
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)

iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('features min:\n', iris_df_scaled.min())
print('\nfeatures max:\n', iris_df_scaled.max())

 

Normalization 정규화

  • 서로 다른 피처 크기 통일 위해 크기 변환
  • 개별 단위들을 모두 동일한 크기 단위 (0~1)로 변환

x_new[i] = (x[i] - min(x)) / (max(x) - min(x))

 

sklearn.Normalizer

  • 선형대수에서의 정규화 개념 적용 : 개별 벡터의 크기를 맞추기 위해 변환
  • -> 개별 벡터를 모든 피처 벡터의 크기로 나눠준다.

ex) 3개의 피처 x, y, z

x_new[i] = x[i] / (sqrt(x[i]^2 + y[i]^2 + z[i]^2))

 

학습, 테스트 데이터 Scaling 변환 시 유의점

  • Scaler 객체를 이용해 학습 dataset로 fit()과 transform() 적용 시 테스트 dateset로는 다시 fit() 수행하지 않음

       -> 학습 데이터로 fit() 적용된 스케일링 기준 정보를 그대로 테스트 데이터에 적용해야 한다.

 

학습 데이터와 테스트 데이터의 fit(), transform(), fit_transform() 이용 스케일링 변환 시 유의사항

  1. (가능하다면) 우선 전체 데이터에 스케일링 변환 적용 뒤 학습, 테스트 데이터 분리
  2. 1이 불가하다면 테스트 데이터 변환 시에는 fit(), fit_transform() 적용하지 않고 학습 데이터로 이미 fit() 된 Scaler 객체 이용해 trnasform() 수행

 

 

'공부한 것' 카테고리의 다른 글

선형대수 - 3  (0) 2021.09.22
선형대수 - 2  (0) 2021.09.20
선형대수 - 1  (0) 2021.09.20
분류와 검증  (0) 2021.09.10
  (0) 2021.09.10