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


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

仝淵濤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM