본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 데이터 파이프라인 Null 처리와 모델 불확실성 해결을 위한 7가지 최적화 방법

by Papa Martino V 2026. 4. 27.
728x90

Null 값(결측치) 처리
Null 값(결측치) 처리

 

데이터 엔지니어링과 머신러닝 파이프라인 구축 시 가장 간과하기 쉬운 단계가 바로 Null 값(결측치) 처리입니다. 많은 개발자가 단순히 평균값(Mean Imputation)이나 최빈값으로 결측치를 채우지만, 이러한 방식은 모델의 불확실성(Uncertainty)을 왜곡하여 실무 환경에서 심각한 오작동을 유발할 수 있습니다. 본 포스팅에서는 결측치 처리 방식이 모델의 에피스테믹(Epistemic) 및 알레아토리(Aleatoric) 불확실성에 미치는 통계적 원리를 분석하고, 파이썬 환경에서 이를 정교하게 해결하기 위한 7가지 실전 아키텍처 예제를 제시합니다.


1. 결측치 처리와 모델 불확실성의 상관관계

모델의 불확실성은 크게 두 가지로 나뉩니다. 데이터 자체의 노이즈에서 오는 알레아토리 불확실성과 데이터 부족 및 모델 구조에서 오는 에피스테믹 불확실성입니다. Null 값을 잘못 처리하면 데이터의 분산(Variance)이 인위적으로 축소되어 모델이 실제보다 자신의 예측을 더 '확신'하게 만드는 과잉 신뢰(Overconfidence) 문제가 발생합니다.


2. 결측치 처리 기법별 불확실성 유발 차이 비교

파이프라인 설계 시 선택할 수 있는 전략들이 모델 신뢰도에 미치는 영향을 정리했습니다.

처리 기법 작동 원리 불확실성에 미치는 영향 신뢰도 수준
Simple Imputation (Mean/Median) 단일 통계값으로 대체 분산을 강제로 축소하여 불확실성을 과소평가함 낮음 (위험)
KNN Imputation 인접 샘플 기반 유사값 대체 상관관계를 보존하나 국소적 편향 유발 가능 중간
MICE (Iterative Imputer) 다중 변수 회귀 기반 대체 변수 간 상호작용을 반영하여 불확실성 왜곡 최소화 높음
Indicator Variable Null 여부를 별도 Feature로 추가 결측 패턴 자체를 정보로 활용하여 모델이 불확실성 인지 매우 높음
Probabilistic Imputation 확률 분포 기반 샘플링 대체 데이터의 원래 분포를 유지하며 불확실성을 모델링함 최상

3. 실무 해결을 위한 Python Sample Example (7가지)

결측치로 인한 불확실성 왜곡을 방지하고 모델의 신뢰 구간을 확보하는 7가지 파이썬 구현 사례입니다.

Example 1: Scikit-learn의 MissingIndicator를 이용한 정보 보존

단순 대체를 넘어 결측이 발생했다는 사실 자체를 모델에게 알려 불확실성을 학습하게 합니다.

from sklearn.impute import SimpleImputer, MissingIndicator
from sklearn.pipeline import FeatureUnion
import pandas as pd

# 결측치를 평균으로 채우는 것과 동시에 '결측 여부'를 새로운 컬럼으로 생성
transformer = FeatureUnion(
    transformer_list=[
        ('features', SimpleImputer(strategy='mean')),
        ('indicators', MissingIndicator())
    ]
)

X_processed = transformer.fit_transform(X_raw)
# 모델은 이제 어떤 값이 '추정치'인지 파악하여 불확실성을 인지함
    

Example 2: IterativeImputer(MICE)를 통한 다변량 상관관계 복원

변수 간의 관계를 활용해 결측치를 채움으로써 통계적 왜곡을 최소화합니다.

from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

# 다른 피처들을 사용하여 Null 값을 예측하는 회귀 기반 이퓨터
imputer = IterativeImputer(max_iter=10, random_state=42)
X_imputed = imputer.fit_transform(X_with_nulls)
# 단순 평균값 대체보다 데이터 분포의 분산을 훨씬 잘 보존함
    

Example 3: Bayesian Ridge Regression을 이용한 결측치 불확실성 정량화

결측치를 채울 때 단순한 '값'이 아닌 '확률 분포'를 고려하는 방식입니다.

from sklearn.linear_model import BayesianRidge

# IterativeImputer의 예측기로 베이지안 회귀 사용
br_imputer = IterativeImputer(estimator=BayesianRidge(), verbose=2)
X_br_imputed = br_imputer.fit_transform(X_data)
# 모델이 결측치 예측 시 신뢰도를 스스로 평가할 수 있는 기반이 됨
    

Example 4: XGBoost의 결측치 자동 학습(Native Missing Handling)

외부에서 Null을 채우지 않고 트리 알고리즘이 스스로 결측치의 최적 분할 방향을 학습하게 합니다.

import xgboost as xgb

# XGBoost는 np.nan을 별도의 분기점으로 학습함
# 임의의 값으로 채우는 것보다 불확실성 관점에서 훨씬 안전함
dtrain = xgb.DMatrix(X_train, label=y_train, missing=np.nan)
params = {'objective': 'reg:squarederror'}
model = xgb.train(params, dtrain)
    

Example 5: Deep Learning 파이프라인에서 Masking Layer 활용

시계열 데이터 등에서 Null(Padding) 값이 손실 함수에 미치는 영향을 차단합니다.

import tensorflow as tf

# 결측치를 특정 상수(예: -99)로 채운 후 Masking 레이어로 무시
model = tf.keras.Sequential([
    tf.keras.layers.Masking(mask_value=-99.0, input_shape=(None, 10)),
    tf.keras.layers.LSTM(64),
    tf.keras.layers.Dense(1)
])
# 모델 연산에서 결측치가 포함된 타임스텝의 영향력을 0으로 만듦
    

Example 6: Monte Carlo Dropout을 이용한 예측 불확실성 측정

결측치가 처리된 데이터에 대해 모델이 얼마나 확신하는지 런타임에 측정합니다.

import numpy as np

# 추론 시에도 Dropout을 활성화하여 100번 예측 수행
preds = [model(X_test, training=True) for _ in range(100)]
mean_pred = np.mean(preds)
std_pred = np.std(preds) # 이 표준편차가 모델의 불확실성을 나타냄
    

Example 7: Categorical Data를 위한 'Unknown' 카테고리화 해결책

범주형 데이터에서 Null을 단순히 최빈값으로 채우지 않고 하나의 독립된 정보로 취급합니다.

def handle_cat_nulls(df, column):
    # Null 값을 'MISSING'이라는 새로운 카테고리로 명시적 정의
    df[column] = df[column].fillna('MISSING_CATEGORY')
    return df

# 모델은 'MISSING' 상태에서 타겟 변수와의 상관관계를 별도로 학습함
    

4. 결측치 전략이 실패할 때의 해결 가이드라인

파이프라인 설계 시 다음 3가지 징후가 나타나면 결측치 처리 전략을 즉시 수정해야 합니다.

  • 훈련/검증 손실의 큰 격차: 결측치가 많은 피처가 모델을 과적합시키고 있을 확률이 높습니다.
  • 예측 확률의 편향: 특정 클래스의 예측 확률이 0.99 이상으로 쏠린다면 결측치 대체값이 가짜 확신을 심어준 것입니다.
  • 데이터 드리프트 민감도: 실시간 서빙 시 Null 발생 빈도가 변할 때 모델 성능이 급락한다면 'Indicator Variable' 방식이 누락된 것입니다.

5. 결론: 신뢰할 수 있는 AI를 위한 첫걸음

결론적으로, 파이프라인 내에서 Null 값을 어떻게 처리하느냐는 단순한 결측 해결을 넘어 모델이 현실 세계의 불확실성을 얼마나 정직하게 표현하느냐를 결정합니다. 가장 권장되는 해결책은 데이터의 결측 패턴 자체를 피처화(MissingIndicator)하고, 가능하면 알고리즘 자체의 결측 처리 기능(XGB/LGBM 등)을 활용하는 것입니다.


참고 문헌 및 출처:

  • Scikit-learn Documentation: "Imputation of missing values" 
  • Ghahramani, Z. (2015). "Probabilistic machine learning and artificial intelligence". Nature.
  • Little, R. J., & Rubin, D. B. (2019). "Statistical Analysis with Missing Data". Wiley.
  • Gal, Y., & Ghahramani, Z. (2016). "Dropout as a Bayesian Approximation". ICML.
728x90