机器学习之网格搜索(GridSearch)及参数说明,实例演示
一)GridSearchCV簡介
網格搜索(GridSearch)用于選取模型的最優超參數。獲取最優超參數的方式可以繪制驗證曲線,但是驗證曲線只能每次獲取一個最優超參數。如果多個超參數有很多排列組合的話,就可以使用網格搜索尋求最優超參數的組合。
網格搜索針對超參數組合列表中的每一個組合,實例化給定的模型,做cv次交叉驗證,將平均得分最高的超參數組合作為最佳的選擇,返回模型對象。
GridSearchCV的sklearn官方網址:
http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV
二)sklearn.model_selection.GridSearchCV參數詳解
sklearn.model_selection.GridSearchCV( estimator, param_grid, scoring=None,n_jobs=None,iid=’warn’, refit=True, cv=’warn’, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’, return_train_score=False)(1) estimator
選擇使用的分類器,并且傳入除需要確定最佳的參數之外的其他參數。
(2) param_grid
需要最優化的參數的取值,值為字典或者列表。
(3) scoring=None
模型評價標準,默認None。
根據所選模型不同,評價準則不同。比如scoring=”accuracy”。
如果是None,則使用estimator的誤差估計函數。
https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter (官方文檔)
Scoring的參數,如下圖:
| Scoring | Function | Comment |
| Classification | ||
| ‘accuracy’ | metrics.accuracy_score | |
| ‘average_precision’ | metrics.average_precision_score | |
| ‘f1’ | metrics.f1_score | for binary targets |
| ‘f1_micro’ | metrics.f1_score | micro-averaged |
| ‘f1_macro’ | metrics.f1_score | macro-averaged |
| ‘f1_weighted’ | metrics.f1_score | weighted average |
| ‘f1_samples’ | metrics.f1_score | by multilabel sample |
| ‘neg_log_loss’ | metrics.log_loss | requires predict_proba support |
| ‘precision’ etc. | metrics.precision_score | suffixes apply as with ‘f1’ |
| ‘roc_auc’ | metrics.roc_auc_score | |
| ‘recall’ etc. | metrics.recall_score | suffixes apply as with ‘f1’ |
| Clustering | ||
| ‘adjusted_rand_score’ | metrics.adjusted_rand_score | |
| Regression | ||
| ‘neg_mean_absolute_error’ | metrics.mean_absolute_error | |
| ‘neg_mean_squared_error’ | metrics.mean_squared_error | |
| ‘neg_median_absolute_error’ | metrics.median_absolute_error | |
| ‘r2’ | metrics.r2_score |
默認True,為True時,默認為各個樣本fold概率分布一致,誤差估計為所有樣本之和,而非各個fold的平均。
(6) refit=True
默認為True,程序將會以交叉驗證訓練集得到的最佳參數,重新對所有可用的訓練集與開發集進行,作為最終用于性能評估的最佳模型參數。即在搜索參數結束后,用最佳參數結果再次fit一遍全部數據集。
(7) cv=None
交叉驗證參數,默認None,使用三折交叉驗證。
(8) verbose=0,
verbose:日志冗長度
0:不輸出訓練過程,
1:偶爾輸出,>1:對每個子模型都輸出。
(9) pre_dispatch=‘2*n_jobs’
指定總共分發的并行任務數。當n_jobs大于1時,數據將在每個運行點進行復制,這可能導致OOM,而設置pre_dispatch參數,則可以預先劃分總共的job數量,使數據最多被復制pre_dispatch次
三)以鳶尾花數據集為例,基于網格搜索得到最優模型
import numpy as np import sklearn.model_selection as ms import sklearn.svm as svm #導入svm函數 from sklearn.datasets import load_iris #導入鳶尾花數據 iris = load_iris() x = iris.data y = iris.target # 可以看到樣本大概分為三類 print(x[:5]) print(y)out:
[[5.1 3.5 1.4 0.2][4.9 3. 1.4 0.2][4.7 3.2 1.3 0.2][4.6 3.1 1.5 0.2][5. 3.6 1.4 0.2]] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2] # 基于svm 實現分類 model = svm.SVC(probability=True) # 基于網格搜索獲取最優模型 params = [{'kernel':['linear'],'C':[1,10,100,1000]},{'kernel':['poly'],'C':[1,10],'degree':[2,3]},{'kernel':['rbf'],'C':[1,10,100,1000], 'gamma':[1,0.1, 0.01, 0.001]}] model = ms.GridSearchCV(estimator=model, param_grid=params, cv=5) model.fit(x, y) # 網格搜索訓練后的副產品 print("模型的最優參數:",model.best_params_) print("最優模型分數:",model.best_score_) print("最優模型對象:",model.best_estimator_)out:
模型的最優參數: {'C': 1, 'kernel': 'linear'} 最優模型分數: 0.98 最優模型對象: SVC(C=1, cache_size=200, class_weight=None, coef0=0.0,decision_function_shape='ovr', degree=3, gamma='auto_deprecated',kernel='linear', max_iter=-1, probability=True, random_state=None,shrinking=True, tol=0.001, verbose=False) # 輸出網格搜索每組超參數的cv數據 for p, s in zip(model.cv_results_['params'],model.cv_results_['mean_test_score']):print(p, s)out:
{'C': 1, 'kernel': 'linear'} 0.98 {'C': 10, 'kernel': 'linear'} 0.9733333333333334 {'C': 100, 'kernel': 'linear'} 0.9666666666666667 {'C': 1000, 'kernel': 'linear'} 0.9666666666666667 {'C': 1, 'degree': 2, 'kernel': 'poly'} 0.9733333333333334 {'C': 1, 'degree': 3, 'kernel': 'poly'} 0.9666666666666667 {'C': 10, 'degree': 2, 'kernel': 'poly'} 0.9666666666666667 {'C': 10, 'degree': 3, 'kernel': 'poly'} 0.9666666666666667 {'C': 1, 'gamma': 1, 'kernel': 'rbf'} 0.9666666666666667 {'C': 1, 'gamma': 0.1, 'kernel': 'rbf'} 0.98 {'C': 1, 'gamma': 0.01, 'kernel': 'rbf'} 0.9333333333333333 {'C': 1, 'gamma': 0.001, 'kernel': 'rbf'} 0.9133333333333333 {'C': 10, 'gamma': 1, 'kernel': 'rbf'} 0.9533333333333334 {'C': 10, 'gamma': 0.1, 'kernel': 'rbf'} 0.98 {'C': 10, 'gamma': 0.01, 'kernel': 'rbf'} 0.98 {'C': 10, 'gamma': 0.001, 'kernel': 'rbf'} 0.9333333333333333 {'C': 100, 'gamma': 1, 'kernel': 'rbf'} 0.94 {'C': 100, 'gamma': 0.1, 'kernel': 'rbf'} 0.9666666666666667 {'C': 100, 'gamma': 0.01, 'kernel': 'rbf'} 0.98 {'C': 100, 'gamma': 0.001, 'kernel': 'rbf'} 0.98 {'C': 1000, 'gamma': 1, 'kernel': 'rbf'} 0.9333333333333333 {'C': 1000, 'gamma': 0.1, 'kernel': 'rbf'} 0.9533333333333334 {'C': 1000, 'gamma': 0.01, 'kernel': 'rbf'} 0.9666666666666667 {'C': 1000, 'gamma': 0.001, 'kernel': 'rbf'} 0.98四)疑問
我在看其他博客的時候,別人有提到說:“網格搜索這個方法適合于小數據集,一旦數據的量級上去了,就很難得出結果。這個時候可以使用一個快速調優的方法——坐標下降。拿當前對模型影響最大的參數調優,直到最優化;再拿下一個影響最大的參數調優,如此下去,直到所有的參數調整完畢。這個方法的缺點就是可能會調到局部最優而不是全局最優,但是省時間省力。” 我不太明白這個小數據集,它的體量是什么范圍,如果你知道,不妨留言告訴我,謝謝。
總結
以上是生活随笔為你收集整理的机器学习之网格搜索(GridSearch)及参数说明,实例演示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python图片ocr识别手写印刷体中英
- 下一篇: FPGA测试方法以Mentor工具为例