驗證集既不能通過直接將泛化誤差作為了解模型泛化能力的訊號,因為在部署環境和訓練模型之間往復,代價很高,也不能使用模型對訓練資料集的擬合程度來作為了解模型泛化能力的訊號,因為我們獲得的資料往往不乾淨。
更好的方式就是將資料分割成兩部分:訓練集和測試集。我們可以使用訓練集的資料來訓練模型,然後用測試集上的誤差作為最終模型在應對現實場景中的泛化誤差。有了測試集,我們想要驗證模型的最終效果,只需將訓練好的模型在測試集上計算誤差,即可認為此誤差即為泛化誤差的近似,我們只需讓我們訓練好的模型在測試集上的誤差最小即可。
不同的模型與模型之間的對比
我們將資料集劃分為訓練集和測試集,我們讓模型在訓練集上進行訓練,然後在測試集上來近似模型的泛化能力。我們如果想要挑選不同的模型的話,可以讓兩個模型分別在訓練集上訓練,然後將兩個訓練好的模型分別在測試集上進行測試,由於我們把測試集上的誤差近似近似為泛化誤差,所以我們自然可以選擇在測試集上誤差小的模型作為最終我們要選擇的泛化能力強的模型。
純隨機的取樣方式
採用純隨機的取樣方式,這種方式對於大量資料集以及對於目標值分布均勻的情況是可行的
from sklearn.model_selection import train_test_split
#data:需要進行分割的資料集#random_state:設定隨機種子,保證每次執行生成相同的隨機數#test_size:將資料分割成訓練集的比例
train_set, test_set = train_test_split(data, test_size=
0.2, random_state=
42)
分層劃分
比如對於分類任務,我們訓練乙個二值分類器,可能資料中包含大量的正例樣本,僅僅包含10%的反例樣本,此時的標籤分布很不均勻,如果我們通過隨機取樣的方式,極端情況下可能將正例樣本都劃分到訓練集上,而反例樣本恰好都分到測試集,這樣訓練出來的模型,效果一定不會太好,所以我們需要採用分層取樣的方式進行劃分資料集,也就是說保證訓練集中既包含一定比例的正例樣本又要包含一定比例的負例樣本。
from sklearn.model_selection import stratifiedshufflesplit
import numpy as np
x = np.array([[
1,2]
,[3,
4],[
1,2]
,[3,
4]])
y = np.array([0
,0,1
,1])
split = stratifiedshufflesplit(n_splits=
3, test_size=
0.5, random_state=0)
print
(split)
for train_index, test_index in split.split(x, y)
: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]
print
(len
(x_train)
,len
(x_test)
)# doctest: +ellipsis# stratifiedshufflesplit(n_splits=3, random_state=0, ...)
'''stratifiedshufflesplit(n_splits=3, random_state=0, test_size=0.5,train_size=none)train: [1 2] test: [3 0]train: [0 2] test: [1 3]train: [0 2] test: [3 1]''
from sklearn.model_selection import stratifiedshufflesplit
split = stratifiedshufflesplit(n_splits =
1,test_size =
0.2,random_state =42)
#根據mnist['target']來進行分層取樣
for train_index,test_index in split.split(data,data[:,
-1])
: train_set = data[train_index,:]
test_set = data[test_index,:]
print
(len
(train_set)
,len
(test_set)
)
n_splits:分割迭代的次數,如果我們要劃分訓練集和測試集的話,將其設定為1即可;例子test_size:分割測試集的比例;
random_state:設定隨機種子;
使用隨機取樣方式劃分資料集
#使用隨機取樣方式劃分資料集
from sklearn.model_selection import train_test_split
import numpy as np
data = np.hstack(
(x_data,y_data)
)#先將資料集進行拼接,要不然我們只針對樣本進行取樣的話,會找不到對應的標籤的
train_set,test_set = train_test_split(data,test_size =
0.2,random_state =42)
print
(len
(train_set)
,len
(test_set)
)
使用分層取樣的方式分割資料集
#使用分層取樣的方式分割資料集:
from sklearn.model_selection import stratifiedshufflesplit
split = stratifiedshufflesplit(n_splits =
1,test_size =
0.2,random_state =42)
#根據mnist['target']來進行分層取樣
for train_index,test_index in split.split(data,data[:,
-1])
: train_set = data[train_index,:]
test_set = data[test_index,:]
print
(len
(train_set)
,len
(test_set)
)
劃分資料集檢視資料樣本分層情況
#將分割後的訓練資料轉換為dataframe
#這裡的引數data可以是分割之後的訓練集或者測試集
train_data = pd.dataframe(train_set)
#快速檢視對資料的描述
train_data.info(
)#檢視各個類別的比例
print
(train_data[
784]
.value_counts()/
len(train_data)
)# 分層取樣出的10個類別所佔的比例和原資料中的10個類別所佔的比例很接近。
我們使用測試集作為泛化誤差的近似,所以不到最後是不能將測試集的資訊洩露出去的,就好比考試一樣,我們平時做的題相當於訓練集,測試集相當於最終的考試,我們通過最終的考試來檢驗我們最終的學習能力,將測試集資訊洩露出去,相當於學生提前知道了考試題目,那最後再考這些提前知道的考試題目,當然代表不了什麼,你在最後的考試中得再高的分數,也不能代表你學習能力強。而如果通過測試集來調節模型,相當於不僅知道了考試的題目,學生還都學會怎麼做這些題了(因為我們肯定會人為的讓模型在測試集上的誤差最小,因為這是你調整超引數的目的),那再拿這些題考試的話,人人都有可能考滿分,但是並沒有起到檢測學生學習能力的作用。原來我們通過測試集來近似泛化誤差,也就是通過考試來檢驗學生的學習能力,但是由於資訊洩露,此時的測試集即考試無任何意義,現實中可能學生的能力很差。所以,我們在學習的時候,老師會準備一些小測試來幫助我們差缺補漏,這些小測試也就是要說的驗證集。我們通過驗證集來作為調整模型的依據,這樣不至於將測試集中的資訊洩露。
我們將資料劃分訓練集、驗證集和測試集。在訓練集上訓練模型,在驗證集上評估模型,一旦找到的最佳的引數,就在測試集上最後測試一次,測試集上的誤差作為泛化誤差的近似。
訓練集 驗證集和測試集
訓練集 驗證集和測試集這三個名詞在機器學習領域極其常見,但很多人並不是特別清楚,尤其是後兩個經常被人混用。在有監督 supervise 的機器學習中,資料集常被分成2 3個,即 訓練集 train set 驗證集 validation set 測試集 test set ripley,b.d 1996...
訓練集 驗證集 測試集
訓練集loss 驗證集loss 測試集loss 乙個好的網路,二者的差距應該是很低的。但一般情況下因為網路不可避免地存在一定程度上的過擬合,所以肯定是train loss低於test lost,但如果低太多,就得考慮是過擬合的問題還是因為樣本的特徵空間不統一的問題。驗證集基本是在每個epoch完成後...
訓練集,驗證集,測試集
普通引數就是可以被梯度下降所更新的,也就是訓練集所更新的引數。超引數是指訓練開始之前設定的引數,不在梯度下降的更新範圍內,比如網路層數 網路節點數 迭代次數 學習率等等 1.訓練集 確定模型後,用於訓練普通引數 2.驗證集 交叉驗證集cv 驗證集在每個epoch訓練完成後,用來測試一下當前模型的準確...