0.交叉驗證
交叉驗證的基本思想是把在某種意義下將原始數據(dataset)進行分組,一部分做為訓練集(train set),另一部分做為驗證集(validation set or test set),首先用訓練集對分類器進行訓練,再利用驗證集來測試訓練得到的模型(model),以此來做為評價分類器的性能指標。
根據切分的方法不同,交叉驗證分為下面三種:
第一種是簡單交叉驗證,所謂的簡單,是和其他交叉驗證方法相對而言的。首先,我們隨機的將樣本數據分為兩部分(比如: 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
(estimator, param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True, cv=None, verbose=0, pre_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
(X, y=None, groups=None, **fit_params):訓練
get_params
(deep=True):獲取這個估計器的參數。
predict(X):用找到的最佳參數調用預估器。(直接預測每個樣本屬於哪一個類別)
predict_log_proda(X):用找到的最佳參數調用預估器。(得到每個測試集樣本在每一個類別的得分取log情況)
predict_proba(X):用找到的最佳參數調用預估器。(得到每個測試集樣本在每一個類別的得分情況)
score(X, y=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折交叉驗證。
運行結果如下:
歡迎關注我的公眾號,不定期更新機器學習原理教程!