1. 程式人生 > >機器學習:訓練集與測試集的劃分

機器學習:訓練集與測試集的劃分

機器學習中有一個問題是不可避免的,那就是劃分測試集和訓練集。為什麼要這麼做呢,當然是提高模型的泛化能力,防止出現過擬合,並且可以尋找最優調節引數。訓練集用於訓練模型,測試集則是對訓練好的模型進行評估的資料集。通常來說,訓練集和測試集是不會有交集的,常用的資料集劃分方法有以下兩種:

  • 留出法
  • k折交叉驗證法

留出法

直接將原資料集劃分為兩個互斥的資料集,即訓練集與測試集。sklearn直接提供給我們這樣的方法,便於操作

sklearn.model_selection.train_test_split(*arrays, **options)

引數

含義

test_size 測試集佔總資料的大小,以(0.0,1.0)之間的小數表示,預設值為0.25
random_state 隨機數種子:其實就是該組隨機數的編號,在需要重複試驗的時候,保證得到一組一樣的隨機數。比如你每次都填1,其他引數一樣的情況下你得到的隨機陣列是一樣的。但填0或不填,每次都會不一樣。

通過構造一個二維陣列實現函式的功能

import numpy as np
from sklearn.model_selection import train_test_split

#構造一個X是5行2列的二維陣列,y為5個元素的列表
X, y = np.random.randint(10,size=(5,2)), list(range(5))
X
#array([[8, 4],
        [3, 0],
        [9, 0],
        [5, 9],
        [0, 7]])

y
#[0, 1, 2, 3, 4]

#將X,y劃分為訓練集和測試集,測試集的比例為0.3
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=23)
X_train
#array([[9, 0],
        [8, 4],
        [5, 9]])

X_test
#array([[3, 0],
        [0, 7]])

y_train
#[2, 0, 3]

y_test
#[1, 4]

可見結果是符合設定要求的,運用時也很簡單,只需將劃分後的各部分資料集弄清楚不混淆即可。sklearn.model_selection.train_test_split

k折交叉驗證法(當k為樣本數量時即為留一法)

K折交叉驗證,這是將資料集分成K份,所謂K折就是將資料集通過K次分割,使得所有資料既在訓練集出現過,又在測試集出現過。當然,每次分割中不會有重疊,即不會有交集,相當於無放回抽樣。

sklearn.model_selection.KFold(n_splits=’warn’, shuffle=False, random_state=None)

引數 含義
n_split 摺疊數量,最少為2。預設為3。
shuffle 是否在分割之前對資料進行洗牌。預設為false
random_state 隨即種子數。

同樣的通過構造陣列實現函式的功能瞭解函式的使用方法:

from sklearn.model_selection import KFold
import numpy as np

#定義X,y
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 3, 4])
kf = KFold(n_splits=4)

#列印摺疊後分別作為訓練集和測試集在原資料集上的索引
for train_index, test_index in kf.split(X):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

#TRAIN: [1 2 3] TEST: [0]
#TRAIN: [0 2 3] TEST: [1]
#TRAIN: [0 1 3] TEST: [2]
#TRAIN: [0 1 2] TEST: [3]

可以看到,在最後的結果中,並不會出現兩次同樣的資料。這樣可以保證劃分後的資料每一份都能作為一次測試集。(需要注意的是,這裡用的是原資料集的索引,而不是直接引用資料)sklearn.model_selection.KFold

這兩個方法的主要區別在於,留出法中測試集對應的模型與訓練的模型相比可能具有較大差距,降低保真性,這種沒有較好的解決辦法,只能人工去調整正負樣本的比例,保證訓練集與測試集正負樣本比例大致相同,常見做法是將大約2/3~4/5的樣本用於訓練,剩餘樣本留作測試。

k折交叉驗證法不受隨機樣本劃分方式的影響,訓練出來的模型與總的資料集模型很相似。缺點在於計算成本高,資料集小的話還可以,當資料規模很大時,計算時間以及成本就相當驚人了。一般來說,根據經驗我們一般選擇k=5或10。