# 數據集同分割

> Skynet 點樣讀取你嘅案例，再分成訓練、驗證同測試。

數據集係一張案例表。每一列係一個案例。Skynet 會喺案例上運行你嘅成品、幫每個輸出評分，再用分數比較唔同版本。呢頁解釋 Skynet 點樣讀取案例、欄位角色有乜作用，同埋佢點樣將案例分割成訓練、驗證同測試集。

## 載入數據

喺精靈嘅 **輸入** 步驟，你有兩個選擇：

- **上載 CSV、JSON 或 Excel 檔案**。Skynet 接受 `.csv`、`.json`、`.xlsx` 同 `.xls` 檔案。
- **由資料庫揀**。用一個你之前儲存咗嘅數據集。

一次運行最多可以有 200,000 個案例。

想管理已儲存嘅數據集，請睇 [準備數據集](/docs/yue/guides/datasets)。

## 欄位角色

喺 **點樣讀取資料** 下面，幫每一欄設定一個角色：

| 角色   | Skynet 點樣處理呢一欄                              |
| ------ | -------------------------------------------------- |
| 輸入   | 將值放入 `input`，由你嘅運行程式碼接收             |
| 輸出   | 將值放入 `expected`，由你嘅指標接收                |
| 略過   | 唔用呢一欄                                         |

每一欄亦有一個類型：**文字** 或者 **圖片**。

只可以有一欄係輸出欄。如果你將第二欄設做輸出，第一欄就會變成略過。

### 你嘅程式碼會收到乜

Skynet 會為每一列建立一個案例：

- `input` 係一個 dict。每個輸入欄都有一個 key。
- `expected` 係一個得一個 key 嘅 dict：key 就係輸出欄嘅名稱。

以呢張表為例：

| 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 會打亂案例次序。打亂用運行嘅 seed。如果你冇畀 seed，Skynet 會由案例、目標同成品產生一個。所以如果你再提交同一個運行，你會得到同一個分割。

### 後備規則

- 如果少過 5 對，Skynet 會移除測試集，並按比例調整訓練同驗證，令佢哋加埋等於 1。
- 如果訓練集係空，Skynet 會用驗證案例做訓練。
- 如果冇驗證集，Skynet 會喺訓練案例上揀選。
- 如果冇測試集，Skynet 會喺驗證集上報告。如果連驗證集都冇，就喺訓練集上報告。

> [!WARNING]
> Skynet 喺訓練或者驗證集上報告嘅分數，唔係預留數據上嘅分數。最少用 5 對，先會有測試集。

## 改分割

分割部分會顯示 **建議切分比例**。佢有兩個模式：

1. **使用建議設定**：Skynet 用上面嘅預設分割。
2. **手動選擇**：你自己設定 **訓練**、**驗證** 同 **測試**。

喺手動選擇入面，每個欄位接受 0 至 1 嘅比例，每格 0.05。每個欄位會顯示佢分到幾多個案例。三個比例加埋一定要等於 1。如果唔係，精靈會顯示「劃分比例加埋要等於 1。」

## 合約示例

**指標同執行** 步驟嘅合約檢查，會喺 3 個示例案例上運行你嘅程式碼。Skynet 只會由訓練同驗證案例攞呢啲示例，永遠唔會由測試集攞。

## 相關頁面

- [準備數據集](/docs/yue/guides/datasets)
- [指標同評分器](/docs/yue/concepts/scorers)
- [用精靈開始運行](/docs/yue/guides/submit)
- [限制](/docs/yue/limits)

---

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