Feature Scaler

아따맘마·2021년 1월 11일
0

데이터 전처리

목록 보기
4/5

feature Scaler

피쳐 스케일링은 서로 다른 변수의 값 범위를 일정 수준으로 맞추는 작업을 말한다. 대표적으로 표준화, 정규화가 있다.

표준화

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

정규화

서로 다른 피처의 크기를 통일하기 위해 크기를 변환해주는 개념. 사이킷런에서의 정규화는 개별 벡터를 모든 피처 벡터의 크기로 나눠준다.

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)

print('feature 들의 평균 값')
print(iris_df.mean())

print('feature 들의 분산 값')
print(iris_df.var())



기존의 iris데이터의 각 피처들의 평균값과 분산값을 구할 수 있다. 이를 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)
iris_df_scaled

iris_scaled의 타입은 ndarray이다. 이를 데이터프레임으로 변환시켜주면

표준화가 진행된 것을 알 수 있다.

이들의 평균과 분산을 구하면 평균은 0에 수렴하고, 분산은 1에 수렴하는 것을 확인할 수 있다.

MinMaxScaler

MinMaxScaler은 데이터를 0과 1 사이의 값으로 변환한다. 음수값은 -1에서 1로 변환.
데이터가 가우시안 분포가 아닐 경우에 Min, Max 스케일링을 적용해 볼 수 있다.

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('feature 최솟 값')
print(iris_df_scaled.min())

print('feature 최댓 값')
print(iris_df_scaled.max())


피처들의 최솟값과 최댓값이 각각 0과 1로 스케일링 됬다.

주의할 점

Scaler 객체를 활용하여 학습 데이터셋으로 fit(), transform(0을 적용하면 테스트 데이터 셋은 fit()은 수행하지 않고 학습 데이터 셋으로 fit()한 결과를 이용하여 transform()만 하면 된다. 만약 테스트 데이터 셋으로 재학습 시 스케일링 기준 정보가 달라진다.

import numpy as np

train = np.arange(0, 11).reshape(-1, 1)
test = np.arange(0, 6).reshape(-1, 1)

scaler = MinMaxScaler()
scaler.fit(train)
train_scaled = scaler.transform(train)


train 데이터는 0부터 10까지 숫자로 이루어져 있다. 이를 scaled하면 위같은 결과가 나온다. 근데 test데이터로 다시 fit하면??

scaler.fit(test)
test_scaled = scaler.transform(test)


당연히 기준이 변경된다. test로 fit하면 5가 1로 변하는 것을 알 수 있다. 원래는 0.5로 변환되어야 한다. 그러므로 fit_transform()은 학습 데이터에서만 사용하자. 아니면 전체 데이터를 먼저 스케일링 후 학습 및 테스트 데이터로 분리하자.

profile
늦게 출발했지만 꾸준히 달려서 도착지점에 무사히 도달하자

0개의 댓글