이 모듈의 도달 목표

데이터를 정리하고 학습·평가용으로 나누기

결측값을 채우고 숫자 범위를 맞춘 뒤 같은 결과를 재현할 수 있도록 학습·평가 데이터로 분리합니다.

결과물 · 재현 가능한 데이터 전처리 파이프라인
약 5~7시간
  • 결측값을 찾고 학습 데이터의 열 평균으로 대체한다
  • min-max scaling의 계산과 상수 열 예외를 처리한다
  • seed를 사용해 같은 학습·평가 분할을 재현한다
  • 평가 데이터가 전처리 기준에 섞이는 데이터 누수를 방지한다
01

전처리는 원본을 모델이 계산할 수 있는 규칙으로 바꾼다

실제 데이터에는 비어 있는 값, 서로 다른 단위와 잘못된 범위가 섞여 있습니다. 전처리는 어떤 값을 어떻게 채우고 변환했는지 규칙을 정해 일정한 숫자 배열로 만드는 과정입니다.

일상에서 보면크기와 표기가 다른 재료를 같은 단위로 손질해 조리대에 올리는 것과 같습니다.
import numpy as np
data = np.array([[1.0, np.nan], [3.0, 20.0]])
print(np.isnan(data).sum())
print(data.shape)
실행 결과
1
(2, 2)
한 줄씩 보기
  1. np.nan으로 비어 있는 숫자 위치를 표시합니다.
  2. np.isnan이 결측 위치를 찾습니다.
  3. shape는 유지하면서 값의 품질을 검사합니다.
직접 값 바꾸기결측값을 하나 더 추가해 개수가 바뀌는지 확인하세요.
흔한 실수문자열 'NA'를 그대로 float64 배열에 넣으면 숫자 계산을 할 수 없습니다.

짧은 확인NumPy에서 숫자 결측값을 나타내는 대표 값은 무엇일까요?

02

결측값 대체 기준은 열마다 따로 계산한다

키가 비었다면 키 열의 평균, 몸무게가 비었다면 몸무게 열의 평균으로 채웁니다. np.nanmean은 nan을 제외하고 평균을 구하며 axis=0은 각 특성 열의 평균을 만듭니다.

일상에서 보면빠진 국어 점수는 국어 평균으로, 수학 점수는 수학 평균으로 보충하는 것과 같습니다.
import numpy as np
data = np.array([[1.0, 10.0], [np.nan, 20.0], [3.0, 30.0]])
means = np.nanmean(data, axis=0)
filled = np.where(np.isnan(data), means, data)
print(means.tolist())
print(filled.tolist())
실행 결과
[2.0, 20.0]
[[1.0, 10.0], [2.0, 20.0], [3.0, 30.0]]
한 줄씩 보기
  1. 열별 평균을 nan을 제외하고 계산합니다.
  2. 결측 위치에는 같은 열의 평균을 선택합니다.
  3. 원래 숫자는 그대로 유지합니다.
직접 값 바꾸기두 번째 열에도 nan을 넣고 어떤 평균으로 채워지는지 확인하세요.
흔한 실수평가 데이터까지 포함한 평균을 사용하면 미래 정보를 미리 본 데이터 누수가 생깁니다.

짧은 확인특성별 평균을 구할 때 mean의 axis는 무엇이어야 할까요?

03

스케일링은 특성의 숫자 범위를 맞춘다

min-max scaling은 각 값에서 최솟값을 빼고 범위로 나눠 학습 데이터의 최소를 0, 최대를 1로 만듭니다. 최대와 최소가 같은 상수 열은 범위가 0이므로 별도로 처리해야 합니다.

일상에서 보면서로 다른 길이의 자를 모두 0부터 1까지의 같은 눈금으로 다시 표시하는 것과 같습니다.
import numpy as np
values = np.array([10.0, 20.0, 30.0])
scaled = (values - values.min()) / (values.max() - values.min())
print(scaled.tolist())
실행 결과
[0.0, 0.5, 1.0]
한 줄씩 보기
  1. 최솟값 10을 모든 값에서 뺍니다.
  2. 전체 범위 20으로 나눕니다.
  3. 상대 위치가 0과 1 사이로 바뀝니다.
직접 값 바꾸기[5, 5, 5]에서 분모가 무엇이 되는지 확인하고 0 벡터 처리 규칙을 생각해 보세요.
흔한 실수상수 열을 그대로 나누면 0으로 나누어 nan이 생깁니다.

짧은 확인값이 학습 최댓값보다 큰 평가 데이터는 스케일 결과가 1보다 클 수 있을까요?

04

학습 데이터와 평가 데이터는 역할이 다르다

학습 데이터는 모델과 전처리 기준을 만드는 데 사용하고 평가 데이터는 완성된 규칙을 처음 보는 데이터에 확인하는 데 사용합니다. 보통 먼저 샘플을 섞은 뒤 일정 비율로 나눕니다.

일상에서 보면연습문제로 공부한 뒤 한 번도 보지 않은 시험문제로 실력을 확인하는 것과 같습니다.
import numpy as np
data = np.arange(10)
order = np.random.default_rng(42).permutation(len(data))
train_index = order[:8]
test_index = order[8:]
print(len(train_index), len(test_index))
실행 결과
8 2
한 줄씩 보기
  1. 10개 샘플을 준비합니다.
  2. seed 42로 인덱스를 섞습니다.
  3. 앞 8개는 학습, 뒤 2개는 평가에 사용합니다.
직접 값 바꾸기같은 seed로 order를 다시 만들고 완전히 같은지 확인하세요.
흔한 실수한 사람이 여러 행을 가진 데이터라면 행 단위 무작위 분할이 같은 사람 정보를 양쪽에 섞을 수 있습니다.

짧은 확인모델이 평가 데이터의 정답을 학습 중에 보면 평가 결과를 믿을 수 있을까요?

05

전처리 기준은 학습 데이터에만 fit한다

평균·최소·최대 같은 기준은 학습 데이터에서만 계산하고 평가 데이터에는 그대로 적용합니다. 전체 데이터에서 기준을 계산하면 평가 데이터 정보가 학습 과정에 스며드는 데이터 누수가 발생합니다.

일상에서 보면시험 답안을 보고 연습문제의 채점 기준을 바꾸면 공정한 시험이 아니게 되는 것과 같습니다.
import numpy as np
train = np.array([0.0, 10.0])
test = np.array([20.0])
minimum, maximum = train.min(), train.max()
print(((train - minimum) / (maximum - minimum)).tolist())
print(((test - minimum) / (maximum - minimum)).tolist())
실행 결과
[0.0, 1.0]
[2.0]
한 줄씩 보기
  1. 학습 값에서만 최소와 최대를 구합니다.
  2. 학습 데이터는 0~1 범위가 됩니다.
  3. 같은 기준을 적용한 평가 값은 1을 넘을 수 있습니다.
직접 값 바꾸기전체 데이터의 최대 20을 사용하면 학습 값 10의 스케일이 어떻게 달라지는지 확인하세요.
흔한 실수평가 결과가 보기 좋게 0~1 안에 들어오도록 평가 기준을 다시 fit하면 누수입니다.

짧은 확인평가 데이터의 결측값은 학습 평균과 평가 평균 중 무엇으로 채워야 할까요?

결측값을 열 평균으로 채우기

  1. 숫자와 NA 토큰을 구분합니다.
  2. float64 배열의 shape를 복원합니다.
  3. nan을 제외한 열 평균을 계산합니다.
  4. 여러 열의 결측값이 각각 올바른 평균으로 바뀌는지 확인합니다.
import numpy as np

rows, cols = map(int, input().split())
tokens = input().split()
values = [np.nan if token == 'NA' else float(token) for token in tokens]
data = np.array(values).reshape(rows, cols)
missing_count = int(np.isnan(data).sum())
column_means = np.nanmean(data, axis=0)
filled = np.where(np.isnan(data), column_means, data)
print(f'결측값: {missing_count}개')
print(f'채운 값: {np.round(filled, 2).tolist()}')

핵심을 확인해 볼까요?

5문항 중 4문항 이상 정답이면 완료됩니다. 오답 후에도 다시 제출할 수 있습니다.

1np.nanmean(data, axis=0)의 의미는?
2min-max scaling의 기본 식은?
3같은 데이터 분할을 다시 만들기 위해 필요한 것은?
4데이터 누수가 발생하는 경우는?
5학습 기준으로 변환한 평가 값이 1보다 클 때 올바른 해석은?