《scikit learn》交叉驗證

2021-10-18 08:33:02 字數 3195 閱讀 6864

當我們訓練模型的時候,首先得要有資料進行訓練。

我們擁有一定的資料集的時候,我們不會用所有資料去訓練,因為這樣我們會不知道訓練出的模型的繁華能力如何,而是習慣於劃分為訓練資料集和測試資料集,在訓練集上訓練處模型,拿到測試集去做測試。而這種方式也不一定是最好的,因為,這種方式選擇資料集是隨機的,也許我們調的引數只是該訓練集下是最優的,或許只是在特定的訓練集和測試集是最有的,換了個樣本集,或者是劃分出的訓練集就不是。

為了避免這種因樣本選擇帶來的隨機性影響,我們需要額外設定乙個驗證集,當模型訓練完成以後,先在驗證集上對模型進行評估,然後選擇評估分數最高的模型,再在測試集上進行最終的測試

這是比較標準的模型評估過程,但是這也不是最優的辦法。雖然驗證集的設定可以有效避免測試集出現過度擬合的情況,但是現在元資料被分為 3 部分:訓練集、驗證集和測試集,訓練集的資料量會大大減少,這可能造成訓練模型的效果很差。另外,由於驗證集和測試集是一次選擇,所以最後的模型評估結果有很大的隨機性。

於是我們便引入了交叉驗證(cross-validation)

交叉驗證(cross-validation)多次選擇測試集做評估,有效避免了隨機性帶來的誤差。而且交叉驗證不需要選擇驗證集,這樣就避免了資料的浪費,使訓練集中有足夠的樣本數量。

交叉驗證最基本的方法是 k折交叉驗證(k-fold cross validation),原理如圖

黑色是測試資料集,白色是訓練資料集合。

它將原始資料分成k組(k-fold),將每個子集資料分別做一次驗證集,其餘的k-1組子集資料作為訓練集,這樣會得到k個模型。這k個模型分別在驗證集中評估結果,最後的誤差mse(mean squared error)加和平均就得到交叉驗證誤差。

測試**如下:

交叉驗證唯一的缺點就是計算代價相對較高。實現交叉驗證可以呼叫 scikit 中提供的 cross_val_score 輔助函式。

from sklearn.datasets import load_boston

from sklearn.model_selection import cross_val_score

from sklearn.tree import decisiontreeregressor

boston = load_boston(

)# 這裡使用boston資料集

regressor = decisiontreeregressor(random_state=0)

res = cross_val_score(regressor, boston.data, boston.target, cv=10)

# 預設是r平方分數

print

(res)

print

(res.mean())

# 一般用這些模型score的平均值來作為總的k折交叉驗證評價

regressor2 = decisiontreeregressor(random_state=0)

res = cross_val_score(regressor2, boston.data, boston.target, cv=10,

scoring=

"neg_mean_squared_error"

)# 指定為負的均方差分數

print

(res)

print

(res.mean())

# 一般用這些模型score的平均值來作為總的k折交叉驗證評價

當我們把測試資料分成10分的時候,會有10個評估分數,預設是r平方分數,可以自己指定成負的均方差。一般把這k個結果的平均值作為評估的指標。

也就是說,當我們有了一部分資料集,劃分出了訓練集和測試集,辛辛苦苦調了一些引數,比如超引數這些,最大深度,最小劃分節點啊,評估方式啊之類的。在訓練集和測試集上表現很好也可能是過擬合了,也許換了個資料集和劃分集合就表現很差,為了打消這種由於樣本劃分導致的隨機性,我們一般使用交叉驗證,經過多次不同的劃分,訓練出多個引數模型,取它的平均值作為引數模型的衡量指標,更具有說服力。之後的博文會講解使用交叉驗證來選擇最優的引數。

至於訓練處的k個模型嘛,可以做一些簡單的結果合成,我們可以對每個子模型做平均,取多數等操作,這樣會更加穩定。如下例項:

from sklearn.datasets import load_boston

from sklearn.model_selection import cross_validate

from sklearn.tree import decisiontreeregressor

import numpy as np

cv_n =

10boston = load_boston(

)# 這裡使用boston資料集

regressor = decisiontreeregressor(random_state=0)

cv_results = cross_validate(estimator=regressor, x=boston.data, y=boston.target, cv=cv_n

, return_estimator=

true

)print

(cv_results[

'test_score'])

# print(boston.target)

result = np.zeros(

len(boston.data)

)for i in

range

(cv_n)

: reg = cv_results[

'estimator'

][i]

result += reg.predict(boston.data)

result = result / cv_n # 取多個模型**的平均值

print

(result - boston.target)

# 看看**的差異,大部分應該是非常接近於0

這段**展示了通過交叉驗證得到了k個子模型,分別對資料進行**,便可以得到乙個整體評估的結果。

scikit learning 交叉驗證

import numpy as np from sklearn import datasets from sklearn.cross validation import train test split from sklearn.neighbors import kneighborsclassifi...

交叉驗證(cross validation)

交叉驗證是資料分析時模型選擇的方法之一,將資料集分為三份,分別為訓練集 training set 驗證集 valication set 和測試集 test set 分別功能為訓練模型,選擇模型和對學習方法的評估。其演算法的思想為重複的使用資料,使得模型的精度越來越高。交叉驗證的方法有以下三種 1.簡...

交叉驗證(Cross validation

交叉驗證 cross validation 交叉驗證用於防止模型過於複雜而引起的過擬合 作用 如何交叉驗證 我這裡主要介紹k交叉驗證 1 將資料集分成k份 2 對於每乙個模型 拿多項式回歸舉例,m 2為乙個模型,m 3為乙個模型。我們主要就是尋找最好的m for j 1,2,k 將除第j份的所有資料...