GridSearchCV,它存在的意義就是自動調參,只要把參數輸進去,就能給出最優化的結果和參數。但是這個方法適合於小數據集,一旦數據的量級上去了,很難得出結果。這個時候就是需要動腦筋了。數據量比較大的時候可以使用一個快速調優的方法——坐標下降。它其實是一種貪心算法:拿當前對模型影響最大的參數調優,直到最優化;再拿下一個影響最大的參數調優,如此下去,直到所有的參數調整完畢。這個方法的缺點就是可能會調到局部最優而不是全局最優,但是省時間省力,巨大的優勢面前,還是試一試吧,后續可以再拿bagging再優化。
通常算法不夠好,需要調試參數時必不可少。比如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’)
(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的誤差估計函數。
(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()
關於sklearn.metrics.roc_curve()
主要用來計算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
仝淵濤