예측 기반 탐색이란 결측치를 대체하기 위해 머신러닝 모델을 이용하는 방법이다. 결측치 공간을 타겟으로 삼고 나머지 열들을 독립 변수로 설정한다. 모델이 독립 변수들을 학습하고 결측치가 있는 행에 대해서 다른 열들을 통해 예측하고 결측치를 그 값으로 대체하는 방식이다. 이 과정은 회귀 방식(Regression Imputation)과 분류 방식(Classification Imputation)으로 나뉜다.
회귀 모델을 이용하여 결측치를 대체하는 방식을 회귀 대체라고 한다. 결측치가 주로 연속형(수치형) 데이터일 때 회귀 대체 방식이 사용된다. 학습 알고리즘으로는 Linear Regression, Polynomial Regression과 같은 회귀 모델과 RandomForest, Gradient Boosting 같은 비선형 모델이 있다. 결측값이 없는 데이터로 회귀 모델을 학습시키고 그 모델로 결측값을 예측하는 과정이다. 머신러닝에게 학습 데이터셋으로 학습한 후 테스트 데이터셋으로 결괏값을 예측하는 과정과 동일하다. 차이점은 예측해야 하는 결측치가 여러 열에 존재한다는 점이다.
1. Linear Regression
단순 회귀 모델을 이용한 방식으로 하나의 독립 변수만을 이용하여 결측값을 예측하는 방식이다.
2. Polynomial Regression
다중 회귀 대체 방식이다. 일반적으로는 데이터셋에 3개 이상의 독립 변수들이 있는데, 여러 독립 변수들을 이용하여 결측값을 예측하는 방식이다.
3. 다중 대체( Multiple Imputation )
여러 회귀 모델들을 사용하여 결측값들을 여러번 예측하고 평균값 등으로 대체하는 방식이다.
위의 방식은 변수들의 상관관계를 이용하기 때문에 데이터 패턴을 예측하여 적절한 값으로 결측치를 채울 수 있다. 결측치를 채움으로써 데이터 손실을 방지할 수 있고, 단순한 회귀 이외에도 XGBoost와 같은 고급 모델들을 활용할 수 있다. 그러나 결측값의 패턴을 파악하지 못한다면 이를 반영하기 힘들고 분산이 감소된다는 문제점(과적합 문제)이 있다. 또한 복잡성이 높아지기에 연산량이 많아진다.
데이터셋들은 기본적으로 여러 독립 변수들을 가지고 있고, 결측치 또한 한 독립 변수에서만 나오지 않고 여러 독립 변수에서 결측치가 나온다. 즉, 결측치가 한 열에만 존재하지 않고 여러 행에 퍼져있을 수 있다. 이를 위해서는 다중 대체 방식으로 접근하여 결측치를 예측하는 과정을 반복적으로 수행해야한다.
다중 대체 기법의 기본적인 결측치 처리 과정은 다음과 같다.
1. 결측치 확인
각 열에서 결측치들을 확인하고, 결측치의 비율과 분포를 분석한다.
2. 처리 순서 결정
결측치가 적은 열부터 순차적으로 대체한다. 모델 학습할 때 사용할 독립 변수는 이미 결측치가 대체된 열만 사용한다.
3. 반복 대체 과정
각 열의 결측치를 예측하기 위해 모델이 다른 열에 있는 독립 변수로 학습한다. 학습된 모델로 결측치를 예측한다. 그리고 이 과정을 결측치가 존재하는 모든 열에 실행한다.
4. 불확실성 관리
다중 대체를 통해 대체값의 분포를 고려하고 불확실성을 반영한다. 이 말이 어려울 수 있다. 단일 대체 방식은 결측치를 한번 대체하는 것으로 끝나기에 데이터의 변동성이 감소하고 실제값과 차이가 날 가능성을 반영하지 못한다. 다중 대체 기법은 이를 반영할 수 있다. 다중 대체는 단일 대체가 아닌 여러 번의 대체를 수행하여 다양한 예측값을 얻고, 예측값들의 평균이나 분포를 분석하여 신뢰도 높은 결과를 만들어낸다. 이는 결측치를 대체하는 값이 가능한 범위 내에 있도록 하여 데이터의 불확실성을 유지한다.
부분적 다중 대체 기법은 Scikit-learn의 IterativeImputer를 통해서 구현된다. 다음은 IterativeImputer의 예제 코드이다.
import numpy as np
import pandas as pd
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.linear_model import BayesianRidge
#IterativeImputer 설정
imputer = IterativeImputer(estimator=BayesianRidge(), random_state=42, max_iter=10, sample_posterior=True)
train_imputed = imputer.fit_transform(train) #train은 읽어들인 학습 데이터셋
df_train_imputed = pd.DataFrame(train_imputed, columns=train.columns)
print(df_train_imputed)
print("\n결측치 개수:\n", df_train_imputed.isnull().sum())
IterativeImputer는 기본적으로 BayesianRidge 모델(회귀 모델)을 사용한다. estimator 매개변수는 모델을 지정한다. max_iter는 반복 횟수이다. estimator에는 LinearRegression, Ridge, Lasso, DecisionTreeRegressor, RandomForestRegressor 등의 회귀 모델이 있다. 위에서 언급했듯 분류 모델도 가능하다. 결측값이 범주형 데이터일 때 분류 모델을 쓰며, 분류 모델로는 LogisticRegression, RandomForestClassifier 등이 있다. sample_posterior는 결측치 대체할 값으로 샘플링을 수행하여 얻게된 값을 사용할지 정하는 매개변수이다. 이는 다중 대체의 핵심 아이디어인 결측치의 불확실성을 반영하는 방식이다.
학습하며 알게 되었지만 IterativeImputer 자체적으로는 단일 대체 방식이라고 한다. 하지만 샘플링을 통해서 다중 대체와 유사한 결과를 얻을 수 있다고 한다(핵심 아이디어를 따옴). 이에 대해서는 나중에 더 학습하자.
'머신러닝 > EDA' 카테고리의 다른 글
| [EDA] DBSCAN 기법 (4) | 2024.12.24 |
|---|---|
| [EDA] Z-score (6) | 2024.12.24 |
| [EDA] IQR(Interquartile Range, 사분범위) (3) | 2024.12.23 |
| [EDA] K-최근접 이웃(K-Nearest Neighbors, KNN) (1) | 2024.12.23 |
| [EDA] 결측치 대체 (5) | 2024.12.22 |