1. 결측값의 종류
- Missing completely at random(MCAR) - 완전 무작위 결측
- 결측값의 발생이 다른 변수와 상관 없는 경우
- Mssing at random(MAR) - 무작위 결측
- 결측값 발생이 특정 변수와 관련 있으나 얻고자 하는 결과와 상관 없는 경우
- Not missing at random(NMAR) - 비무작위 결측
- 결측값 발생이 다른 변수와 상관 있는 경우
2. 결측치 처리 종류
단순 치환, 행제거/열제거 같은 경우 간단해서 코드는 skip
1. 냅두기
- 일부 ML은 결측치를 고려해서 학습해서 파라미터 설정 잘 하면 됨.
2. 행or열 제거
- 특정 열의 결측값이 50%이상이면 변수를 제거
- 50%미만의 경우 제거, 치환, imputation library사용
- 하지만 모든 경우에 있어서 절대적인 것은 없음
3. 치환
- 중앙값, 평균값, 최빈값(category)으로 치환
- 다른 변수로 groupby(). 평균값, 중앙값 등으로 치환
4. K-NN 대체
- K-Nearest Neighbor 알고리즘을 사용해 가장 근접한 데이터 k를 찾는다
- KNN 알고리즘 설명은 -> 쫌 이따 나와요!
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston
import warnings
warnings.filterwarnings('ignore')
df = pd.DataFrame(load_boston().data, columns = load_boston().feature_names)
df['TARGET'] = load_boston().target
df_ = df.copy()
# 해당 데이터셋은 결측치가 없어 결측값을 임의로 만들어 실습
i1 = np.random.choice(a=df.index, size=35)
i2 = np.random.choice(a=df.index, size=20)
df.loc[i1, 'INDUS'] = np.nan
df.loc[i2, 'TAX'] = np.nan
# KNN imputer 사용
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=3)
imputed = imputer.fit_transform(df)
df_imputed = pd.DataFrame(imputed, columns=df.columns)
# 결측값으로 만들기 전 실제값과 비교
df_['INDUS_imputed'] = df_imputed['INDUS']
df_['TAX_imputed'] = df_imputed['TAX']
df_.loc[i1, ['INDUS', 'INDUS_imputed', 'TAX', 'TAX_imputed']]
- 이 데이터셋이 KNN imputer를 쓰기 적합한 것인지 imputed된 변수를 보면 실제값과 굉장히 유사하다
- 데이터셋마다 다르겠지만, KNN의 파라미터를 변경해보며 찾아가야한다고 한다(?)
- 다만 이상치에 민감하다..!
5. MICE(Multivariate Imputation by Chained Equation)
- 누락된 데이터를 여러번 채우는 방식으로 여러 결측치 대치 세트를 만들어 with함수로 특정 통계모델링을 수행하고 pool함수로 생성한 m개의 대치세트를 평균하여 결과를 도출한다. 연속형, 이진형, 범주형 패턴도 처리 가능하다.
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston
import warnings
warnings.filterwarnings('ignore')
df = pd.DataFrame(load_boston().data, columns = load_boston().feature_names)
df['TARGET'] = load_boston().target
df_ = df.copy()
# 해당 데이터셋은 결측치가 없어 결측값을 임의로 만들어 실습
i1 = np.random.choice(a=df.index, size=35)
i2 = np.random.choice(a=df.index, size=20)
df.loc[i1, 'INDUS'] = np.nan
df.loc[i2, 'TAX'] = np.nan
# Mice Imputation
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
imputer_mice = IterativeImputer(random_state=525)
df_imputed = pd.DataFrame(imputer_mice.fit_transform(df), columns = df.columns)
# 실제값과 비교
df_['INDUS_imputed'] = df_imputed['INDUS']
df_['TAX_imputed'] = df_imputed['TAX']
df_.loc[i1, ['INDUS', 'INDUS_imputed']]
- 성능이 나쁘지는 않은 듯 하다
6. etc
- ML이나 DL알고리즘을 사용해 누락된 값을 예측해서 유추하는 방법이다. 범주형에 효과적인 것으로 알려져 있다.
7. 내가 어떻게 하는지
- 사실 결측값이 많은 변수(열)이 있으면, 해당 데이터셋의 도메인에 대한 파악과 각 변수들이 서로 어떻게 작용하는지 확인한다. 그리고 결측값들이 왜 발생하는지 탐색을 좀 해보는 편이다. 결측값이 발생한 데이터(행)들에 대해 공통점을 찾아나가다 보면 결측값이 발생한 이유가 나오기도 한다. 이러한 탐색을 거친 후에 어떻게 처리를 할지 결정하는 편이다.
'ADP로ML정리' 카테고리의 다른 글
2-5. 데이터 전처리 - 차원축소 (0) | 2024.02.14 |
---|---|
2-4. 데이터 전처리 - 데이터 분할 및 스케일링 (1) | 2024.02.14 |
2-3. 데이터 전처리 - 범주형 변수 처리 (0) | 2024.02.14 |
2-2. 데이터 전처리 - 이상치 처리 (0) | 2024.02.14 |
1. EDA / 시각화 (0) | 2024.01.30 |