피처 스케일링(Feature Scaling) 이란?
- 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업을 말한다.
- 대표적인 방법으로는 표준화 , 정규화 가 존재한다.
예를들어, 피쳐 A의 범위는 0~100 이고, 피쳐 B의 범위는 0~100,000,000이라면, 데이터는 A에값에 크게 영향을 미치지 않을 수 있다.
따라서, 이 변수를 모두 동일한 크기 단위로 비교하기 위해 모두 최소 0~ 최대 1 사이의 값으로 변환 하는것
Sklearn에서 제공하는 대표적인 피처 스케일링 클래스가 2가지 존재한다.
StandardScaler
- 개별 피처를 평균이 0 이고 분산이 1인 가우시안 정규분포를 가진 값으로 변환
왜 중요한가?
- RBF커널을 이용하는 서포트 벡터머신, 선형 회귀,로지스틱 회귀는 데이터가 가우시안 분보를 가지고있다고 생각하고 구현되기 때문에, 사전의 표준화를 적용하는것이 예측성능 향상에 중요한 요소가 될수있다.
- StandardScaler 객체를 생성
- 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. ]
'# AI 이론 > Machine Learning' 카테고리의 다른 글
[ML]캐글 신용카드 사기 검출 (0) | 2022.02.05 |
---|---|
LightGBM (0) | 2022.01.26 |
XGBoost 소개(파이썬 Wrapper, 싸이킷런 Wrapper) 및 예제 (0) | 2022.01.26 |
[Sklearn]타이타닉 생존자 예측 (0) | 2022.01.14 |
1.머신러닝이란? (0) | 2022.01.04 |