728x90
반응형

데이터 전처리(data preprocessing)

  • ML 알고리즘만큼 중요하다.
  • 결손값, NaN, Null값은 허용되지 않는다. - 이 값을 고정된 다른 값으로 변환해야 한다.
  • 문자열 값은 인코딩돼서 숫자 형으로 변환해야 한다.
    • 문자열 피처는 일반적으로 카테고리형 피처와 텍스트형 피처를 의미한다.
    • 텍스트형 피처는 피처 벡터회(feature vectoriztion)등의 기법으로 벡터화하거나 불필요한 피처라고 판단되면 삭제하는 것이 좋다.

 

데이터 인코딩

  • 머신러닝을 위한 대표적인 인코딩 방식은 레이블 인코딩(label encoding)과 원-핫 인코딩(One Hot encoding)이 있다.

 

레이블 인코딩(Label encoding)

  • 카테고리 피처를 코드형 숫자 값으로 변환하는 것
  • 사이킷런은 LabelEncoder 클래스로 구현
  • LabelEncoder를 객체로 생성한 후 fit()과 transform()을 호출해 레이블 인코딩을 수행한다.

 

# 레이블 인코딩 label encoding

from sklearn.preprocessing import LabelEncoder

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

# LabelEncoder를 객체로 생성한 후, fit()과 transform()으로 레이블 인코딩 수행

encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
print('인코딩 변환 값 : ',labels)

[그림1] 레이블 인코딩 

# 인코딩 값 다시 디코딩

print('디코딩 원본값 : ', encoder.inverse_transform([0,1,4,5,3,3,2,2]))

[그림2] 디코딩 원본값

 

 

원-핫 인코딩(One-Hot Encoding)

  • 원-핫 인코딩은 피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시하는 방식이다.
  • 행 행태로 돼 있는 피처의 고유 값을 열 행태로 차원을 변환한 뒤, 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시한다.
# 원-핫 인코딩 One-Hot encoding

from sklearn.preprocessing import OneHotEncoder
import numpy as np

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

# 먼저 숫자 값으로 변환 위해 LabelEncoder로 변환

encoder = LabelEncoder()
encoder.fit(items)
lables = encoder.transform(items)

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

# 원-핫 인코딩을 적용
oh_encoder = OneHotEncoder()
oh_encoder.fit(labels)
oh_labels = oh_encoder.transform(labels)
print('원-핫 인코딩 데이터')
print(oh_labels.toarray())
print('원-핫 인코딩 데이터 차원')
print(oh_labels.shape)

[그림3] 원-핫 인코딩 데이터, 데이터 차원

# 데이터 프레임으로 확인

import pandas as pd

df = pd.DataFrame({'item':['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']})

pd.get_dummies(df)

[그림4]  데이터 프레임으로 확인

  • get_dummies() 활용시 숫자형 값으로 변환 없이도 바로 변환이 가능하다.

 

 

피처 스케일링과 정규화

  • 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업을 피처 스케일링(feature scaling)이라고 한다.
  • 대표적인 방법으로 표준화(Standardization)와 정규화(Normalization)가 있다.
  • 표준화는 데이터의 피처 각각이 평균이 0이고 분산이 1인 가우시안 정규 분포를 가진 값으로 변환하는 것을 의미한다.
  • 정규화는 서로 다른 피처의 크기를 통일하기 위해 크기를 변환해주는 개념

 

 

StandardScaler

  • 표준화를 지원하기 위한 클래스
  • 개별 피처를 평균이 0이고, 분산이 1인 값으로 변환해준다.
# StandardScaler 가 어떻게 데이터 값을 변환하는지 데이터 세트 확인

from sklearn.datasets import load_iris
import pandas as pd
# 붓꽃 데이터 세트를 로딩하고 DataFrame으로 변환

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

print('feature 들의 평균 값')
print(iris_df.mean())
print('\nfeature 들의 분산 값')
print(iris_df.var())

[그림5] StandardScaler 데이터 변환 값 데이터 세트 확인

 

StandardScaler 이용해 각 피처 표준화

# StandardScaler 이용해 각 피처 표준화

from sklearn.preprocessing import StandardScaler

# StandardScaler 객체 생성
scaler = StandardScaler()

# StandardScaler로 데이터 세트 변환 fit(), transform() 호출
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)

# transform() 스케일 변환 데이터 세트가 numpy ndarray로 반환돼 이를 DataFrame으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature 들의 평균 값')
print(iris_df_scaled.mean())
print('\nfeature 들의 분산 값')
print(iris_df_scaled.var())

[그림6] 표준화 뒤 평균 값, 분산 값

  • 평균이 0에 아주 가까운 값
  • 분산은 1에 아주 가까운 값으로 변환

 

MinMaxScaler

  • 데이터값을 0과 1사이의 범위 값으로 변환(음수 값이 있으면 -1에서 1값으로 변환한다.)
  • 데이터의 분포가 가우시안 분포가 아닐 경우 Min, Max Scale을 적용해 볼 수 있다.
# MinMaxScaler

from sklearn.preprocessing import MinMaxScaler

# MinMaXsCALER 객체 생성
scaler = MinMaxScaler()
# MinMaxScaler로 데이터 세트 변환 
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)

# Numpy ndarray로 반환돼 DataFrame으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns = iris.feature_names)
print('feature 들의 최솟값')
print(iris_df_scaled.min())
print('\nfeature 들의 최댓값')
print(iris_df_scaled.max())

[그림7] MinMaxScaler 최댓값 최솟값 확인

 

 

학습 데이터와 테스트 데이터의 스케일링 변환 시 유의점

  1. 가능하다면 전체 데이터의 스케일링 변환을 적용한 뒤 학습과 테스트 데이터로 분리
  2. 1이 여의치 않다면 테스트 데이터 변환 시에는 fit()이나 fit_transform()을 적용하지 않고 학습 데이터로 이미 fit()된 Scaler 객체를 이용해 transform()으로 변환

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기