사전 데이터셋
개념

데이터셋

gabury1고친 사람 github-actions[bot]

데이터셋은 한 가지 목적에 쓸 데이터를 모아 한 묶음으로 건네줍니다. 머신러닝에서는 모델을 가르치고 채점하는 재료가 이 묶음입니다. 같은 묶음을 쓰면 다른 사람이 만든 모델과 성적을 견줄 수 있습니다. 데이터 분석에서도 같은 뜻으로 씁니다. 다만 몇몇 프로그래밍 라이브러리가 같은 이름을 붙인 클래스는 가리키는 물건이 다릅니다.

쉽고 빠른 이해

무슨 일을 하나 — 흩어진 기록을 한 목적에 맞게 모아 한 묶음으로 넘겨줍니다. 집값을 맞히는 모델이라면 집마다 면적과 방 수와 거래가를 한 줄씩 적은 표가 데이터셋입니다.

왜 필요한가 — 머신러닝 모델은 규칙 대신 예시를 보고 배웁니다. 예시를 모아 둔 묶음이 없으면 가르칠 수도 채점할 수도 없습니다.

어떻게 쓰나

  1. 목적에 맞는 기록을 모아 한 줄에 한 건씩 정리합니다
  2. 줄을 섞은 뒤 가르치는 데이터와 채점하는 데이터로 나눕니다. 채점하는 데이터는 다시 둘로 가릅니다 — 후보 모델을 고르는 데 쓰는 것과 마지막에 한 번 재는 것
  3. 묶음에 버전을 매겨 두고 같은 묶음으로 다시 돌립니다

대가 — 모델은 데이터셋에 담긴 것만 배웁니다. 기록을 모으고 정답을 붙이고 버전을 관리하는 품이 듭니다.

상세

학원은 연습 문제를 낱장으로 흩어 주지 않습니다. 문제와 정답지를 한 권의 문제집으로 묶어 줍니다. 학생은 앞쪽 문제로 연습합니다. 실력은 뒤쪽 모의고사로 잽니다. 같은 문제집을 푼 학생끼리는 점수를 견줄 수 있습니다.

머신러닝은 사람이 규칙을 코드로 적는 대신 예시를 보여 주는 방식입니다. 규칙은 프로그램이 예시 속에서 스스로 찾습니다. 규칙을 일일이 적기 어려운 일을 맡길 때 씁니다.

예시에서 규칙을 찾아 낸 프로그램을 모델이라고 부릅니다. 모델은 입력을 받아 답을 내놓습니다. 집값을 맞히는 모델이라면 집의 면적과 방 수를 받아 값을 내놓습니다.

모델이 예시를 보며 자기를 고쳐 가는 과정은 훈련입니다. 처음 모델은 엉뚱한 답을 냅니다. 예시에 적힌 정답과 견주어 틀린 만큼 자기를 고칩니다.

데이터셋은 이 예시들을 한 가지 목적 아래 모아 둔 묶음입니다. 집값을 맞히는 모델이라면 지난 몇 년 동안 거래된 집의 기록을 모은 표가 데이터셋입니다. 모델이 무엇을 배우고 어떤 점수를 받을지는 이 묶음이 정합니다.

데이터셋 한 건의 생김새

데이터셋은 대개 표처럼 생겼습니다. 한 줄이 대상 하나입니다. 한 칸은 그 대상에 대해 적어 둔 값 하나입니다. 아래는 집값 데이터셋의 세 줄입니다.

면적(㎡) 방 수 지은 해 거래가(억 원)
84 3 2010 9.2
59 2 1998 5.1
114 4 2018 14.0

줄 하나가 집 한 채입니다. 이 한 줄을 표본이라고 부릅니다. 예시나 샘플이라고도 합니다.

앞의 세 칸처럼 모델에게 보여 주는 값을 특성이라고 합니다. 특성은 모델이 답을 낼 때 근거로 삼는 값입니다. 모델은 집을 직접 보지 못하고 이 숫자들만 봅니다.

마지막 칸처럼 모델이 맞혀야 할 정답을 레이블이라고 합니다. 훈련이 끝난 모델은 레이블 칸이 빈 새 줄을 받아 그 칸을 채웁니다.

레이블이 없는 데이터셋도 있습니다. 그런 데이터셋으로는 비슷한 것끼리 묶는 일처럼 정답이 필요 없는 일을 시킵니다. 어느 쪽이든 한 줄에 한 건이라는 생김새는 같습니다.

표 모양 데이터셋은 흔히 CSV(Comma-Separated Values) 파일로 주고받습니다. 한 줄에 한 건씩, 값 사이를 쉼표로 가른 텍스트 파일입니다. 위 집값 표라면 84,3,2010,9.2 같은 줄이 세 개 놓입니다.

표가 아닌 데이터셋도 있습니다. 사진 폴더와, 사진마다 무엇이 찍혔는지 적은 목록 파일 한 벌도 데이터셋입니다. 글을 많이 모은 데이터셋은 따로 말뭉치라고 부르기도 합니다.

운영 데이터베이스와 따로 묶어 두기

서비스의 데이터베이스에도 기록은 쌓여 있습니다. 그 기록은 서비스를 돌리려고 쌓은 것이라 모델에 바로 넣기 어렵습니다. 테이블 여러 개에 흩어져 있습니다. 내용도 매 순간 바뀝니다.

데이터셋은 이 기록에서 목적에 맞는 것만 골라 한 시점에 굳혀 둔 묶음입니다. 굳혀 두면 오늘 돌린 훈련과 다음 주에 돌린 훈련이 같은 예시를 봅니다. 결과가 달라지면 원인을 데이터 말고 코드나 설정에서 찾으면 됩니다.

여럿이 같은 데이터셋을 쓰면 모델끼리 성적을 견줄 수 있습니다. 새 방법을 내놓는 사람은 널리 쓰이는 데이터셋에서 받은 점수를 함께 내놓습니다. 성적을 견주려고 함께 쓰는 데이터셋을 벤치마크 데이터셋이라고 부릅니다.

MNIST는 널리 쓰이는 벤치마크 데이터셋입니다. 손글씨 숫자 사진마다 정답 숫자를 붙여 모았습니다. 이름은 Modified National Institute of Standards and Technology database 의 줄임말입니다.

훈련·검증·테스트 세트로 나누기

모델을 만드는 목적은 앞으로 들어올 새 데이터에 답하는 것입니다. 처음 보는 데이터에서도 잘 맞히는 성질을 일반화라고 합니다. 모델이 쓸모 있는지는 일반화로 판가름 납니다.

모델이 훈련에서 본 예시를 외워 버리면 그 예시는 거의 다 맞힙니다. 그러나 새 데이터 앞에서는 자주 틀립니다. 이렇게 본 데이터에만 맞춰진 상태가 과적합입니다. 훈련에 쓴 예시로 채점하면 과적합을 알아챌 수 없습니다.

과적합을 알아채려면 모델이 한 번도 안 본 부분을 남겨 둬야 합니다. 그 부분을 새 데이터 대신 씁니다. 흔히 데이터셋을 셋으로 나눕니다. 나눈 세트마다 쓰이는 단계가 다릅니다.

훈련 세트는 모델을 가르치는 세트입니다. 모델은 이 세트만 보고 배웁니다.

모델을 만들 때는 사람이 미리 정해 주는 설정이 있습니다. 훈련 세트를 몇 바퀴 되풀이해 볼지가 그런 설정입니다. 이런 설정을 하이퍼파라미터라고 합니다. 설정이 다르면 같은 데이터로도 다른 모델이 나옵니다.

검증 세트는 후보 모델 가운데 하나를 고르는 세트입니다. 설정을 바꿔 가며 후보를 여럿 훈련합니다. 그 가운데 검증 세트에서 점수가 가장 높은 후보를 고릅니다.

테스트 세트는 고른 모델을 마지막에 한 번 재는 세트입니다. 테스트 점수를 보고 모델을 다시 고치면 테스트 세트도 고르는 데 쓴 셈이 됩니다. 그러면 더는 새 데이터를 대신하지 못합니다.

아래 그림은 세 세트가 어느 단계에서 쓰이는지 보입니다.

flowchart TD
    D["데이터셋"] --> T["훈련 세트"]
    D --> V["검증 세트"]
    D --> S["테스트 세트"]
    T --> M["설정을 바꿔 후보 모델 여럿을 훈련한다"]
    M --> C["검증 세트로 채점해 하나를 고른다"]
    V --> C
    C --> F["테스트 세트로 마지막에 한 번 잰다"]
    S --> F

섞은 뒤에 나누기

데이터셋 파일은 대개 기록이 쌓인 순서대로 줄이 놓여 있습니다. 앞에서부터 잘라 나누면 오래된 집은 훈련 세트에, 최근 집은 테스트 세트에만 몰립니다. 그래서 줄을 무작위로 섞은 뒤에 자릅니다. 아래는 파이썬으로 집 1000채를 세 세트로 나누는 코드입니다.

Python
import random

random.seed(42)       # 섞는 순서 고정
random.shuffle(rows)  # rows: 집 1000채
train = rows[:800]    # 800채
valid = rows[800:900] # 100채
test = rows[900:]     # 100채

random.seed(42) 는 섞는 순서를 정하는 출발값을 고정합니다. 이 출발값을 시드라고 부릅니다. 시드가 같으면 몇 번을 돌려도 같은 줄이 같은 세트에 들어갑니다. 어느 줄이 어느 세트에 들어가는지가 데이터셋처럼 한 번 정해지면 바뀌지 않습니다.

섞기만으로는 모자랄 때가 있습니다. 회원 한 명의 주문이 여러 줄에 걸쳐 있다고 합시다. 줄 단위로 섞으면 같은 회원이 훈련 세트와 테스트 세트에 갈라져 들어갑니다. 모델은 테스트에서 이미 본 회원을 다시 만납니다. 본 적 있는 회원이라 점수가 부풀어 오릅니다.

테스트 세트의 정보가 훈련에 새어 드는 일을 데이터 누수라고 부릅니다. 누수가 있으면 테스트 점수가 새 데이터 앞에서의 실력보다 좋게 나옵니다. 회원 예라면 한 회원의 줄을 한 세트에 몰아 넣도록 회원 단위로 묶어서 나눕니다.

누수는 시간을 따라서도 생깁니다. 날짜가 중요한 데이터셋을 무작위로 섞으면 미래의 기록이 훈련 세트에 섞여 듭니다. 실제로 쓰일 때 모델은 미래를 미리 볼 수 없습니다.

이런 데이터셋은 날짜를 기준으로 자릅니다. 어느 날짜보다 앞선 기록으로 훈련합니다. 채점은 그 뒤의 기록으로 합니다.

데이터셋의 치우침이 모델로 옮겨 가는 모습

모델은 데이터셋에 담긴 것만 배웁니다. 데이터셋에 없는 종류의 입력은 모델도 알아보지 못합니다. 그래서 데이터셋을 어떻게 모았는지가 모델의 한계를 정합니다.

모으는 방식이 한쪽으로 치우치면 데이터셋도 치우칩니다. 서울 아파트 거래만 모은 데이터셋으로 훈련한 모델은 지방 단독주택 값을 엉뚱하게 매깁니다. 모으는 단계에서 생기는 치우침을 표본 편향이라고 합니다.

정답 하나가 대부분을 차지하는 데이터셋도 있습니다. 카드 결제 기록에서 사기 거래는 아주 드뭅니다. 이런 데이터셋을 두고 클래스 불균형이 있다고 말합니다.

이런 데이터셋으로 훈련하면 모델은 흔한 쪽으로 기울기 쉽습니다. 전부 「정상」이라고 답해도 맞힌 비율은 높게 나옵니다. 사기 거래는 하나도 잡지 못했습니다. 그런데도 맞힌 비율만 보면 쓸 만한 모델처럼 보입니다.

데이터셋 버전 관리

데이터셋은 한 번 만들고 끝나지 않습니다. 새 기록을 더합니다. 틀린 레이블을 고칩니다. 이상한 줄을 걸러 냅니다. 그때마다 데이터셋의 내용이 바뀝니다.

같은 코드로 훈련해도 데이터셋이 바뀌면 다른 모델이 나옵니다. 그래서 어느 모델이 어느 버전의 데이터셋으로 만들어졌는지 기록해 둡니다. 코드에 커밋을 남기듯 데이터셋에도 버전을 매기는 일을 데이터 버전 관리라고 합니다.

데이터셋에는 설명서를 함께 두기도 합니다. 어디서 언제 모았는지, 레이블은 누가 어떻게 달았는지, 무엇이 빠져 있는지를 적습니다. 받아 쓰는 사람은 이 설명서를 보고 자기 목적에 맞는 데이터셋인지 가립니다.

머신러닝 밖에서 말하는 데이터셋

데이터셋은 머신러닝보다 넓게 쓰이는 말입니다. 「한 목적으로 모은 데이터 묶음」이라는 뼈대는 어디서나 같습니다. 묶음의 크기와 생김새는 분야마다 다릅니다.

쓰는 곳 데이터셋이 가리키는 것
데이터 분석과 통계 분석하려고 모은 표 한 벌. 행이 관측 하나, 열이 변수 하나다
공공 데이터 공개 기관이 내려받게 올려 둔 파일 묶음. 흔히 CSV 파일과 설명 문서 한 벌이다
.NET 의 데이터베이스 라이브러리 DataSet 클래스. 데이터베이스에서 읽어 온 테이블 여러 개를 메모리에 함께 들고 있는 객체다
Apache Spark Dataset 타입. 여러 서버에 나눠 담은, 타입이 정해진 데이터 모음이다

위 표의 마지막 두 줄은 라이브러리가 자기 클래스나 타입에 붙인 이름입니다. 같은 낱말이라도 앞에서 본 머신러닝의 데이터셋과는 가리키는 물건이 다릅니다. 코드에서 DataSet 이나 Dataset 을 만나면 어느 라이브러리의 것인지부터 보면 됩니다.

관련 항목

데이터셋이 속하는 상위 분야

머신러닝 · 딥러닝 · 데이터 과학 · 데이터 분석 · 통계학

데이터셋 한 건을 이루는 구성 요소

표본 · 특성 · 특성 벡터 · 레이블 · 타깃 · 차원 · 결측값

데이터셋을 나눠 만드는 세트

훈련 데이터 · 검증 세트 · 테스트 세트 · 데이터 분할 · 홀드아웃 검증 · 교차 검증 · 층화 추출

데이터셋을 마련하는 작업

데이터 수집 · 데이터 라벨링 · 데이터 정제 · 데이터 전처리 · 데이터 증강 · 합성 데이터

데이터셋으로 모델을 만들고 재는 단계

훈련 · 모델 · 하이퍼파라미터 · 시드 · 일반화 · 평가 지표 · 벤치마크

데이터셋의 흠에서 비롯되는 문제

과적합 · 데이터 누수 · 표본 편향 · 클래스 불균형 · 레이블 노이즈 · 분포 이동

데이터셋을 관리하는 수단

데이터 버전 관리 · 데이터 계보 · 데이터 카탈로그 · 데이터 품질 · MLOps

널리 쓰이는 공개 데이터셋

MNIST · ImageNet · 말뭉치 · 공공 데이터

데이터셋을 담는 파일 포맷

CSV · JSON Lines · Parquet · TFRecord

데이터셋을 메모리에 담는 프로그래밍 타입

데이터프레임 · pandas · RDD · Apache Spark · ADO.NET

다른 이름: dataset · data set · 데이터 세트 · 데이터 집합