機器學習——交叉驗證,GridSearchCV,嶺回歸


0.交叉驗證

  交叉驗證的基本思想是把在某種意義下將原始數據(dataset)進行分組,一部分做為訓練集(train set),另一部分做為驗證集(validation set or test set),首先用訓練集對分類器進行訓練,再利用驗證集來測試訓練得到的模型(model),以此來做為評價分類器的性能指標。

   交叉驗證用在數據不是很充足的時候。比如在我日常項目里面,對於普通適中問題,如果數據樣本量小於一萬條,我們就會采用交叉驗證來訓練優化選擇模型。如果樣本 大於一萬條的話,我們一般隨機的把數據分成三份,一份為訓練集(Training Set),一份為驗證集(Validation Set),最后一份為測試集(Test Set)。用訓練集來訓練模 型,用驗證集來評估模型預測的好壞和選擇模型及其對應的參數。把最終得到的模型再用於測試集,最終決定使用哪個模型以及對應參數。

  根據切分的方法不同,交叉驗證分為下面三種:   

  第一種是簡單交叉驗證,所謂的簡單,是和其他交叉驗證方法相對而言的。首先,我們隨機的將樣本數據分為兩部分(比如: 70%的訓練集,30%的測試集),然后用訓練集來訓練模型,在測試集上驗證模型及參數。接着,我們再把樣本打亂,重新選擇訓練集和測試集,繼續訓練數據和檢驗模型。最后我們選擇損失函數評估最優的模型和參數。 

   第二種是S折交叉驗證(S-Folder Cross Validation)。和第一種方法不同,S折交叉驗證會把樣本數據隨機的分成S份,每次隨機的選擇S-1份作為訓練集,剩下的1份做測試集。當這一輪完成后,重新隨機選擇S-1份來訓練數據。若干輪(小於S)之后,選擇損失函數評估最優的模型和參數。

  第三種是留一交叉驗證(Leave-one-out Cross Validation),它是第二種情況的特例,此時S等於樣本數N,這樣對於N個樣本,每次選擇N-1個樣本來訓練數據,留一個樣本來驗證模型預測的好壞。此方法主要用於樣本量非常少的情況,比如對於普通適中問題,N小於50時,我一般采用留一交叉驗證。

 

1.模型調參利器GridSearchCV(網格搜索)

  GridSearchCV能夠通過給定的參數列表,自動的幫我們選擇一個最優的參數,在數據集不大的情況下非常適合使用。函數的相關參數的含義如下:

    GridSearchCV(estimatorparam_gridscoring=Nonefit_params=Nonen_jobs=1iid=Truerefit=Truecv=Noneverbose=0pre_dispatch='2*n_jobs'error_score='raise'return_train_score=True)

Parameters:

  estimator:所使用的分類器,或者pipeline

  param_grid:值為字典或者列表,即需要最優化的參數的取值

  scoring:准確度評價標准,默認None,這時需要使用score函數;或者如scoring='roc_auc',根據所選模型不同,評價准則不同。字符串(函數名),或是可調用對象,需要其函數簽名形如:scorer(estimator, X, y);如果是None,則使用estimator的誤差估計函數。

  n_jobs:並行數,int:個數,-1:跟CPU核數一致, 1:默認值。

  pre_dispatch:指定總共分發的並行任務數。當n_jobs大於1時,數據將在每個運行點進行復制,這可能導致OOM,而設置pre_dispatch參數,則可以預先划分總共的job數量,使數據最多被復制pre_dispatch次

  iid:默認True,為True時,默認為各個樣本fold概率分布一致,誤差估計為所有樣本之和,而非各個fold的平均。

  cv:交叉驗證參數,默認None,使用三折交叉驗證。指定fold數量,默認為3,也可以是yield訓練/測試數據的生成器。

  refit:默認為True,程序將會以交叉驗證訓練集得到的最佳參數,重新對所有可用的訓練集與開發集進行,作為最終用於性能評估的最佳模型參數。即在搜索參數結束后,用最佳參數結果再次fit一遍全部數據集。

  verbose:日志冗長度,int:冗長度,0:不輸出訓練過程,1:偶爾輸出,>1:對每個子模型都輸出。

Attributes:
  best_estimator_:效果最好的分類器

  best_score_:成員提供優化過程期間觀察到的最好的評分

  best_params_:描述了已取得最佳結果的參數的組合

  best_index_:對應於最佳候選參數設置的索引(cv_results_數組的索引)。

Methods:

  decision_function:使用找到的參數最好的分類器調用decision_function。

  fit(Xy=Nonegroups=None**fit_params):訓練

  get_params(deep=True):獲取這個估計器的參數。

  predict(X):用找到的最佳參數調用預估器。(直接預測每個樣本屬於哪一個類別)

  predict_log_proda(X):用找到的最佳參數調用預估器。(得到每個測試集樣本在每一個類別的得分取log情況)

  predict_proba(X):用找到的最佳參數調用預估器。(得到每個測試集樣本在每一個類別的得分情況)

  score(Xy=None):返回給定數據上的得分,如果預估器已經選出最優的分類器。

  transform(X):調用最優分類器進行對X的轉換。

  下面我們一嶺回歸為例,運用GridSearchCV進行調參工作:

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3 import pandas as pd
 4 from sklearn.model_selection import train_test_split
 5 from sklearn.linear_model import Lasso, Ridge
 6 from sklearn.model_selection import GridSearchCV
 7 
 8 
 9 if __name__ == "__main__":
10     # pandas讀入
11     data = pd.read_csv('../data-set/Advertising.csv')
12     x = data[['TV', 'Radio', 'Newspaper']]
13     
14     y = data['Sales']
15 
16     x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1)
17     
18     #model = Lasso()
19     model = Ridge()
20 
21     alpha_can = np.logspace(-3, 2, 10)
22     lasso_model = GridSearchCV(model, param_grid={'alpha': alpha_can}, cv=5)
23     lasso_model.fit(x, y)
24     print('驗證參數:\n', lasso_model.best_params_)
25 
26     y_hat = lasso_model.predict(np.array(x_test))
27     mse = np.average((y_hat - np.array(y_test)) ** 2)  # Mean Squared Error
28     rmse = np.sqrt(mse)  # Root Mean Squared Error
29     print(mse, rmse)
30 
31     t = np.arange(len(x_test))
32     plt.plot(t, y_test, 'r-', linewidth=2, label='Test')
33     plt.plot(t, y_hat, 'g-', linewidth=2, label='Predict')
34     plt.legend(loc='upper right')
35     plt.grid()
36     plt.show()

  在上述的代碼中,np.logspace(-3, 2, 10)為返回10^-3到10^2的長度為默認10的列表,作為參數的可選值,lasso_model = GridSearchCV(model, param_grid={'alpha': alpha_can}, cv=5)中,param_grid自動參數alpha的參數列表,cv表示使用5折交叉驗證。

運行結果如下:

 

 

歡迎關注我的公眾號,不定期更新機器學習原理教程!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM