빈칸 처리부터 평가까지 연결하기
값이 없는 것과 값이 0인 것은 다릅니다. 설문에서 나이를 쓰지 않은 사람을 0세로 입력하면 거리가 크게 왜곡될 수 있습니다. 결측값은 왜 빠졌는지부터 살펴봐야 합니다.
학습 자료로 채우기 기준을 구합니다
training = [2, None, 4]
test = [None, 10]
observed = [value for value in training if value is not None]
if not observed:
raise ValueError("No observed training values")
mean = sum(observed) / len(observed)
def fill(values):
return [mean if value is None else value for value in values]
print(fill(training))
print(fill(test))
출력은 [2, 3.0, 4]와 [3.0, 10]입니다. 시험 자료의 10은 평균 계산에 쓰지 않습니다. 학습 자료가 전부 비어 있다면 평균을 낼 수 없으므로 예제는 오류를 냅니다.
평균으로 채우면 구현은 쉽지만 값의 분산과 특성 사이 관계가 달라질 수 있습니다. ‘원래 비어 있었는가’를 별도 특성으로 남기거나, 자료를 더 수집하거나, 결측을 처리할 수 있는 다른 방법도 검토합니다. 빈칸이 많은 행을 모두 지우면 특정 집단만 사라지는지도 확인해야 합니다.
작은 프로젝트: 과일 분류
- 문제: 무게와 색 수치로 사과와 배를 구분합니다. 어떤 과일과 환경에 사용할지 범위를 정합니다.
- 자료: 실제 종류를 레이블로 기록하고, 같은 과일을 여러 번 찍은 자료는 같은 묶음으로 관리합니다.
- 분할: 과일 단위로 학습, 검증, 시험 자료를 나눕니다.
- 전처리: 학습 자료에서 빈칸 처리와 크기 조정 기준을 구합니다.
- 비교: 가장 흔한 종류만 고르는 기준 모델과 k-NN 등을 비교합니다.
- 평가: 검증으로 설정을 고른 뒤 시험 결과와 자주 틀리는 조건을 기록합니다.
군집화로 먼저 살펴볼 수는 있지만 필수 단계는 아닙니다. 더 복잡한 신경망을 고르기 전에 자료와 평가가 믿을 만한지 확인하는 습관이 중요합니다.
확인 문제
같은 사과를 찍은 거의 동일한 사진이 학습 자료와 시험 자료에 섞여 있습니다. 좋은 점수가 나오면 새 사과도 잘 구분한다고 말할 수 있을까요?
해설 보기
근거가 부족합니다. 이미 본 과일의 특징을 기억했을 수 있습니다. 과일 단위로 나누고, 필요한 경우 촬영 시기나 환경도 구분하여 실제 새 자료에 대한 성능을 확인해야 합니다.