Menu
CoddyTech

파이프라인에서 결측값 대체하기

Coddy Machine Learning 여정의 지도 학습 섹션에 포함된 레슨. 58개 중 47번째.

실제 로그에는 누락된 값이 있으며, 대부분의 모델은 이를 허용하지 않습니다. SimpleImputer는 각 누락된 값을 해당 열의 평균, 중앙값 또는 최빈값으로 채웁니다.

분할하기 전에 채우면 테스트 행이 그 값을 선택하는 데 도움이 됩니다. 바로 데이터 누수입니다. 잠수 깊이 7개와 결측값 하나:

잠수 깊이 열 2개가 나란히 있습니다. 각 열에는 값이 8개 있고, 마지막 2개는 테스트 행으로 표시되어 있으며, 한 셀은 결측값입니다. 왼쪽은 채운 다음 분할하는 경우입니다. 결측값은 알려진 깊이 7개의 평균인 21.3으로 채워집니다. 테스트 행도 계산에 포함되어 데이터 누수가 발생합니다. 오른쪽은 분할한 다음 파이프라인을 적용하는 경우입니다. 결측값은 훈련 행만의 평균인 18.0으로 채워집니다.

파이프라인에서 fit은 훈련 행만을 사용해 대체값을 학습합니다:

from sklearn.impute import SimpleImputer

pipe = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(), model)
pipe.fit(X_train, y_train)
print(pipe[0].statistics_)  # 첫 번째 단계에서 결측값을 채우는 값들

다이빙 기록(수심, 분, 수온)의 경우, 다음을 출력합니다:

[19. 44. 21.]

단어와 마찬가지로 숫자 처리 단계도 ColumnTransformer의 한 레인이 됩니다:

lane = make_pipeline(SimpleImputer(strategy="median"), StandardScaler())
("numbers", lane, ["depth_m", "minutes"])
challenge icon

챌린지

중급

산림 관리 기관은 어떤 낙뢰가 화재를 일으키는지 예측하지만, 일부 측정값이 누락되어 있습니다. 시작 코드에서는 wildfire.csv를 분할하고 전략인 mean 또는 median을 읽습니다.

  1. 해당 전략을 사용하는 대치기, 스케일러, 로지스틱 회귀로 파이프라인을 학습시키세요. 테스트 정확도를 출력하세요.
  2. 각 열에 대해 파이프라인의 대체값과 X의 모든 행을 사용했을 때의 값을 소수점 1자리까지 출력하세요.

다른 숲의 경우, median을 사용하면:

Test accuracy: 0.840
humidity_pct: fill 46.0, all rows would give 46.0
wind_kmh: fill 29.0, all rows would give 32.0
temp_c: fill 25.0, all rows would give 26.0
days_without_rain: fill 23.0, all rows would give 23.0

두 값이 다른 경우, 분할 전에 결측값을 채웠다면 테스트 행이 학습 데이터를 좌우하게 되었을 것입니다.

직접 해보기

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline

# 건조한 숲에 번개가 쳤습니다. 그 번개로 산불이 발생했나요 (1), 아니면 발생하지 않았나요 (0)?
# 일부 기상 관측값이 누락되었습니다.
strikes = pd.read_csv("wildfire.csv")
columns = ["humidity_pct", "wind_kmh", "temp_c", "days_without_rain"]
X = strikes[columns]
y = strikes["fire"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
strategy = input()

# 아래에 코드를 작성하세요
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

지도 학습의 모든 레슨

직접 연습해 보세요: 온라인 Python 컴파일러