●결측치 예측 모델 정의
결측이 발생하지 않은 컬럼을 바탕으로 결측치를 예측하는 모델을 학습하고 활용하는 방법이다.
쉽게 생각해서, 결측치를 추정해야 할 컬럼을 새로운 라벨로 보고 다른 컬럼들을 특징으로 봐서 모델을 학습하고 그 모델의 결과를 바탕으로 결측치를 대체한다.
●결측치 예측 모델 활용 방법
결측치 예측 모델은 어느 상황에서도 무난하게 활용할 수 있으나, 사용 조건 및 단점을 반드시 숙지해야 한다.
사용조건 1. 결측이 소수 컬럼에 쏠리면 안된다.
소수 컬럼의 결측 비율이 60프로 이상이면 사용하기 어렵다. 왜냐하면 결측치를 추정해야 할 컬럼을 새로운 라벨로 보는데 그 라벨값 자체가 부족하기 때문에 일반화된 모델을 만들기 어렵기 때문이다.
하지만 결측치를 추정해야 할 컬럼에 포함된 레코드의 갯수가 충분히 많으면 사용이 가능하다.
예를 들어, 어떤 컬럼에 결측률이 90프로라고 하더라도 남은 10프로가 충분히 많은 경우 사용이 가능하다.
사용조건 2. 특징간에 상관관계가 존재해야 한다.
단점. 모델을 만들어야 하기 때문에 다른 결측치 처리 방법에 비해 시간이 오래 소요된다.
●관련 문법: sklearn.impute.KNNImputer
KNN 알고리즘을 사용하여 결측치를 채우는 방식으로 결측이 아닌 값만 사용하여 이웃을 구한 뒤, 이웃들의 값의 대표값으로 결측을 대체하는 결측치 예측 모델이다.
KNNImputer는 숫자로만 계산이 가능하기 때문에 범주형 변수에 대해서는 더미화(가변수화, 데이터 인코딩) 이후 사용해야한다.
-주요 입력
▷n_neighbors: 이웃 수(너무 적으면 결측 대체가 정상적으로 이루어지지 않을 수 있으므로 5 정도가 적절하다.)
(transform 한 후 표에서 c에서 V1값은 2이다. 표 오류)
(KNNImputer 파라미터의 거리척도의 default값은 'nan_euclidean'으로 유클리디안 거리 척도를 사용한다.)
## 코드 실습 ##
import os
os.chdir(r"C:\Users\82102\Desktop\데이터전처리\머신러닝을 위한 필수 전처리\Part 4. 머신러닝을 위한 필수 전처리\데이터")
import pandas as pd
df = pd.read_csv("mammographic.csv")
df.head()
X = df.drop('Output', axis=1) # 결과가 2차원, 열에 대한 연산 -> axis=1
Y = df['Output']
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, Y)
# 열별 결측치 확인
x_train.isnull().sum(axis=0)
# 결측치를 구체적으로 알아보기 위해 열별 결측치 비율 확인
x_train.isnull().sum(axis=0) / len(x_train)
# 결측이 소수 컬럼에 쏠리지 않음, 결측률이 높지 않음을 확인
# 특징 간 상관관계 확인 -> 평균적으로 40~50%로 높음을 확인 -> 특징 간 상관관계 존재
x_train.corr().sum() / len(x_train.columns)
결측치 모델을 사용하기에 적합한 조건이다.
# KNNImputer 인스턴스화
from sklearn.impute import KNNImputer
KI = KNNImputer(n_neighbors=5)
# KNNImputer 학습
KI.fit(x_train)
# 결측 대체: instance의 output은 ndarray이므로 DataFrame으로 변환
x_train = pd.DataFrame(KI.transform(x_train), columns=x_train.columns)
x_test = pd.DataFrame(KI.transform(x_test), columns=x_test.columns)
x_train.isnull().sum() / len(x_train)
x_test.isnull().sum() / len(x_test)
'데이터 전처리 > 머신러닝을 위한 필수 전처리' 카테고리의 다른 글
범주형 변수 처리 방안 (0) | 2022.12.20 |
---|---|
결측치 문제 해결 방법(3) 근처값으로 대체(시계열 변수 한정) (0) | 2022.12.19 |
결측치 문제 해결 방법(2) 대표값으로 대체(SimpleImputer) (0) | 2022.12.15 |
결측치 문제 해결 방법(1) 삭제 (0) | 2022.12.14 |
결측치 문제 (0) | 2022.12.13 |