Data Cleaning
데이터 정제는 학습 전에 데이터셋의 손상된 파일, 중복, 결측값, 레이블 오류를 찾아 수정합니다. 기법, 도구, 코드 예제를 다룹니다.
데이터 정제는 데이터 세정 또는 데이터 스크러빙이라고도 하며, 데이터셋에서 손상되거나 중복되거나 불완전하거나 일관성이 없거나 잘못 레이블된 레코드를 찾아 수정하거나 제거하는 과정입니다. 머신러닝(ML)에서는 데이터 전처리와 학습에 앞서 이 작업을 수행합니다. 모델은 학습 데이터에 포함된 오류까지 그대로 학습하기 때문입니다. 자전거의 절반이 "오토바이"로 레이블된 이미지로 학습한 탐지기는 두 대상을 혼동하도록 학습하며, 레이블이 잘못된 테스트 세트는 모델의 성능을 잘못 측정합니다. 데이터 정제는 아키텍처보다 데이터를 개선해 모델을 향상시키는 데이터 중심 AI의 핵심 실천 방법입니다.
데이터 품질이 모델의 성능을 제한하는 이유#
데이터 오류는 여러 방식으로 정확도를 떨어뜨립니다. 잘못 레이블된 예시는 잘못된 입력-출력 대응을 학습시키고, 모델이 노이즈를 암기하도록 하여 과적합을 유발합니다. 중복 데이터는 일부 예시에 더 큰 가중치를 부여하며, 복사본이 학습 및 평가 분할에 모두 포함되면 점수를 부풀리는 데이터 누수가 발생합니다. 손상된 파일은 데이터 로더를 중단시키거나 알림 없이 건너뛰게 만들며, 일관되지 않은 클래스 이름은 하나의 범주를 여러 범주로 나눕니다. 벤치마크도 영향을 받습니다. 널리 사용되는 테스트 세트 10개를 조사한 연구는 평균적으로 예시의 최소 3.3%, ImageNet 검증 세트의 최소 6%에 레이블 오류가 있다고 추정했습니다. 수정된 레이블로 평가하면 원래 레이블이 잘못된 테스트 예시의 비중이 단 6% 증가했을 때 ResNet-18이 ResNet-50보다 우수한 성능을 보입니다.
일반적인 데이터 정제 작업#
표 형식 데이터는 보통 pandas와 같은 라이브러리로 정제합니다. 반면 비전 데이터셋은 픽셀부터 바운딩 박스 좌표까지 이미지 파일과 어노테이션을 검사해야 합니다. 임베딩을 비교하면 거의 중복된 이미지를 찾을 수 있으며, 벡터 검색을 사용하면 비교 대상을 수백만 장의 이미지로 확장할 수 있습니다.
- 결측값: 필드가 비어 있는 레코드는 제거하거나 열 통계 또는 최근접 이웃을 이용한 대치로 값을 채웁니다. 비전 데이터셋에서 레이블 파일이 없는 이미지는 의도적으로 배경 이미지로 사용한 것인지, 아니면 아무도 어노테이션하지 않은 것인지 불분명합니다.
- 중복 및 거의 중복된 데이터: 바이트 단위로 동일한 파일은 같은 해시를 가집니다. 크기를 조정하거나 재압축한 복사본과 연속된 비디오 프레임은 같은 해시를 갖지 않으므로, 지각 해시 또는 임베딩 유사도를 사용해야 합니다.
- 손상 및 유효하지 않은 파일: 다운로드가 잘렸거나, 지원되지 않는 형식이거나, 예상하지 못한 색상 모드이거나, 이미지가 너무 작으면 디코딩에 실패하거나 사용할 수 있는 신호가 없습니다.
- 레이블 오류: 잘못된 클래스, 누락된 객체, 느슨하거나 잘못 배치된 박스는 지도 학습 비전 데이터에서 가장 큰 비용을 초래하는 오류이며 눈으로 찾아내기도 가장 어렵습니다.
- 일관되지 않은 범주: "Car"와 "car" 같은 철자 차이나 "자동차"와 "차량"처럼 겹치는 클래스는 하나의 분류 체계로 통합하여 각 개념에 하나의 레이블만 부여합니다.
- 이상치: 음수 나이 또는 이미지 테두리 밖으로 벗어난 박스처럼 불가능한 값은 수정해야 하는 오류입니다. 드물지만 유효한 사례는 유지합니다. 이러한 엣지 케이스가 모델이 가장 많이 학습해야 할 대상인 경우가 많기 때문입니다.
모델을 사용한 레이블 오류 탐지#
모든 레이블을 일일이 검토하는 방식은 확장하기 어려우므로, 정제 파이프라인에서는 학습된 모델을 사용해 검사할 레이블의 우선순위를 정합니다. 오픈 소스 cleanlab 라이브러리로 구현된 신뢰도 학습은 교차 검증에서 얻은 샘플 외 예측 확률을 사용하여, 모델이 주어진 레이블과 다른 클래스를 높은 신뢰도로 예측하는 예시를 표시합니다. 최종 판단은 여전히 사람이 내립니다. 앞서 언급한 테스트 세트 연구에서는 크라우드소싱 검토자가 알고리즘으로 표시된 후보 중 51%를 실제 레이블 오류로 확인했습니다.
파일 검사 자동화#
파일 단위 검사는 새 데이터 배치마다 실행할 수 있을 만큼 비용이 낮으며, 데이터셋 품질 관리 강의에서 다루는 라벨 및 클래스 균형 감사와 함께 수행할 수 있습니다. 다음 스크립트는 이미지 하나, 완전히 동일한 사본, 잘린 파일이 들어 있는 작은 폴더를 만들고 Pillow와 콘텐츠 해시를 사용해 사본과 손상된 파일을 표시합니다.
import hashlib
from pathlib import Path
from PIL import Image
# A tiny image folder: one original, one exact copy, and one truncated download
folder = Path("images")
folder.mkdir(exist_ok=True)
Image.new("RGB", (640, 480), "orange").save(folder / "a.jpg")
(folder / "b.jpg").write_bytes((folder / "a.jpg").read_bytes())
(folder / "c.jpg").write_bytes((folder / "a.jpg").read_bytes()[:1000])
seen = {}
for path in sorted(folder.glob("*.jpg")):
try:
Image.open(path).load() # decode every pixel; a truncated file raises OSError
except OSError as error:
print(f"{path.name}: corrupt ({error})")
continue
digest = hashlib.md5(path.read_bytes()).hexdigest() # identical bytes give identical hashes
if digest in seen:
print(f"{path.name}: duplicate of {seen[digest]}")
seen.setdefault(digest, path.name)스크립트는 b.jpg: duplicate of a.jpg과 c.jpg: corrupt (image file is truncated (5 bytes not processed))을 출력합니다. 이미지 파일을 완전히 디코딩하는 것이 중요합니다. 파일을 열 때 헤더만 읽을 수 있으며, 잘린 파일도 이 단계를 통과할 수 있기 때문입니다. Ultralytics YOLO는 데이터셋의 레이블 캐시를 생성할 때마다 관련 검사를 수행합니다. 이미지 끝 표시자가 없는 JPEG를 다시 저장하고, 중복 레이블 행을 제거하며, 이미지 크기가 10픽셀 미만이거나 좌표가 이미지 범위를 벗어나거나 클래스 ID가 데이터셋 YAML에 정의된 범위를 벗어나는 이미지-레이블 쌍을 건너뛴 다음, 검사 요약에 이미지, 배경, 손상 항목 수를 보고합니다.
데이터 정제와 관련 용어 비교#
- 데이터 전처리: 크기 조정 및 픽셀 값 정규화와 같이 이미 올바른 데이터를 모델이 기대하는 형식으로 변환합니다. 정제는 어떤 데이터가 올바른지 판단합니다.
- 데이터 증강: 학습 중 정제된 데이터에 좌우 반전이나 색상 변화와 같은 의도적인 변형을 추가합니다.
- 데이터 레이블링: 레이블이 없는 데이터에 레이블을 생성하는 작업이며, 정제는 이미 존재하는 레이블을 감사하고 수정하는 작업입니다.
- 데이터셋 편향: 데이터셋에 오류가 없더라도 일부 조건이나 집단이 충분히 포함되지 않을 수 있습니다. 편향을 바로잡으려면 다른 데이터를 수집해야 하며, 정제만으로는 해결할 수 없습니다.










