[파이썬 머신러닝 완벽 가이드] 데이터 전처리 (Preprocessing)

3 분 소요

데이터 전처리

  • 데이터 클린징 : 잘못되어있는 데이터 수정
  • 결손값 처리 : Null/NaN 처리 → 아예 없애버리거나 평균값 또는 다른 값으로 변환
  • 데이터 인코딩 (레이블, 원-핫 인코딩) : 코드값, 문자형 등을 숫자형으로 변환
  • 피처 스케일링 : 정규화, 표준화
  • 이상치 (Outlier) 제거
  • 피처 선택, 추출 및 가공

데이터 인코딩

— 머신러닝 알고리즘은 문자열 데이터 속성을 입력 받지 않기 때문에 모든 데이터가 숫자형으로 표현될 수 있도록 변환/인코딩 되어야 한다.

레이블(Label) 인코딩

⇒ 각 값, 레이블을 유니크한 코드형 숫자값으로 변환

  • 문제점 : 변환된 숫자값을 가지고 알고리즘이 원치않는 관계성을 만들어낼 수 있다

원-핫(One-Hot) 인코딩

⇒ 레이블 인코딩의 문제점 해결을 위해 피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 컬럼에만 1을 표시하고 나머지 컬럼에는 0을 표시하는 방식

  • 사이킷런의 원-핫 인코딩 과정 : 원본 데이터 → 숫자로 인코딩 → 원-핫 인코딩
  • 판다스 pd.get_dummies(DataFrame) 을 이용해서 원-핫 인코딩 가능
  • fit()transform() 메서드 사용

피처 스케일링

표준화

— 데이터의 피처 각각이 평균이 0이고 분산이 1인 가우시안 정규분포를 가진 값으로 변환

  • 사이킷런 : StandardScaler

정규화

— 서로 다른 피처의 크기를 통일하기 위해 크기를 변환

  • 사이킷런 : MinMaxScaler

⇒ 피처 스케일링도 인코딩과 마찬가지로 fit()transform() 메서드 사용

실습

from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
import numpy as np
import pandas as pd

### 레이블 인코딩
items=['TV','냉장고','전자렌지','컴퓨터','선풍기','선풍기','믹서','믹서']

# LabelEncoder를 객체로 생성한 후, fit( ) 과 transform( ) 으로 label 인코딩 수행.
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
print(labels)  # 인코딩 변환값: [0 1 4 5 3 3 2 2]
print(encoder.classes_)  # 인코딩 클래스: ['TV' '냉장고' '믹서' '선풍기' '전자렌지' '컴퓨터']
print(encoder.inverse_transform([4, 5, 2, 0, 1, 1, 3, 3]))  # 디코딩 원본 값: ['전자렌지' '컴퓨터' '믹서' 'TV' '냉장고' '냉장고' '선풍기' '선풍기']

### 원핫 인코딩 (사이킷런)
# 먼저 숫자값으로 변환을 위해 LabelEncoder로 변환
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)

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

# 원-핫 인코딩을 적용
oh_encoder = OneHotEncoder()
oh_encoder.fit(labels)
oh_labels = oh_encoder.transform(labels)

print(oh_labels.toarray())  
'''
[[1. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 0.]
[0. 0. 0. 0. 0. 1.]
[0. 0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0. 0.]
[0. 0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0. 0.]]
'''
print(oh_labels.shape)  # (8, 6)

### 원핫 인코딩 (판다스)
df = pd.DataFrame({'item':['TV','냉장고','전자렌지','컴퓨터','선풍기','선풍기','믹서','믹서'] })
pd.get_dummies(df)

### 피처 스케일링
# 정규화 - StandardScaler
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

# 붓꽃 데이터 셋을 로딩하고 DataFrame으로 변환
iris = load_iris()
iris_data = iris.data
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)

print(iris_df.mean())
print(iris_df.var())
'''
feature 들의 평균 값
sepal length (cm)    5.843333
sepal width (cm)     3.057333
petal length (cm)    3.758000
petal width (cm)     1.199333
dtype: float64

feature 들의 분산 값
sepal length (cm)    0.685694
sepal width (cm)     0.189979
petal length (cm)    3.116278
petal width (cm)     0.581006
dtype: float64
'''

# StandardScaler객체 생성
scaler = StandardScaler()
# StandardScaler 로 데이터 셋 변환, fit( ) 과 transform( ) 호출
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)

#transform( )시 scale 변환된 데이터 셋이 numpy ndarry로 반환되어 이를 DataFrame으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print(iris_df_scaled.mean())
print(iris_df_scaled.var())
'''
feature 들의 평균 값
sepal length (cm)   -1.690315e-15
sepal width (cm)    -1.842970e-15
petal length (cm)   -1.698641e-15
petal width (cm)    -1.409243e-15
dtype: float64

feature 들의 분산 값
sepal length (cm)    1.006711
sepal width (cm)     1.006711
petal length (cm)    1.006711
petal width (cm)     1.006711
dtype: float64
'''

# 표준화 - MinMaxScaler
from sklearn.preprocessing import MinMaxScaler

# MinMaxScaler객체 생성
scaler = MinMaxScaler()
# MinMaxScaler 로 데이터 셋 변환, fit() 과 transform() 호출.  
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)

# transform()시 scale 변환된 데이터 셋이 numpy ndarry로 반환되어 이를 DataFrame으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print(iris_df_scaled.min())
print(iris_df_scaled.max())
'''
feature들의 최소 값
sepal length (cm)    0.0
sepal width (cm)     0.0
petal length (cm)    0.0
petal width (cm)     0.0
dtype: float64

feature들의 최대 값
sepal length (cm)    1.0
sepal width (cm)     1.0
petal length (cm)    1.0
petal width (cm)     1.0
dtype: float64
'''

댓글남기기