天天看點

K折驗證交叉驗證

K折驗證交叉驗證

       交叉驗證既可以解決資料集的資料量不夠大問題,也可以解決參數調優的問題。這塊主要有三種方式:簡單交叉驗證(HoldOut檢驗)、k折交叉驗證(k-fold交叉驗證)、自助法。該文僅針對k折交叉驗證做詳解。

簡單交叉驗證

K折驗證交叉驗證

方法:将原始資料集随機劃分成訓練集和驗證集兩部分。

       比如說,将樣本按照70%~30%的比例分成兩部分,70%的樣本用于訓練模型;30%的樣本用于模型驗證。

缺點:(1)資料都隻被所用了一次,沒有被充分利用

          (2)在驗證集上計算出來的最後的評估名額與原始分組有很大關系。

 k折交叉驗證

       為了解決簡單交叉驗證的不足,提出k-fold交叉驗證。 

1、首先,将全部樣本劃分成k個大小相等的樣本子集;

2、依次周遊這k個子集,每次把目前子集作為驗證集,其餘所有樣本作為訓練集,進行模型的訓練和評估;

3、最後把k次評估名額的平均值作為最終的評估名額。在實際實驗中,k通常取10.

舉個例子:這裡取k=10,如下圖所示:

K折驗證交叉驗證

(1)先将原資料集分成10份

(2)每一将其中的一份作為測試集,剩下的9個(k-1)個作為訓練集,此時訓練集就變成了k * D(D表示每一份中包含的資料樣本數)

(3)最後計算k次求得的分類率的平均值,作為該模型或者假設函數的真實分類率

K折驗證交叉驗證

       交叉驗證的方式,要簡單于數學了解,而且具有說服性。需要謹記一點,當樣本總數過大,若使用留一法時間開銷極大(具體API和參數下面有說明)。

自主法    

       自助法是基于自助采樣法的檢驗方法。對于總數為n的樣本合集,進行n次有放回的随機抽樣,得到大小為n的訓練集。

       n次采樣過程中,有的樣本會被重複采樣,有的樣本沒有被抽出過,将這些沒有被抽出的樣本作為驗證集,進行模型驗證。

cross_val_score參數設定

sklearn.model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=’warn’, n_jobs=None, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’)
           

參數:

estimator: 需要使用交叉驗證的算法

X: 輸入樣本資料

y: 樣本标簽

groups: 将資料集分割為訓練/測試集時使用的樣本的組标簽(一般用不到)

scoring: 交叉驗證最重要的就是他的驗證方式,選擇不同的評價方法,會産生不同的評價結果。可去官方檢視詳細評價方法解釋。

具體如下:

K折驗證交叉驗證

cv: 交叉驗證折數或可疊代的次數。若估計器是一個分類器,并且y是二進制或多類,則使用StratifiedKFold(cv等價于StratifiedKFold,即cv=5 <=> cv=StratifiedKFold(n_splits=5));其他情況,就用KFold(cv=KFold(n_splits=n))。

n_jobs: 同時工作的cpu個數(-1代表全部)

verbose: 詳細程度

fit_params: 傳遞給估計器(驗證算法)的拟合方法的參數

pre_dispatch: 控制并行執行期間排程的作業數量。減少這個數量對于避免在CPU發送更多作業時CPU記憶體消耗的擴大是有用的。該參數可以是:沒有,在這種情況下,所有的工作立即建立并産生。将其用于輕量級和快速運作的作業,以避免由于按需産生作業而導緻延遲。

       一個int,給出所産生的總工作的确切數量

       一個字元串,給出一個表達式作為n_jobs的函數,如’2 * n_jobs

error_score: 如果在估計器拟合中發生錯誤,要配置設定給該分數的值(一般不需要指定)

cross_var_score使用方法:

from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsRegressor
import matplotlib.pylab as plt
train_data = pd.read_csv("E:/competitions/kaggle/House Price/train.csv")
X = pd.DataFrame(train_data["GrLivArea"].fillna(0))
y = train_data["SalePrice"]
score = []
alphas = []
for alpha in range(1,100,1):
    alphas.append(alpha)
    rdg = KNeighborsRegressor(alpha)
    sc = np.sqrt( -cross_val_score(rdg,X,y,scoring = "neg_mean_squared_error", cv = 10))
    score.append(sc.mean())
plt.plot(alphas,score)
plt.show()
           

這裡使用了neg_mean_squared_error作為評分,畫出損失——alpha的關系圖如下:

K折驗證交叉驗證

由上圖可以看到,在alpha = 23的時候,其損失是最小的。這樣便完成了選擇參數的任務。

繼續閱讀