⚙️ Tech/ML

[ML/python] 결측값 처리 (SimpleImputer, KNNImputer)

fiftyline 2025. 2. 9. 16:55

 

머신러닝을 위한 전처리 과정 중 결측값을 처리하는 방법이다.

 

import pandas as pd
df = pd.read_csv("mldata.csv")

# X,y 분리
X = df.drop('y', axis = 1)
y = df['y']

# validation
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 50)

 

 

결측값 확인 및 제거

df.isnull().sum(axis = 0) #결측값 확인
df.dropna(inplace = True) #결측값 제거

 

 

결측값 대체 - ① 대푯값

평균, 중앙값, 최빈값 등을 사용한다.

from sklearn.impute import SimpleImputer

# SimpleImputer의 인스턴스 생성 (평균)
imputer = SimpleImputer(strategy = "mean")

# train 데이터 결측 평균으로 대체
imputer.fit(X_train)
Z_train = pd.DataFrame(imputer.transform(X_train), columns = X_train.columns)
Z_test = pd.DataFrame(imputer.transform(X_test), columns = X_test.columns)

# 특성별로 다른 대푯값 적용
from sklearn.compose import make_column_transformer
transformer = make_column_transformer(
    (SimpleImputer(), [0]), #첫번째열은 평균
    (SimpleImputer(strategy='median'), [1]), #두번째열은 중앙값
    remainder='passthrough') #정의하지않은 변수는 그대로 둠
transformer = make_column_transformer(
    (SimpleImputer(), ['score','number']), #score,number열은 평균
    (SimpleImputer(strategy='median'), ['weight']), #weight열은 중앙값
    remainder='passthrough') #정의하지않은 변수는 그대로 둠

 

결측값 대체 - ② 이웃값

결측값이 아닌 이웃값들을 활용한 대푯값 사용

특징 간 상관관계가 존재할 때 적합하다

from sklearn.impute import KNNImputer

# 특징간 상관관계 확인
X_train.corr().sum() / len(X_train.columns)

imputer = KNNImputer(n_neighbors=5) #default:n_neighbors=5
imputer.fit(X_train)
Z_train = pd.DataFrame(imputer.transform(X_train), columns = X_train.columns)
Z_test = pd.DataFrame(imputer.transform(X_test), columns = X_test.columns)



 

 

 

 

참고 서적 : GIL's LAB, 「파이썬을 활용한 머신러닝 자동화 시스템 구축」, 위키북스(2022)