Skip to content

Scikit-learn Imputer 사용하기: 궁극적인 안내서

Updated on

대용량 데이터셋을 다룰 때 누락된 값이 발생하는 것은 거의 불가피합니다. 누락된 데이터를 효율적으로 처리하는 것은 데이터 전처리 과정에서 근본적인 단계입니다. Scikit-learn의 Imputer는 이러한 작업에 대한 강력한 전략을 제공합니다. 이 글에서는 Scikit-learn의 SimpleImputer, IterativeImputer, KNNImputer 및 수치 및 범주형 데이터를 처리하는 방법에 대해 알아보겠습니다.

파이썬 판다스 데이터프레임에서 코드 없이 빠르게 데이터 시각화를 생성하려면?

PyGWalker는 시각화를 통한 탐색적 데이터 분석을 위한 파이썬 라이브러리입니다. PyGWalker (opens in a new tab)는 pandas 데이터프레임 (및 polars 데이터프레임)을 Tableau 스타일의 사용자 인터페이스로 변환하여 시각적 탐색을 위한 작업 흐름을 단순화할 수 있습니다.

데이터 시각화를 위한 PyGWalker (opens in a new tab)

Imputer 알아보기

"How-tos"에 먼저 집중하기 전에 Imputer가 무엇인지 먼저 이해해 보겠습니다. 핵심적으로 이는 데이터셋에서 누락된 값을 채우는 추정기입니다. 수치 데이터의 경우 평균, 중앙값 또는 상수와 같은 전략을 활용하고 범주형 데이터의 경우 가장 빈번한 값 또는 상수를 사용합니다. 또한 데이터의 복잡성과 사용 가능한 리소스에 따라 누락된 값을 예측하는 모델을 훈련시킬 수도 있습니다.

이 가이드에서는 주로 Scikit-learn의 SimpleImputer, IterativeImputer, KNNImputer에 초점을 맞추고, 범주형 및 수치적 특성을 순조롭게 대체하여 기계 학습 모델에 공급하는 파이프라인을 만드는 과정을 안내합니다.

Scikit-learn Imputer 설정하기

Scikit-learn의 imputation 함수들은 몇 줄의 코드로 누락된 데이터를 처리하는 편리한 방법을 제공합니다. 더욱이, 파이프라인을 생성하여 결과를 재생산하고 기계 학습 개발 작업을 개선하기 쉽게 할 수 있습니다.

환경 및 데이터셋

Scikit-learn의 Imputer를 사용하는 방법에 대해 구체적으로 설명하기 전에 환경을 설정하고 데이터셋을 얻어야 합니다. 본 지침서에서는 머신러닝 분야에서 인기있는 Pima Indians Diabetes Database를 사용합니다.

이 데이터셋은 Kaggle에서 무료로 제공되며 Kaggle API를 사용하여 직접 다운로드할 수 있습니다. 먼저 필요한 Python 라이브러리를 설치해야 합니다.

!pip install numpy pandas scikit-learn kaggle

그 다음, Kaggle API를 사용하여 Pima Indians Diabetes Database를 다운로드하겠습니다.

!kaggle datasets download -d uciml/pima-indians-diabetes-database
!unzip pima-indians-diabetes-database.zip -d ./dataset

이제 데이터셋을 pandas DataFrame으로 로드하여 살펴보겠습니다.

import pandas as pd
 
df = pd.read_csv("./dataset/diabetes.csv")
print(df.head())

데이터셋 살펴보기

데이터를 로드하면 구조를 이해하는 것이 매우 중요합니다. Pima 인디언 당뇨병 데이터베이스에는 여러 건강 지표 (글루코스 수준, 혈압, BMI 등)와 관련된 8 개의 숫자 기능 및 "Outcome"이라는 하나의 이진 목표 열이 있습니다. 대상 열은 개인이 당뇨병을 가지고 있는지 여부를 나타냅니다.

먼저 데이터 세트의 모양을 조사해 보겠습니다.

print (df.shape)

이 출력을 사용하여 데이터 세트에 768 개의 행과 9 개의 열이 포함되어 있는지 확인할 수 있습니다.

결측값 공개

현실의 데이터 세트에서는 결측값이 꽤 일반적입니다. 따라서 기계 학습 모델링에 뛰어들기 전에 결측값을 식별하고 적절하게 처리해야합니다.

데이터 세트에서 결측값을 확인해 보겠습니다.

missing_values = df.isnull () .sum ()
print (missing_values)

이 명령어가 모든 열에 대해 0을 반환하는 이상적인 시나리오가 있겠지만 실제로는 그렇지 않습니다. 다음 절에서 결측 값을 처리하는 방법을 다룰 것입니다.

수치값 입력

Scikit-learn의 Imputer 영역에서 우리는 수치 및 범주적 보완을 구별합니다. 수치 보완은 결측값을 통계 추정치로 대체하는 과정입니다. 평균, 중간 값 또는 최빈 값으로 대체 값을 사용하는 것이 일반적입니다.

튜토리얼을 위해 'BloodPressure' 열에 결측값이 있다고 가정해 보겠습니다. 첫 번째 작업은 결측값의 수를 확인하는 것입니다.

print (df ['BloodPressure']. isnull () .sum ())

다음 절에서 Scikit-learn의 SimpleImputer를 사용하여 이러한 결측값을 보완하는 방법을 배울 것입니다.

Scikit-learn의 SimpleImputer를 사용하여 수치 값 입력

Scikit-learn의 SimpleImputer는 결측값을 처리하는 간단한 방법을 제공합니다. 결측된 수치 값으로 대체하는 방법, 평균, 중간 값 또는 상수 값이 포함됩니다. 'BloodPressure' 열에서 결측값을 보완하는 SimpleImputer를 사용하는 예제를 살펴 보겠습니다.

from sklearn.impute import SimpleImputer
 
# SimpleImputer의 인스턴스 생성
imputer = SimpleImputer(strategy='mean')
 
# 열을 2D 배열로 재구성
blood_pressure = df ['BloodPressure']. values.reshape (-1, 1)
 
# 결측값 보완
imputed_blood_pressure = imputer.fit_transform(blood_pressure)
 
# 보완 된 값으로 DataFrame 업데이트
df['BloodPressure'] = imputed_blood_pressure

stragegy 매개 변수를 'mean'으로 설정하면 SimpleImputer는 사용 가능한 값의 평균을 계산하고 결측값을 해당 평균 값으로 대체합니다. 데이터의 성격에 따라 'median' 또는 'constant'를 전략으로 사용할 수도 있습니다.

결측값을 대체한 후 결측값이 남아 있지 않은지 항상 재확인하는 것이 좋습니다.


먼저 데이터 세트의 모양을 조사해 보겠습니다.

``` python
print (df.shape)

이 출력을 사용하여 데이터 세트에 768 개의 행과 9 개의 열이 포함되어 있는지 확인할 수 있습니다.

결측값 공개

현실의 데이터 세트에서는 결측값이 꽤 일반적입니다. 따라서 기계 학습 모델링에 뛰어들기 전에 결측값을 식별하고 적절하게 처리해야합니다.

데이터 세트에서 결측값을 확인해 보겠습니다.

missing_values = df.isnull () .sum ()
print (missing_values)

이 명령어가 모든 열에 대해 0을 반환하는 이상적인 시나리오가 있겠지만 실제로는 그렇지 않습니다. 다음 절에서 결측 값을 처리하는 방법을 다룰 것입니다.

수치값 입력

Scikit-learn의 Imputer 영역에서 우리는 수치 및 범주적 보완을 구별합니다. 수치 보완은 결측값을 통계 추정치로 대체하는 과정입니다. 평균, 중간 값 또는 최빈 값으로 대체 값을 사용하는 것이 일반적입니다.

튜토리얼을 위해 'BloodPressure' 열에 결측값이 있다고 가정해 보겠습니다. 첫 번째 작업은 결측값의 수를 확인하는 것입니다.

print (df ['BloodPressure']. isnull () .sum ())

다음 절에서 Scikit-learn의 SimpleImputer를 사용하여 이러한 결측값을 보완하는 방법을 배울 것입니다.

Scikit-learn의 SimpleImputer를 사용하여 수치 값 입력

Scikit-learn의 SimpleImputer는 결측값을 처리하는 간단한 방법을 제공합니다. 결측된 수치 값으로 대체하는 방법, 평균, 중간 값 또는 상수 값이 포함됩니다. 'BloodPressure' 열에서 결측값을 보완하는 SimpleImputer를 사용하는 예제를 살펴 보겠습니다.

from sklearn.impute import SimpleImputer
 
# SimpleImputer의 인스턴스 생성
imputer = SimpleImputer(strategy='mean')
 
# 열을 2D 배열로 재구성
blood_pressure = df ['BloodPressure']. values.reshape (-1, 1)
 
# 결측값 보완
imputed_blood_pressure = imputer.fit_transform(blood_pressure)
 
# 보완 된 값으로 DataFrame 업데이트
df['BloodPressure'] = imputed_blood_pressure

stragegy 매개 변수를 'mean'으로 설정하면 SimpleImputer는 사용 가능한 값의 평균을 계산하고 결측값을 해당 평균 값으로 대체합니다. 데이터의 성격에 따라 'median' 또는 'constant'를 전략으로 사용할 수도 있습니다.

결측값을 대체한 후 결측값이 남아 있지 않은지 항상 재확인하는 것이 좋습니다.

```python
print(df['BloodPressure'].isnull().sum())

결측값을 대체한 후, 출력 결과는 0이어야 하며, 'BloodPressure' 열에는 누락된 값이 없음을 나타냅니다.

범주형 값 대체하기

이제 범주형 값의 대체에 대해 알아봅시다. 이 예제에서는 결측값을 포함하는 'SkinThickness' 열을 고려해보겠습니다.

이전 섹션과 마찬가지로 우선 'SkinThickness' 열에 얼마나 많은 결측값이 포함되어 있는지 확인해보겠습니다.

print(df['SkinThickness'].isnull().sum())

범주형 값 대체를 위해 SimpleImputer에서 제공하는 'most_frequent' 전략을 사용할 수 있습니다. 이 전략은 열에서 가장 빈도가 높은 값을 결측값으로 대체합니다.

# 범주형 값에 대한 SimpleImputer 인스턴스 생성
imputer_categorical = SimpleImputer(strategy='most_frequent')
 
# 열을 2D 배열로 변환
skin_thickness = df['SkinThickness'].values.reshape(-1, 1)
 
# 결측값 대체
imputed_skin_thickness = imputer_categorical.fit_transform(skin_thickness)
 
# imputed 값으로 데이터프레임 업데이트
df['SkinThickness'] = imputed_skin_thickness

결측값을 대체한 후, 'SkinThickness' 열이 아직 결측값을 포함하는지 확인해보겠습니다.

print(df['SkinThickness'].isnull().sum())

결과값은 0이어야 합니다. 이는 'SkinThickness' 열의 모든 범주형 결측값이 성공적으로 대체되었음을 나타냅니다.

결론

이 가이드의 이 부분에서는 Scikit-learn의 SimpleImputer를 사용하여 수치 및 범주형 열의 결측값을 처리하는 방법에 대해 배웠습니다. 데이터의 성격에 따라 평균, 중앙값, 최빈값과 같은 전략을 사용하여 결측값을 대체하는 방법을 살펴보았습니다.

대치는 데이터 전처리 파이프라인에서 중요한 단계로, 이를 통해 유용한 정보를 보존하고 모델이 완전한 데이터셋에서 학습할 수 있도록 할 수 있습니다. Scikit-learn의 SimpleImputer를 활용함으로써, 데이터 과학자와 머신 러닝 전문가는 결측값을 효율적으로 처리하고 견고한 모델을 구축할 수 있습니다.