機器學習:網格搜索和交叉驗證

一、網格搜索

1. 超參數的定義

在機器學習中,超參數是在開始學習過程之前設置值的參數,而不是通過訓練得到的參數數據。

比如在使用梯度下降法的神經網絡中,學習率alpha就是一個超參數。

通常情況下,需要對超參數進行優化,給學習機選擇一組最優超參數,以提高學習的性能和效果。

2.什麼是網格搜索

瞭解了超參數的定義,網格搜索就可以很容易理解。

簡單來講,網格搜索是一種調參手段,一般是調超參數。它利用的是一種十分簡單暴力的方法:窮舉搜索。在所有候選的參數選擇中,通過循環遍歷,嘗試每一種可能性,表現最好的參數就是最終的結果。當然這裏候選的參數還是要人爲地給出。

比如在SVC模型中我們有C和gamma兩個超參數。它們的候選集如下:

在這裏插入圖片描述
我們看到不同的參數組合形成了一張表,每一格子代表了一組參數。遍歷所有格子的參數的過程就是網格搜索,這正是網格搜索名字的來源。

3.網格搜索實現

基於網格搜索的簡單邏輯,我們可以很容易實現,並找到最好的超參數。

####   grid search start
best_score = 0
for gamma in [0.001,0.01,0.1,1,10,100]:
    for C in [0.001,0.01,0.1,1,10,100]:
        svm = SVC(gamma=gamma,C=C)#對於每種參數可能的組合,進行一次訓練;
        svm.fit(X_train,y_train)
        score = svm.score(X_test,y_test)
        if score > best_score:#找到表現最好的參數
            best_score = score
            best_parameters = {'gamma':gamma,'C':C}
####   grid search end

事實上,在sklearn裏面實現了網格搜索的模塊,我們使用時可以直接調用。這也是考慮到當參數較多時,需要寫多個for,較爲累贅。

下面是一個使用網格搜索找到Lasso迴歸的最好的參數的例子。

from sklearn.linear_model import Lasso
from sklearn.model_selection import GridSearchCV
parameters= {'alpha':[0.0001,0.0009,0.001,0.002,0.003,0.01,0.1,1,10,100]}

lasso=Lasso()
lasso_reg=GridSearchCV(lasso, param_grid=parameters, scoring='neg_mean_squared_error', cv=15)
lasso_reg.fit(x_train,y_train)

print('The best value of Alpha is: ',lasso_reg.best_params_)

GridSearchCV的各參數解釋如下:

GridSearchCV(
  estimator,  #估計器,即模型
  param_grid,  #參數網格
  scoring=None, #評分方法
  n_jobs=None,  #並行的作業數,不常用
  refit=True,  是否refit最優參數的estimator
  cv=None,   設定幾折交叉驗證,None的話採用5折交叉驗證
  verbose=0,  是否顯示處理過程的信息,數值越高,信息越多
  pre_dispatch=‘2*n_jobs’,  控制並行期間分派的作業數量執行。減少這個數字可以有效地避免分配更多作業時內存消耗激增,比cpu能處理的還要多。
  error_score=np.nan,  當錯誤發生時的評分
  return_train_score=False 如果爲“False”,“cv_results_”屬性將不包括訓練分數。計算訓練分數是爲了瞭解不同的參數設置如何影響過擬合/不擬合的權衡。然而,計算訓練集上的分數可能會有很高的計算成本,並且不需要嚴格地選擇能產生最佳泛化性能的參數。 )

最後我們可以通過lasso_reg.best_params_查看最好的參數。

二、交叉驗證 Cross Validation

事實上,GridSearchCV中的CV就是指的是Cross Validation,即交叉驗證。

那什麼是交叉驗證呢?

1.簡單的交叉驗證

簡單的交叉驗證就是將訓練數據進一步劃分爲訓練集和驗證集,使用驗證集調整模型的超參數和用於對模型能力進行初步的評估。
在這裏插入圖片描述

值得注意的是調整模型的超參數這一個作用,在網格搜索的交叉驗證沒有體現。這裏驗證集的作用是進行評估。

那一般什麼情況下可以用交叉驗證調整模型的超參數?
 一般來講調整模型的超參數是在確定了一組初始參數後,在訓練過程中人工的去調整。
 一般在訓練時,幾個epochs結束後會跑一次驗證集看看效果。(注意epochs的個數,驗證得太頻繁會影響訓練速度)
 這樣做的第一個好處是,可以及時發現模型或者參數的問題,比如mAP不增長或者增長很慢等情況,這時可以及時終止訓練,重新調參或者調整模型,而不需要等到訓練結束。一般來講,我們會隔一段時間保存神經網絡的參數,稱之爲checkpoints,當我們中止訓練後重新開始的時候,可以從checkpoints中恢復網絡的權重,並且以根據驗證集的情況進行調整後的超參數進行訓練。
 另外一個好處是驗證模型的泛化能力,如果在驗證集上的效果比訓練集上差很多,就該考慮模型是否過擬合了。當察覺到有過擬合的傾向是,我們可以停止訓練,這種策略稱之爲早停(Early Stopping)。同時,還可以通過驗證集對比不同的模型。在一般的神經網絡中, 我們用驗證數據集去尋找最優的網絡深度(number of hidden layers),或者決定反向傳播算法的停止點或者在神經網絡中選擇隱藏層神經元的數量;

關於訓練集、驗證集、測試集:詳見這裏

簡單交叉驗證的優缺點:
(1)優點:
 處理簡單,只需隨機把原始數據分爲兩組即可

(2)缺點:
 但沒有達到交叉的思想,由於是隨機的將原始數據分組,所以最後驗證集分類準確率的高低與原始數據的分組有很大的關係,得到的結果並不具有說服性。

2.多折交叉驗證

上面我們提到5折交叉驗證,下面介紹它是怎樣的交叉驗證。

K折交叉驗證(K-fold Cross Validation, K-CV)
在這裏插入圖片描述
將原始訓練集均分爲K組,讓每一個子集都做一次驗證集,其餘的K-1個子集作爲訓練集。這樣會得到K個模型,用這K個模型最終的驗證集的分類準確率的平均數作爲此K-CV下分類器的性能指標。K一般大於等於2,實際操作時一般從3開始取,只有在原始數據集合數據量小的時候纔會嘗試取2。

3.留一交叉驗證(Leave-One-Out Cross Validation, LOO-CV)

在數據缺乏的情況下使用,如果設原始數據有N個樣本,那麼LOO-CV就是N-CV,即每個樣本單獨作爲驗證集,其餘的N-1個樣本作爲訓練集,故LOO-CV會得到N個模型,用這N個模型最終的驗證集的分類準確率的平均數作爲此下LOO-CV分類器的性能指標。

LOO-CV的優缺點
(1)優點:
 i.每一回閤中幾乎所有的樣本皆用於訓練模型,因此最接近原始樣本的分佈,這樣評估所得的結果比較可靠。
 ii.實驗過程中沒有隨機因素會影響實驗數據,確保實驗過程是可以被複制的。

(2)缺點:
 i.計算成本高,需要建立的模型數量與原始數據樣本數量相同。當數據集較大時幾乎不能使用。

三、參考資料

【1】https://blog.csdn.net/weixin_40475450/article/details/80578943
【2】https://www.jianshu.com/p/55b9f2ea283b

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章