TL;DR — 집합은 데이터의 순서나 저장 모양보다 먼저, 어떤 원소가 들어 있는지를 정하는 언어입니다. 이 관점으로 훈련·시험 데이터를 겹치지 않게 나누고, 필요한 데이터만 골라낼 수 있습니다.
왜 배우나요? — AI 모델을 만들기 전에 ‘무엇을 학습에 넣고 무엇을 평가에 남길지’를 정해야 합니다. 이 경계가 흐리면 같은 데이터로 공부하고 시험 보는 데이터 누수가 생길 수 있습니다.
AI 어디에 쓰이나요? — 이미지 분류의 전체 데이터셋 , 훈련 집합 , 시험 집합 처럼 AI 파이프라인의 대상을 정의하고 검사할 때 쓰입니다.
집합 — ‘들어 있는가’를 먼저 정합니다
집합(set)은 무엇이 들어 있는지 분명하게 정해진 모임이고, 그 안의 대상 하나하나를 원소(element)라고 합니다.
상품 데이터셋 를 생각해 보겠습니다.
- 상품 ID 하나는 원소입니다.
- 전체 상품 ID의 모임은 집합 입니다.
- 어떤 상품 ID가 에 들어 있는지는 참 또는 거짓으로 판단할 수 있어야 합니다.
명단의 이름이 ‘소속’을 나타내듯, 집합의 원소는 ‘그 모임에 속함’을 나타냅니다. 이 대응에서 이름 하나가 원소, 명단 전체가 집합, 이름의 유무가 소속 여부입니다.
따라서 집합이 먼저 답하는 질문은 ‘몇 번째인가?’가 아니라 ‘들어 있는가?’입니다.
같은 전체 집합을 나누고 골라내는 세 가지 관점
같은 120개 원소를 유지한 채, 어떤 원소에 주목하는지만 바뀝니다.
[전체 데이터셋 D] 점 하나는 사진 한 장이고, 경계 안의 120개 점 전체가 집합 입니다. 먼저 ‘무엇이 전체인가’를 확인합니다.
[훈련·시험 분할] 채운 점 96개는 훈련용, 속 빈 점 24개는 시험용입니다. 두 표식이 한 점에 동시에 붙지 않으므로 두 부분집합은 겹치지 않습니다.
[조건 부분집합 S] 조건 을 만족하는 34개만 강조됩니다. 이 화면 뒤에는 ‘주어진 조건으로 어떤 원소를 선택할 것인가’라는 판단이 있습니다.
한 줄 정리 — 집합은 데이터의 위치가 아니라 원소의 소속 여부를 표현합니다.
기호로 정확하게 말하기
중괄호 안에 원소를 나열하면 집합을 쓸 수 있습니다.
- : 세 사진으로 이루어진 집합입니다.
- : 고양이 사진이 에 속합니다.
- : 의 모든 원소가 에도 들어 있는 부분집합입니다.
집합은 순서와 중복을 구별하지 않습니다. 그래서 이고, 입니다. 이것은 ‘집합을 저장한 줄의 모양’이 아니라 ‘어떤 원소가 들어 있는지’만 비교하기 때문입니다.
: 합집합 — 두 모임을 합친 것
: 교집합 — 두 모임에 공통으로 든 원소
: 공집합 — 원소가 하나도 없는 집합
훈련 집합과 시험 집합을 합치면 전체가 되고, 두 집합의 교집합은 비어 있어야 합니다.
전체 데이터를 빠짐없이 나누되, 같은 샘플을 양쪽에 넣지 않습니다.
분할을 판단하는 두 질문
훈련·시험 분할은 다음 두 질문으로 검사할 수 있습니다.
- 빠진 원소가 없는가? 인지 봅니다.
- 겹친 원소가 없는가? 인지 봅니다.
두 번째 조건이 깨지면 시험 샘플이 훈련에 섞인 데이터 누수(data leakage)입니다. 모델이 처음 보는 데이터에 일반화했는지 공정하게 평가할 수 없으므로, 높은 시험 점수도 믿기 어렵습니다.
조건 부분집합도 같은 방식입니다. 먼저 전체 와 선택 조건을 정하고, 조건을 만족하는 원소만 에 넣습니다. ‘최근 7일 클릭’, ‘고양이 이미지’처럼 조건이 바뀌면 부분집합도 달라집니다.
한 줄 정리 — 좋은 분할은 전체를 빠짐없이 덮고, 훈련과 시험은 서로 겹치지 않습니다.
코드로 확인하기
수학의 집합과 실제 저장 구조는 구분해야 합니다.
- 수학적 관점: 순서와 중복을 무시하고 소속 관계를 판단합니다.
- 저장 관점: 리스트·배열·테이블은 순서와 중복을 유지할 수 있습니다. 배치 순서나 92번째 샘플처럼 위치가 필요하기 때문입니다.
- 검사할 때: 파이썬
set으로 바꾸면 중복 제거, 부분집합, 교집합을 바로 확인할 수 있습니다.
즉, 개념은 집합으로 세우고 저장은 목적에 맞는 구조를 고릅니다.
# 현실의 사진 파일 이름을 원소로 갖는 데이터 모임
raw = ["cat_01", "cat_02", "dog_01", "dog_02", "cat_01"] # cat_01 이 중복됨
D = (raw) # 집합 — 중복이 저절로 사라짐
("전체 원소 개수:", (D))
train = {"cat_01", "cat_02", "dog_01"}
test = {"dog_02"}
("train 이 D의 부분집합인가:", train <= D) # 수학의 ⊆
("train 과 test 가 겹치는 원소:", train & test) # 수학의 ∩ — 데이터 누수 검사전체 원소 개수: 4 train 이 D의 부분집합인가: True train 과 test 가 겹치는 원소: set()
set(raw)는 중복된 cat_01을 하나로 줄이므로 원소 수가 5개에서 4개가 됩니다. train <= D는 를, train & test는 를 검사합니다. 마지막 결과가 빈 집합 set()이므로 이 예시에는 훈련·시험 중복이 없습니다.
AI 파이프라인으로 연결하기
AI 엔지니어는 집합 관점으로 모델에 들어갈 데이터의 경계를 먼저 점검합니다.
- 분할: 훈련·검증·시험 집합이 서로 겹치지 않는지 검사합니다.
- 중복 제거: 같은 사진이나 문서가 여러 번 들어가 평가를 왜곡하지 않는지 확인합니다.
- 조건 추출: 특정 클래스·기간·사용자 조건을 만족하는 부분집합을 만들어 실험합니다.
여기까지는 ‘어떤 원소를 다룰지’를 정한 단계라서 사진과 문장은 아직 숫자가 아닙니다. 다음 절에서는 집합 의 원소 하나하나를 AI가 계산할 수 있도록 스칼라·벡터·행렬·텐서라는 숫자 그릇에 담습니다. 마지막 임베딩 절에서는 이 가 다시 ‘검색할 후보 벡터들의 집합’으로 돌아옵니다.
마무리 — 현실 데이터에서 원소와 집합을 정하고, 부분집합으로 나누고, 교집합으로 누수를 검사합니다. 이제 남은 질문은 하나입니다. 각 원소를 어떤 숫자 모양으로 표현할까요?