GridSearchCV,它存在的意義就是自動調參,只要把參數輸進去,就能給出最優化的結果和參數。可是這個方法適合於小數據集,一旦數據的量級上去了,很可貴出結果。這個時候就是須要動腦筋了。數據量比較大的時候能夠使用一個快速調優的方法——座標降低。它實際上是一種貪心算法:拿當前對模型影響最大的參數調優,直到最優化;再拿下一個影響最大的參數調優,如此下去,直到全部的參數調整完畢。這個方法的缺點就是可能會調到局部最優而不是全局最優,可是省時間省力,巨大的優點面前,仍是試一試吧,後續能夠再拿bagging再優化。python
一般算法不夠好,須要調試參數時必不可少。好比SVM的懲罰因子C,核函數kernel,gamma參數等,對於不一樣的數據使用不一樣的參數,結果效果可能差1-5個點,sklearn爲咱們提供專門調試參數的函數grid_search。算法
參數說明數組
class sklearn.model_selection.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=’warn’)dom
(1) estimator函數
選擇使用的分類器,而且傳入除須要肯定最佳的參數以外的其餘參數。每個分類器都須要一個scoring參數,或者score方法:estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt',random_state=10),性能
(2) param_grid學習
須要最優化的參數的取值,值爲字典或者列表,例如:param_grid =param_test1,param_test1 = {'n_estimators':range(10,71,10)}。測試
(3) scoring=None優化
模型評價標準,默認None,這時須要使用score函數;或者如scoring='roc_auc',根據所選模型不一樣,評價準則不一樣。字符串(函數名),或是可調用對象,須要其函數簽名形如:scorer(estimator, X, y);若是是None,則使用estimator的偏差估計函數。spa
(4) fit_params=None
(5) n_jobs=1
n_jobs: 並行數,int:個數,-1:跟CPU核數一致, 1:默認值
(6) iid=True
iid:默認True,爲True時,默認爲各個樣本fold機率分佈一致,偏差估計爲全部樣本之和,而非各個fold的平均。
(7) refit=True
默認爲True,程序將會以交叉驗證訓練集獲得的最佳參數,從新對全部可用的訓練集與開發集進行,做爲最終用於性能評估的最佳模型參數。即在搜索參數結束後,用最佳參數結果再次fit一遍所有數據集。
(8) cv=None
交叉驗證參數,默認None,使用三折交叉驗證。指定fold數量,默認爲3,也能夠是yield訓練/測試數據的生成器。
(9) verbose=0, scoring=None
verbose:日誌冗長度,int:冗長度,0:不輸出訓練過程,1:偶爾輸出,>1:對每一個子模型都輸出。
(10) pre_dispatch=‘2*n_jobs’
指定總共分發的並行任務數。當n_jobs大於1時,數據將在每一個運行點進行復制,這可能致使OOM,而設置pre_dispatch參數,則能夠預先劃分總共的job數量,使數據最多被複制pre_dispatch次
(11) error_score=’raise’
(12) return_train_score=’warn’
若是「False」,cv_results_屬性將不包括訓練分數
回到sklearn裏面的GridSearchCV,GridSearchCV用於系統地遍歷多種參數組合,經過交叉驗證肯定最佳效果參數。
目的
經過訓練集的訓練求出所需模型的最佳參數。
import pandas as pd from sklearn.model_selection import GridSearchCV,train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import precision_score,recall_score,f1_score,roc_auc_score,roc_curve import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore')#處理警告 data = pd.read_excel('文件路徑') data = pd.DataFrame(data) X = data.iloc[:,:-1] Y = data.iloc[:,-1] trainx,testx,trainy,testy = train_test_split(X,Y,test_size=1/3,random_state=3)#random_state至關於隨機種子 best_ting = { 'max_iter':[20,40,60,100], 'C':[0.01,0.1,1,10] } # 使用測試集對模型進行驗證,並利用GridSearchCV技術對邏輯迴歸模型進行超參調優, #網格搜索最優超參數 best_g = GridSearchCV(LogisticRegression(),best_ting,cv=5) best_g.fit(trainx,trainy) print(best_g.best_params_)#輸出最優參數 best_model = LogisticRegression(max_iter=20,C=10) best_model.fit(trainx,trainy) best_H = best_model.predict(testx) best_yH = best_model.predict_proba(testx) # 並輸出測試數據集的精確率、召回率、F1值、AUC值,畫出ROC曲線 print('精準率:',precision_score(testy,best_H)) print('召回率:',recall_score(testy,best_H)) print('F1率:',f1_score(testy,best_H)) print('AUC:',roc_auc_score(testy,best_yH[:,-1])) fpr,tpr,theta = roc_curve(testy,best_yH[:,-1]) print('fpr=\n',fpr) print('tpr=\n',tpr) print('theta=\n',theta) #畫出ROC曲線 plt.plot(fpr,tpr) plt.show()
主要用來計算ROC面積的
''
sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)
輸入:其中y_true爲真實標籤,y_score爲預測機率,或稱爲置信度。pos_label爲正類樣本標籤,通常爲1。
輸出:fpr(假正率、1-特效性)、tpr(真正率、靈敏度)、thresholds(閾值)
假正率 = 預測爲正類的負樣本/全部負類樣本,越小越好。
真正率 = 預測爲正類的正樣本/全部正類樣本,越大越好。
'''
#這個還有些不理解,在學習中..
修改於2019-07-1219:28:34
仝淵濤