# 데이터셋과 분할

> Skynet이 케이스를 읽고 학습, 검증, 테스트로 나누는 방법.

데이터셋은 케이스의 표입니다. 각 행이 하나의 케이스입니다. Skynet은 케이스에서 아티팩트를 실행하고, 각 출력을 채점하고, 그 점수로 버전을 비교합니다. 이 페이지는 Skynet이 케이스를 읽는 방식, 열 역할의 의미, 그리고 케이스를 학습, 검증, 테스트 세트로 분할하는 방식을 설명합니다.

## 데이터 불러오기

마법사의 **입력** 단계에는 두 가지 옵션이 있습니다.

- **CSV, JSON 또는 Excel 파일 업로드**. Skynet은 `.csv`, `.json`, `.xlsx`, `.xls` 파일을 받습니다.
- **라이브러리에서 선택**. 이전에 저장한 데이터셋을 사용합니다.

실행 하나에는 최대 200,000개의 케이스를 넣을 수 있습니다.

저장된 데이터셋을 관리하려면 [데이터셋 준비](/docs/ko/guides/datasets)를 읽어 보세요.

## 열 역할

**데이터를 읽는 방식**에서 각 열에 역할을 하나씩 지정합니다.

| 역할      | Skynet이 열로 하는 일                                     |
| --------- | --------------------------------------------------------- |
| 입력      | 값을 `input`에 넣습니다. 실행 코드가 이 값을 받습니다.    |
| 출력      | 값을 `expected`에 넣습니다. 메트릭이 이 값을 받습니다.    |
| 건너뛰기  | 열을 사용하지 않습니다.                                   |

각 열에는 종류도 있습니다. **텍스트** 또는 **이미지**입니다.

출력 열은 하나만 지정할 수 있습니다. 두 번째 열을 출력으로 설정하면 첫 번째 열은 건너뛰기로 바뀝니다.

### 코드가 받는 값

Skynet은 각 행으로 케이스 하나를 만듭니다.

- `input`은 dict입니다. 입력 열마다 키가 하나씩 있습니다.
- `expected`는 키가 하나인 dict입니다. 키는 출력 열의 이름입니다.

다음 표에서

| message             | label   | id  |
| ------------------- | ------- | --- |
| I was charged twice | billing | 17  |

역할이 `message` = 입력, `label` = 출력, `id` = 건너뛰기라면 코드는 다음 값을 받습니다.

```python tab="input"
{"message": "I was charged twice"}
```

```python tab="expected"
{"label": "billing"}
```

> [!TIP]
> 메트릭에서는 열 이름으로 기댓값을 읽으세요. 예: `expected["label"]`.

## 데이터 모드

역할에 따라 실행의 데이터 모드가 정해집니다.

| 모드 | 조건                    | 동작                                                                                     |
| ---- | ----------------------- | ---------------------------------------------------------------------------------------- |
| 쌍   | 한 열이 출력입니다      | 모든 행이 입력과 기댓값을 가진 케이스가 됩니다. 최소 2개 행이 필요합니다.                |
| 단일 | 출력 열이 없습니다      | 실행은 첫 번째 행의 입력 열만 사용합니다. 기댓값이 없는 케이스 하나가 됩니다.            |

단일 모드에서 Skynet은 하나뿐인 케이스를 학습, 선택, 보고에 모두 사용합니다. 따로 떼어 두는 데이터가 없습니다.

## 분할

쌍 모드에서 Skynet은 케이스를 세 세트로 분할합니다.

| 세트         | 용도                                                       |
| ------------ | ---------------------------------------------------------- |
| 학습         | 엔진이 이 케이스에서 버전을 제안하고 테스트합니다.         |
| 검증         | Skynet이 이 케이스에서 최고 버전을 선택합니다.             |
| 테스트       | Skynet이 이 케이스에서 최종 점수를 보고합니다.             |

> [!NOTE]
> 테스트 케이스는 엔진, 제안자, 계약 검사에 절대 전달되지 않습니다. 최종 점수는 옵티마이저가 보지 못한 케이스에서 나옵니다.

### 기본 분할

| 쌍의 수      | 학습 | 검증 | 테스트 |
| ------------ | ---- | ---- | ------ |
| 5개 이상     | 70%  | 15%  | 15%    |
| 5개 미만     | 85%  | 15%  | 0%     |

쌍이 5개 미만이면 Skynet은 테스트 세트를 두지 않습니다.

### Skynet이 케이스 수를 세는 방식

Skynet은 최대 나머지 방식(largest-remainder method)으로 비율을 정수 케이스 수로 바꿉니다. 각 수의 합은 항상 전체 케이스 수와 같습니다. 비율이 0보다 큰 세트는 최소 하나의 케이스를 받습니다. 비율이 0인 세트는 케이스를 받지 않습니다.

분할하기 전에 Skynet은 케이스를 섞습니다. 섞을 때는 실행의 시드를 사용합니다. 시드를 주지 않으면 Skynet이 케이스, 목표, 아티팩트로 시드를 만듭니다. 따라서 같은 실행을 다시 제출하면 같은 분할을 얻습니다.

### 대체 규칙

- 쌍이 5개 미만이면 Skynet은 테스트 세트를 제거하고, 학습과 검증의 합이 1이 되도록 비율을 조정합니다.
- 학습 세트가 비어 있으면 Skynet은 검증 케이스를 학습용으로 사용합니다.
- 검증 세트가 없으면 Skynet은 학습 케이스에서 선택합니다.
- 테스트 세트가 없으면 Skynet은 검증 세트로 보고합니다. 검증 세트도 없으면 학습 세트로 보고합니다.

> [!WARNING]
> Skynet이 학습이나 검증 세트로 보고한 점수는 따로 떼어 둔 데이터의 점수가 아닙니다. 테스트 세트를 얻으려면 최소 5개의 쌍을 사용하세요.

## 분할 변경하기

분할 섹션에는 **추천 분할**이 표시됩니다. 모드는 두 가지입니다.

1. **추천 사용**: Skynet이 위의 기본 분할을 사용합니다.
2. **수동 선택**: **학습**, **검증**, **테스트**를 직접 설정합니다.

수동 선택에서 각 필드는 0에서 1 사이의 비율을 0.05 단위로 받습니다. 각 필드는 받게 되는 케이스 수를 보여 줍니다. 세 비율의 합은 1이어야 합니다. 그렇지 않으면 마법사에 "분할 비율의 합은 1이어야 합니다."가 표시됩니다.

## 계약 샘플

**메트릭 및 실행** 단계의 계약 검사는 샘플 케이스 3개에서 코드를 실행합니다. Skynet은 이 샘플을 학습과 검증 케이스에서만 가져오며, 테스트 케이스에서는 절대 가져오지 않습니다.

## 관련 페이지

- [데이터셋 준비](/docs/ko/guides/datasets)
- [지표와 채점기](/docs/ko/concepts/scorers)
- [마법사로 실행 시작](/docs/ko/guides/submit)
- [제한](/docs/ko/limits)

---

Source: https://staging.skynetml.com/docs/ko/concepts/datasets
