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