# 数据集与划分

> Skynet 如何读取你的用例，并将其划分为训练集、验证集和测试集。

数据集是一张用例表。每一行是一个用例。Skynet 在这些用例上运行你的产物，为每个输出打分，并用分数比较各个版本。本页说明 Skynet 如何读取用例、列角色的作用，以及它如何把用例划分为训练集、验证集和测试集。

## 加载数据

在向导的 **输入** 步骤中，你有两个选项：

- **上传 CSV、JSON 或 Excel 文件**。Skynet 接受 `.csv`、`.json`、`.xlsx` 和 `.xls` 文件。
- **从库中选择**。使用你之前保存的数据集。

一次运行最多可以有 200,000 个用例。

关于管理已保存的数据集，请阅读[数据集](/docs/zh-Hans/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 把用例划分为三个集合：

| 集合         | 用途                                       |
| ------------ | ------------------------------------------ |
| 训练         | 引擎在这些用例上提出并测试版本。           |
| 验证（Val）  | Skynet 在这些用例上选出最佳版本。          |
| 测试         | Skynet 在这些用例上报告最终分数。          |

> [!NOTE]
> 测试用例永远不会到达引擎、提议器或契约检查。最终分数基于优化器没有见过的用例。

### 默认划分

| 成对数据数量 | 训练 | 验证 | 测试 |
| ------------ | ---- | ---- | ---- |
| 5 个或更多   | 70%  | 15%  | 15%  |
| 少于 5 个    | 85%  | 15%  | 0%   |

成对数据少于 5 个时，Skynet 不保留测试集。

### Skynet 如何计算用例数

Skynet 用最大余数法把比例换算为整数个用例。各集合的数量之和总是等于用例总数。比例大于零的集合至少分得一个用例。比例为零的集合不分得用例。

划分之前，Skynet 会打乱用例顺序。打乱使用运行的随机种子。如果你没有提供种子，Skynet 会根据用例、目标和产物生成一个。因此，如果你再次提交相同的运行，会得到相同的划分。

### 回退规则

- 成对数据少于 5 个时，Skynet 会移除测试集，并按比例缩放训练集和验证集，使两者之和为 1。
- 如果训练集为空，Skynet 把验证用例当作训练用例。
- 如果没有验证集，Skynet 在训练用例上进行选择。
- 如果没有测试集，Skynet 在验证集上报告。如果也没有验证集，则在训练集上报告。

> [!WARNING]
> Skynet 在训练集或验证集上报告的分数不是留出数据上的分数。至少使用 5 个成对数据才能获得测试集。

## 更改划分

划分区域显示 **推荐划分**。它有两种模式：

1. **使用推荐**：Skynet 使用上面的默认划分。
2. **手动选择**：你自己设置 **训练**、**验证** 和 **测试**。

在手动选择中，每个字段接受 0 到 1 之间的比例，步长为 0.05。每个字段会显示它分得的用例数。三个比例之和必须为 1。否则，向导会显示“划分比例之和必须为 1。”

## 契约样例

**指标和运行** 步骤中的契约检查会在 3 个样例用例上运行你的代码。Skynet 只从训练用例和验证用例中选取这些样例，从不从测试用例中选取。

## 相关页面

- [数据集](/docs/zh-Hans/guides/datasets)
- [指标与评分器](/docs/zh-Hans/concepts/scorers)
- [提交运行](/docs/zh-Hans/guides/submit)
- [限制](/docs/zh-Hans/limits)

---

Source: https://staging.skynetml.com/docs/zh-Hans/concepts/datasets
