機器學習筆記——模型調參利器 GridSearchCV(網格搜索)參數的說明

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=0scoring=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

仝淵濤

相關文章
相關標籤/搜索