# AI 이론/Machine Learning

피처 스케일링(Feature Scaling)

alz 2022. 1. 19. 16:06

피처 스케일링(Feature Scaling) 이란?

  • 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업을 말한다.
  • 대표적인 방법으로는 표준화 , 정규화 가 존재한다.

예를들어, 피쳐 A의 범위는 0~100 이고, 피쳐 B의 범위는 0~100,000,000이라면, 데이터는 A에값에 크게 영향을 미치지 않을 수 있다.

따라서, 이 변수를 모두 동일한 크기 단위로 비교하기 위해 모두 최소 0~ 최대 1 사이의 값으로 변환 하는것

 

Sklearn에서 제공하는 대표적인 피처 스케일링 클래스가 2가지 존재한다.

 

 

StandardScaler

  • 개별 피처를 평균이 0 이고 분산이 1인 가우시안 정규분포를 가진 값으로 변환

왜 중요한가?

  • RBF커널을 이용하는 서포트 벡터머신, 선형 회귀,로지스틱 회귀는 데이터가 가우시안 분보를 가지고있다고 생각하고 구현되기 때문에, 사전의 표준화를 적용하는것이 예측성능 향상에 중요한 요소가 될수있다.

 

  1. StandardScaler 객체를 생성
  2. fit() , transform() 메서드 이용하여 변환
from sklearn.preprocessing import StandardScaler
import numpy as np

scaler = StandardScaler()
array = np.arange(10)
array[0] = 300 # 이상치 생성

#평균과 분산
print("mean:",array.mean(), "\nvarience:",np.round(array.std(),3))

#표준화
scaled = scaler.fit_transform(array.reshape(-1,1))
print("mean:",np.round(scaled.mean(),2),"\nvarience",np.round(scaled.std(),2))

 

MinMaxScaler

  • 데이터의 값을 0 과 1사이의 범위 값으로 변환(음수 값이 있다면, [-1,1] 사이로 변환)
  • 데이터의 분포가 가우시간 분포가 아닐 경우 Min,Max Scale을 적용해 볼 수 있다.
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('feature들의 최소 값')
print(iris_df_scaled.min())
print('\nfeature들의 최대 값')
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

 

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

  • StandardScaler,MinMaxScaler와 같은경우, Scaler 객체를 이용해 fit(),transform(),fit_transform()을 사용하는데, 이때  fit()은 데이터 변환을 위한 기준설정 정보
    transform() 은 fit()으로 설정된 정보를 이용하여 데이터를 변환한다
    Scaler객체를 이용해 학습 데이터 세트로 fit,transform을 적용하면 테스트 데이터는 fit()을 하지않고 바로 transform변환을 해야한다는것이다.
from sklearn.preprocessing import MinMaxScaler
import numpy as np

train_array = np.arange(0,11).reshape(-1,1)
test_array = np.arange(0,6).reshape(-1,1)

scaler = MinMaxScaler()
scaler.fit(train_array) #기준설정
train_scaled = scaler.transform(train_array) # 이 기준으로 train_array를 표준화

print("원본 : ",np.round(train_array.reshape(-1),2))
print("scale된 데이터 : ",np.round(train_scaled.reshape(-1),2))

test_scaled = scaler.transform(test_array)

print("테스트 : ",np.round(test_scaled.reshape(-1),2))

print("이렇게하면 안되는 부분")
scaler.fit(test_array)
test_scaled = scaler.transform(test_array)
print(np.round(test_scaled.reshape(-1),2))
test_scaled = scaler.transform(train_array)
print(np.round(test_scaled.reshape(-1),2))
원본 :  [ 0  1  2  3  4  5  6  7  8  9 10]
scale된 데이터 :  [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]
테스트 :  [0.  0.1 0.2 0.3 0.4 0.5]
이렇게하면 안되는 부분
[0.  0.2 0.4 0.6 0.8 1. ]
[0.  0.2 0.4 0.6 0.8 1.  1.2 1.4 1.6 1.8 2. ]