파이썬 결측값 대치 하는 방법은 3가지가 있다.

1. 일 변량 기능 대치 (Univariate feature imputation)

해당 특성 차원에서 비결측치만 사용하여 해당 특성 차원의 값을 대치 한다.

결측치가 있는 각 열의 통계(평균, 중앙값, 가장 빈번한 값)를 사용할 수 있다.

import numpy as np
from sklearn.impute import SimpleImputer
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
imp.fit([[1, 2], [np.nan, 3], [7, 6]])

X = [[np.nan, 2], [6, np.nan], [7, 6]]

2. 다 변량 기능 대치 (Multivariate feature imputation)

다 변수 대치 알고리즘은 사용 가능한 특성 차원의 전체 세트를 사용하여 결측치 추정한다.

결측치를 다른 기능의 함수로 모델링 하고 추정치를 대치 시킨다.

import numpy as np
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
imp = IterativeImputer(max_iter=10, random_state=0)
imp.fit([[1, 2], [3, 6], [4, 8], [np.nan, 3], [7, np.nan]])

X_test = [[np.nan, 2], [6, np.nan], [np.nan, 6]]
# the model learns that the second feature is double the first
print(np.round(imp.transform(X_test)))

3. 가장 가까운 이웃 대치 (Nearest neighbors imputation)

결측치를 유클리드 거리 측정으로 가장 가까운 이웃을 찾아 이웃의 값을 사용하여 대치한다.

샘플이 둘 이상의 기능이 누락 된 경우 샘플의 인접 항목은 대치 되는 특정 기능을 따를 수 있다.

import numpy as np
from sklearn.impute import KNNImputer
nan = np.nan
X = [[1, 2, nan], [3, 4, 3], [nan, 6, 5], [8, 8, 7]]
imputer = KNNImputer(n_neighbors=2, weights="uniform")
imputer.fit_transform(X)
  1. 일 변량 기능 대치 코드 예시
from category_encoders import OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline

pipe = make_pipeline(
    OneHotEncoder(), 
    SimpleImputer(), 
    StandardScaler(), 
    LogisticRegression(n_jobs=-1)
)
pipe.fit(X_train, y_train)

print('검증세트 정확도', pipe.score(X_val, y_val))

y_pred = pipe.predict(X_test)
  1. 다 변량 기능 대치 코드 예시
from category_encoders import OneHotEncoder
import numpy as np
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline

pipe = make_pipeline(
    OneHotEncoder(), 
    IterativeImputer(max_iter=10, random_state=0), 
    StandardScaler(), 
    LogisticRegression(n_jobs=-1)
)
pipe.fit(X_train, y_train)

print('검증세트 정확도', pipe.score(X_val, y_val))

y_pred = pipe.predict(X_test)
  1. 가장 가까운 이웃 대치 코드 예시
from sklearn.impute import KNNImputer

pipe = make_pipeline(
    OneHotEncoder(), 
    KNNImputer(n_neighbors=2, weights="uniform"), 
    StandardScaler(), 
    LogisticRegression(n_jobs=-1)
)
pipe.fit(X_train, y_train)

print('검증세트 정확도', pipe.score(X_val, y_val))

y_pred = pipe.predict(X_test)