內容概要¶
- 如何使用K折交叉驗證來搜索最優調節參數
- 如何讓搜索參數的流程更加高效
- 如何一次性的搜索多個調節參數
- 在進行真正的預測之前,如何對調節參數進行處理
- 如何削減該過程的計算代價
1. K折交叉驗證回顧¶
交叉驗證的過程
- 選擇K的值(一般是10),將數據集分成K等份
- 使用其中的K-1份數據作為訓練數據,另外一份數據作為測試數據,進行模型的訓練
- 使用一種度量測度來衡量模型的預測性能
交叉驗證的優點
- 交叉驗證通過降低模型在一次數據分割中性能表現上的方差來保證模型性能的穩定性
- 交叉驗證可以用於選擇調節參數、比較模型性能差別、選擇特征
交叉驗證的缺點
- 交叉驗證帶來一定的計算代價,尤其是當數據集很大的時候,導致計算過程會變得很慢
2. 使用GridSearchCV進行高效調參¶
GridSearchCV根據你給定的模型自動進行交叉驗證,通過調節每一個參數來跟蹤評分結果,實際上,該過程代替了進行參數搜索時的for循環過程。
from sklearn.datasets import load_iris from sklearn.neighbors import KNeighborsClassifier import matplotlib.pyplot as plt from sklearn.model_selection import GridSearchCV iris = load_iris() # create X (features) and y (response) X = iris.data y = iris.target # define the parameter values that should be searched k_range =[i for i in range(1, 31)] # create a parameter grid: map the parameter names to the values that should be searched # 下面是構建parameter grid,其結構是key為參數名稱,value是待搜索的數值列表的一個字典結構 param_grid = dict(n_neighbors=k_range) knn = KNeighborsClassifier(n_neighbors=5) # instantiate the grid # 這里GridSearchCV的參數形式和cross_val_score的形式差不多,其中param_grid是parameter grid所對應的參數 # GridSearchCV中的n_jobs設置為-1時,可以實現並行計算(如果你的電腦支持的情況下) grid = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy') # 我們可以知道,這里的grid search針對每個參數進行了10次交叉驗證,並且一共對30個參數進行相同過程的交叉驗證 grid.fit(X, y) # create a list of the mean scores only print(grid.best_estimator_)
3. 同時對多個參數進行搜索¶
這里我們使用knn的兩個參數,分別是n_neighbors和weights,其中weights參數默認是uniform,該參數將所有數據看成等同的,而另一值是distance,它將近鄰的數據賦予更高的權重,而較遠的數據賦予較低權重。
from sklearn.datasets import load_iris from sklearn.neighbors import KNeighborsClassifier import matplotlib.pyplot as plt from sklearn.model_selection import GridSearchCV iris = load_iris() # create X (features) and y (response) X = iris.data y = iris.target # define the parameter values that should be searched k_range =[i for i in range(1, 31)] weight_options=['uniform','distance'] # create a parameter grid: map the parameter names to the values that should be searched # 下面是構建parameter grid,其結構是key為參數名稱,value是待搜索的數值列表的一個字典結構 param_grid = dict(n_neighbors=k_range,weights=weight_options) knn = KNeighborsClassifier(n_neighbors=5) # instantiate the grid # 這里GridSearchCV的參數形式和cross_val_score的形式差不多,其中param_grid是parameter grid所對應的參數 # GridSearchCV中的n_jobs設置為-1時,可以實現並行計算(如果你的電腦支持的情況下) grid = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy') # 我們可以知道,這里的grid search針對每個參數進行了10次交叉驗證,並且一共對30個參數進行相同過程的交叉驗證 grid.fit(X, y) # create a list of the mean scores only print(grid.best_estimator_)
4. 使用最佳參數做出預測¶
knn = KNeighborsClassifier(n_neighbors=13, weights='uniform') knn.fit(X, y) # make a prediction on out-of-sample data knn.predict([3, 5, 4, 2])
5. 使用RandomizeSearchCV來降低計算代價¶
- RandomizeSearchCV用於解決多個參數的搜索過程中計算代價過高的問題
- RandomizeSearchCV搜索參數中的一個子集,這樣你可以控制計算代價
當你的調節參數是連續的,比如回歸問題的正則化參數,有必要指定一個連續分布而不是可能值的列表,這樣RandomizeSearchCV就可以執行更好的grid search。
