TIL

TIL - 실무에 쓰는 머신러닝 기초 1-2

pys6341 2025. 3. 14. 14:47

데이터 전처리란?

불필요하거나 손실이 있는 부분을 처리하고 분석 목적에 맞는 형태로 만드는 과정

 

 

결측치 처리 기법

 

1. 삭제

: 결측치가 있는 행(row) 또는 열(column)을 제거

→ 간단하지만 데이터 손실이 발생

→ 결측치가 전체 데이터에서 매우 소수일 때 적합

 

2. 대체

: 평균 또는 중앙값으로 대체

>> 수치형 데이터에서 많이 사용, 데이터 분포 왜곡이 비교적 적음

: 최빈값으로 대체

>> 범주형 데이터에서 사용

: 예측 모델로 대체

>>회귀/분류 모델을 이용해 결측값을 예측

 

 

결측치 처리 코드

# 2) 결측치 제거 (결측이 하나라도 있으면 해당 행을 제거)
df_drop = df.dropna()
df_drop

 

# 3) 평균값으로 대치
df_mean = df.copy()
df_mean = df_mean.fillna(df_mean.mean(numeric_only=True))
df_mean

 

# 4) 중앙값으로 대치
df_median = df.copy()
df_median = df_median.fillna(df_median.median(numeric_only=True))
df_median

 

# 5) 최빈값으로 대치
#   - DataFrame의 mode()는 각 열별로 최빈값을 반환합니다.
#   - mode() 결과가 여러 개(동률)일 경우 첫 번째 행의 값을 취합니다.
df_mode = df.copy()
print(df_mode.mode()) # 확인용
mode_values = df_mode.mode().iloc[0]  # 첫 번째 행(가장 상위 mode)만 취함
df_mode = df_mode.fillna(mode_values)
df_mode

 

 

이상치 탐지 기법

1. 통계적 기법

: 데이터가 정규분포를 따른다고 가정하고, 평균에서 ±3σ(표준편차) 범위를 벗어나는 값을 이상치로 간주

: 직관적이고 간단하나, 정규성 가정이 틀릴 수 있음

 

2. 박스플롯 기준

: 사분위수(IQR = Q3 - Q1)를 이용해 ‘Q1 - 1.5×IQR’, ‘Q3 + 1.5×IQR’를 벗어나는 데이터를 이상치로 간주

: 분포 특성에 영향을 적게 받는 장점

 

3. 머신러닝 기반

: 이상치 탐지 알고리즘 (Isolation Forest, DBSCAN 등)

: 복합적 패턴을 고려할 수 있음

 

 

정규화/표준화

필요한 이유

1. 모델(특히 거리 기반 알고리즘, 딥러닝 등)에 따라 특정 변수의 스케일이 크게 영향을 미칠 수 있음

2. 센서 A는 값 범위가 0~1000, 센서 B는 값 범위가 0~1이라면, A가 모델에 더 큰 영향을 줌

 

 

[정규화]

 

 MinMaxScaler : 모든 값을 0과 1사이로 매핑

  • 값의 스케일이 달라도 공통 범위로 맞출 수 있음
  • 딥러닝(신경망), 이미지 처리 등에서 입력값을 0~1로 제한해야 하거나, 각 특성이 동일한 범위 내 있어야 하는 경우 자주 사용
  • 거리 기반 알고리즘(유클리디안 거리 사용)이나, 각 특성의 범위를 동일하게 맞춤으로써 계산 안정성을 높이고 싶을 때
  • 최소값·최대값이 극단값(Outlier)에 민감. 만약 극단치가 있으면 대부분의 데이터가 [0, 1] 구간 내부 한쪽에 치우침
  • 새로운 데이터가 기존 최대값보다 커지거나, 최소값보다 작아지는 경우, 스케일링 범위를 벗어날 수 있어 재학습하거나 다른 처리가 필요

 

[표준화]

 

 StandardScaler: 평균을 0, 표준편차로 1로 만듦

  • 분포가 정규분포에 가깝게 변형됨
  • 평균이 0, 표준편차가 1로 맞춰지므로, 정규분포 가정을 사용하는 알고리즘(선형회귀, 로지스틱회귀, SVM 등)에 자주 쓰임
  • 변환된 값들이 이론적으로 -∞ ~ +∞ 범위를 가질 수 있습니다
  • 데이터가 특정 구간([0, 1] 등)에 고정되지는 않습니다
  • 데이터 분포가 심하게 치우쳐 있으면, 평균과 표준편차만으로는 충분한 스케일링이 되지 않을 수 있습니다(로그 변환, RobustScaler 등 추가 고려)

 

불균형 데이터 처리

 

불균형 데이터란?  정상 99%, 불량 1%처럼 한 클래스가 극도로 적은 경우

 

 

해결 기법

 

1. Oversampling

  • Random Oversampling : 소수 클래스의 데이터를 단순 복제하여 개수를 늘림
  •  SMOTE : 소수 클래스를 "무작정 복사"만 하는 게 아니라, “비슷한” 데이터들을 서로 섞어서(Interpolation) 새로운 데이터 생성

2. Undersampling

  • 다수 클래스 데이터를 줄이는 방식
  • 데이터 손실 위험이 있지만, 전체 데이터 균형을 맞출 수 있음

3. 혼합 기법

  • SMOTE와 언더샘플링을 적절히 섞어서 사용

 

범주형 데이터 변환

 

원-핫 인코딩

  • 범주형 변수를 각각의 범주별로 새로운 열로 표현, 해당 범주에 해당하면 1, 아니면 0
  • 장점: 범주 간 서열 관계가 없을 때 사용하기 좋음
  • 단점: 범주가 매우 많으면 차원이 커짐

레이블 인코딩

  • 범주를 숫자로 직접 맵핑
  • 단순하지만, 모델이 숫자의 크기를 서열 정보로 잘못 해석할 수 있음

 

피처 엔지니어링 

모델 성능 향상을 위해 기존 데이터를 변형, 조합하여 새로운 특성을 만드는 작업

 

예시)

1. 날짜파생변수

2. 수치형 변수 조합

3. 로그 변환, 제곱근 변환 등

 

 

변수 선택

 

1. 상관관계

  • 두 변수 간 상관도가 높은 상황인 경우 다중공선성 의심

2. VIF

  • 회귀분석에서 다중공선성 문제를 파악할 때 사용
  • VIF는 어떤 변수 하나가, 다른 변수들과 얼마나 겹치는지(상관이 큰지) 수치로 보여주는 지표
  • VIF가 일정 기준(예: 10 이상)을 넘으면 해당 변수를 제거하거나 비슷한 변수들을 합치는 등의 방법으로 문제를 해결

3. 모델 기반 중요도

  • 트리 기반 모델(랜덤 포레스트, XGBoost 등)을 훈련 후 중요도가 낮은 변수를 제거