如何在 Python 中不使用 Sklearn 將資料分割成訓練集和測試集


在機器學習或人工智慧模型領域,資料是其基石。資料處理方式決定了模型的整體效能,其中包括將資料集分割成訓練集和驗證集這一不可或缺的任務。雖然 sklearn 的 train_test_split() 函式經常被使用,但在某些情況下,Python 愛好者可能無法使用它,或者他們可能很好奇如何手動實現類似的結果。本文探討了如何在不依賴 sklearn 的情況下,將資料分割成訓練集和驗證集。我們將為此目的使用 Python 的內建庫。

示例 1:資料分割背後的原理

在深入探討細節之前,讓我們先討論一下其原理。機器學習演算法需要大量資料來學習。這些資料(訓練集)幫助模型識別模式並進行預測。但是,為了評估模型的效能,我們需要模型以前從未見過的資料。這些未經觸碰的資料是驗證集。

使用相同的資料進行訓練和驗證會導致模型過擬合——模型在訓練資料上表現出色,但在未見過的資料上卻表現不佳。因此,資料通常按 70-30 或 80-20 的比例劃分,其中較大的部分用於訓練,較小的部分用於驗證。

在 Python 中手動分割資料

我們將從一種簡單而有效的方法開始,使用 Python 的內建操作來分割資料。這裡使用的示例是整數列表,但此技術適用於任何資料型別。

假設我們有一個如下所示的資料集 data

data = list(range(1, 101))  # data is a list of integers from 1 to 100
  • 目標是將此資料分割成 80% 的訓練資料和 20% 的驗證資料。

  • 首先,我們將匯入必要的庫。

  • random 模組提供了各種生成隨機數的函式,我們將使用它來打亂我們的資料。接下來,我們將打亂我們的資料。

  • 打亂資料後,我們將將其分割成訓練集和驗證集。

split_index 指示資料被分割的點。我們將其計算為 split_ratio 和資料集大小的乘積。

最後,我們使用切片來建立訓練集和驗證資料集。

訓練資料包含從列表開頭到 split_index 的元素,驗證資料包含從 split_index 到列表末尾的元素。

示例

import random
random.shuffle(data)

split_ratio = 0.8  # We are using an 80-20 split here
split_index = int(split_ratio * len(data))

train_data = data[:split_index]
test_data = data[split_index:]

輸出

train_data = [65, 51, 8, 82, 15, 32, 11, 74, 89, 29, 50, 
34, 93, 84, 37, 7, 1, 83, 17, 24, 5, 33, 49, 90, 35, 57, 
47, 73, 46, 95, 10, 80, 59, 94, 63, 27, 31, 52, 18, 76, 
91, 71, 20, 68, 70, 87, 26, 64, 99, 42, 61, 69, 79, 12, 
3, 66, 96, 75, 30, 22, 100, 14, 97, 56, 55, 58, 28, 23, 
98, 6, 2, 88, 43, 41, 78, 60, 72, 39]

test_data = [45, 53, 48, 16, 9, 62, 13, 81, 92, 54, 21, 
38, 25, 44, 85, 19, 40, 77, 67, 4]

由於程式碼涉及資料的隨機打亂,每次執行時輸出可能會有所不同。

示例 2:使用 Numpy 分割資料

另一種無需 sklearn 即可分割資料的方法是利用 numpy 庫。Numpy 是一個強大的數值計算庫,可以用來建立陣列並有效地操作它們。

以下是如何使用 numpy 分割資料。

  • 首先,匯入 numpy 庫。然後,建立一個 numpy 陣列。

  • 打亂陣列。最後,分割陣列。

index 表示我們的資料池被分成訓練集和驗證集的點。它是透過使用預定的分割比例(在本例中為 0.8,用於 80-20 分割)和資料點的總數的乘積來獲得的。

最後一步是使用計算出的分割索引建立訓練集和測試資料集。我們為此操作使用列表切片。

示例

import numpy as np

data = np.array(range(1, 101))  
# data is a numpy array of integers from 1 to 100
np.random.shuffle(data)

split_ratio = 0.8  # We are using an 80-20 split here
split_index = int(split_ratio * len(data))

train_data = data[:split_index]
test_data = data[split_index:]

輸出

train_data = [52, 13, 87, 68, 48, 4, 34, 9, 74, 25, 
30, 38, 90, 83, 54, 45, 61, 73, 80, 14, 70, 63, 75, 
81, 97, 60, 96, 8, 43, 20, 79, 46, 50, 76, 18, 84, 
26, 31, 71, 56, 22, 88, 64, 95, 91, 78, 69, 19, 42, 
67, 77, 2, 41, 32, 11, 94, 40, 59, 17, 57, 99, 44, 
5, 93, 62, 23, 3, 33, 47, 92]

test_data = [49, 66, 7, 58, 37, 98, 100, 24, 6, 55, 
28, 16, 85, 65, 51, 35, 12, 10, 86, 29]

結論

將資料分割成訓練集和驗證集是機器學習和資料科學專案中的一個關鍵步驟。雖然 sklearn 提供了一種簡單的方法來執行此任務,但瞭解如何手動執行此操作非常重要。正如我們所展示的,這可以使用 Python 的內建操作或 numpy 庫來完成。

您選擇使用 sklearn、Python 的內建操作還是 numpy 取決於您的特定需求和限制。每種方法都有其優點和缺點。手動方法可以讓您更好地控制流程,而 sklearn 的 train_test_split() 函式更易於使用,並且包含其他功能,例如分層抽樣。

更新於:2023年8月28日

757 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告