MLOps 부트캠프 by 한경+토스뱅크/Machine Learning

Feature Scaling - Min-Max Nomalization

나니니 2024. 8. 22. 22:35

Feature Scaling

입력 변수(feature)의 크기를 조정해 준다(scale)라는 뜻이다. 

아래 이미지와 같이 '연봉'이라는 입력 변수가 있고 '나이'라는 입력 변수가 있다고 가정해보자. 이때, 연봉은 천단위이지만 나이는 대부분 십단위이다. 이렇게 입력 변수의 규모 단위가 차이가 클 경우 머신 러닝에 방해가 될 수 있기 때문에 feature scaling을 해서 입력 변수들의 크기가 모두 일정 범위 내에 들어오도록 조정해주는 것이다. 

feature scaling을 하면 '경사 하강법'을 조금 더 빨리 할 수도 있다. 

Min-Max Nomalization

normalization은 '숫자의 크기를 0과 1사이로 만든다'라는 뜻이다. 이는 데이터의 minimum, 즉 최솟값 그리고 최댓값(maximum)을 이용해서 데이터의 크기를 0과 1사이로 바꿔주는 방법이기 때문에 min_max_normalization이라고 한다.

"최댓값 빼기 최소값 분에 원래 값 빼기 최솟값"

 

아래 표와 같이 normalization을 하면 항상 0과 1 사이의 값이 나오는데, 그 이유는 간단하다. 데이터의 최솟값이 140, 최댓값이 210이라는 것은 모든 데이터 값이 140과 210사이에 있다는 뜻이므로, 이 사이에 있는 어떤 값에서 140을 빼주면 0에서 70사이의 숫자가 나오고, 그 숫자를 210-140=70으로 나눠주면 0과 1사이의 숫자가 나온다. 

이렇게 normalization을 하면 모든 데이터 값을 0와 1사이의 작은 숫자로 바꿀수 있다. 즉, feature(입력 변수)를 0과 1 사이 범위의 숫자들로 크기 조정(scaling)해주는 것이다. 

평균(mean)과 표준 편차(standard deviation)

평균은 모든 x값들을 더한 후에 데이터의 개수 n으로 나눠준다.

표준 편차는 데이터와 평균에 대한 평균 제곱 오차를 구한 후 루트를 씌워 구한다. 표준 편차는 보통 그리스 문자  
σ(시그마)로 표시한다.

표준화 (standardization)

아래의 좌측 키 데이터에 적용해보면 우측과 같이 표준화를 사용해 키 데이터를 일정한 크기의 숫자들로 조정(scaling) 할 수 있다. 

표준화를 하면 항상 새로운 데이터의 평균은 0, 표준 편차는 1이 된다. 이렇게 표준화를 해준 데이터를 통계학에서는 z-score라고 하는데, z-score는 데이터가 평균 값에서 몇 표준 편차만큼 떨어져 있는지를 뜻한다. 

예를 들어 180의 z-score는 1.164인데, 이는 '180은 평균값보다 1.164 표준 편차만큼 크다'라는 의미이다. 실제로 계산해보면 173.8+1.164*5.325=180이 나오는 것을 확인할 수 있다. 

 

예제

저희가 사용하는 데이터는 간 질환 환자 데이터입니다.

살펴보면 'Dataset' 열은 환자가 간 질환이 있는지 없는지를 나타내는 목표 변수고요, 나머지 열들은 입력 변수들입니다. 나이, 성별, 그리고 다양한 건강 관련 수치 데이터가 있습니다.

이번 과제에서는 preprocessing 모듈의 MinMaxScaler을 사용해서 아래 열들을 Normalize해 보겠습니다.

  • 'Total_Bilirubin'
  • 'Direct_Bilirubin'
  • 'Alkaline_Phosphotase'
  • 'Alamine_Aminotransferase’

결괏값을 변수 normalized_df에 새로운 pandas DataFrame으로 저장해 주세요.

# 필요한 도구 import
from sklearn import preprocessing
import pandas as pd

# 데이터 파일 경로
PATIENT_FILE_PATH = './datasets/liver_patient_data.csv'

# 소수점 이하 5자리로 출력 옵션 설정
pd.set_option('display.float_format', lambda x: '%.5f' % x)

# 데이터 파일을 pandas dataframe으로 불러오기
liver_patients_df = pd.read_csv(PATIENT_FILE_PATH)

# Normalization할 열 이름들
features_to_normalize = ['Total_Bilirubin', 'Direct_Bilirubin', 'Alkaline_Phosphotase', 'Alamine_Aminotransferase']

# MinMaxScaler 객체 생성
scaler = preprocessing.MinMaxScaler()

# 지정된 열들에 대해 정규화 수행
normalized_data = scaler.fit_transform(liver_patients_df[features_to_normalize])

# 정규화된 데이터프레임 확인
normalized_df = pd.DataFrame(normalized_data, columns = features_to_normalize)

# 테스트 코드: 정규화된 열들의 기초 통계량 출력
print(normalized_df.describe())