머신러닝을 위한 전처리

3eo·2026년 2월 25일

정규화

MinMaxScaler

모든 값을 0과 1 사이로 매핑
-> 값의 스케일이 달라도 공통 범위로 맞출 수 있음

※ 최소값, 최대값이 극단값(이상치)에 민감. 극단치가 있으면 대부분의 데이터가 [0, 1] 구간 내부 한쪽에 치우침

코드

from sklearn.preprocessing import MinMaxScaler
minmax_scaler = MinMaxScaler() 

df_minmax_scaled = pd.DataFrame(minmax_sclaer.fit_transform(df[cols_to_scale]))

# fit_transform : 데이터에서 최대 최소를 구해서, 그 최대 최소를 바탕으로 값을 계산해서 MinMaxScaler을 적용시킴

표준화

StandardScaler

분포가 정규분포에 가깝게 변형됨
-> 평균이 0, 표준편차가 1로 맞춰지므로 정규분포 가정을 사용하는 알고리즘(선형회귀, 로지스틱 회귀 등)에 자주 쓰임

대부분 -3 ~ 3 범위를 가짐 (이론상으로는 모든 범위 가능하긴 함)

정규화보다는 극단값에 덜 민감.
데이터 분포가 심하게 치우쳐 있으면 평균과 표준편차만으로는 충분한 스케일링이 안 될 수 있음 -> 로그 변환, RobustScaler 등 고려

코드

from sklearn.preprocessing import StandardScaler
standard_scaler = StandardScaler() 

df_standard_scaled = pd.DataFrame(standard_sclaer.fit_transform(df[cols_to_scale]))
  • fit_transform : 데이터에서 최대 최소를 구해서, 그 최대 최소를 바탕으로 값을 계산해서 MinMaxScaler을 적용시킴

불균형 데이터 처리

불균형 데이터

: 정상 99%, 불량 1% 처럼 한 클래스가 극도로 적은 경우. Class Imbalance
※ 모델이 극도로 적은 클래스를 거의 예측하지 못할 가능성이 큼 (편향 발생)

SMOTE(Synthetic Minority Over-sampling Technique)

: 소수 클래스를 무작정 복사만 하는 것이 아님. 비슷한 데이터들을 서로 섞어서 새로운 데이터를 생성

-> 소수 클래스(e.g. 스팸, 암 환자) 안에서 가까운 데이터 두 개 혹은 몇 개를 고르고, 그 사이에서 새 데이터 포인트를 만들어내어 소수 클래스의 다양한 예시를 가상으로 늘리는 기법

코드

from imblearn.over_sampling import SMOTE
# 불균형 데이터 처리 (SMOTE)
X = df.drop('defect', axis=1)   # 결측치 처리, 이상치 제거, 인코딩 등 사전 처리 후
y = df['defect']
smote = SMOTE(random_state=42)
X_res, y_res = smote.fit_resample(X, y)
  • X = df.drop('defect', axis=1)
    : df 데이터프레임에서 defect 컬럼(레이블)을 제외한 나머지를 X(특징 행렬)로 사용
  • y = df['defect']
    : defect 컬럼을 타겟(레이블)으로 설정
    : 예) defect가 1이면 제품 결함 있음, 0이면 결함 없음 등
  • smote = SMOTE(random_state=42)
    : SMOTE 객체를 생성
    cf. random_state=42는 재현성(코드 실행 시 동일 결과)을 위해 난수 시드를 고정하는 역할
  • X_res, y_res = smote.fit_resample(X, y)
    : fit_resample을 통해 SMOTE 알고리즘이 X, y를 바탕으로 소수 클래스 데이터를 자동 생성
    -> 오버샘플링된 X_res, y_res에는 클래스 불균형이 개선된(1:1에 가깝거나 원하는 비율이 된) 상태

0개의 댓글