4.0 任务说明
使用网格搜索法对7个模型进行调优(调参时采用五折交叉验证的方式),并进行模型评估。
4.1 网格搜索与K折验证
网格搜索算法是一种通过遍历给定的参数组合来优化给定模型性能的方法。我们可以直接调用gridsearchcv()函数实现对给定数据集和模型的基于k折验证的网格搜索方法。
函数如下:
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方法。
(2)param_grid
需要最优化的参数的取值,值为字典或者列表。
(3)scoring=None
模型评价标准,默认None,这时需要使用score函数;或者如scoring='roc_auc',根据所选模型不同,评价准则不同。
(4) cv=None
交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3。
常用方法和属性:
grid.fit():运行网格搜索
cv_results(以前叫_grid_scores_):给出不同参数情况下的评价结果
best_params_:描述了已取得最佳结果的参数的组合
best_score_:提供优化过程期间观察到的最好的评分
调用实例,我这里以决策树作示例:
from sklearn.model_selection import GridSearchCV,KFold
from sklearn.metrics import make_scorer, fbeta_score, accuracy_score
clf = tree.DecisionTreeClassifier(random_state=80)
k_fold = KFold(n_splits=5)
params = {'max_depth':range(1,10),'criterion':np.array(['entropy','gini'])}
scoring_fnc = make_scorer(accuracy_score)
grid = GridSearchCV(clf, param_grid=params,scoring=scoring_fnc,cv=k_fold)
grid = grid.fit(x_train, y_train)
然后看看最佳模型属性值:
cv_results=grid.cv_results_
best_params=grid.best_params_
best_score=grid.best_score_
#print (cv_results )
print ('best params: ',best_params)
print('best score: %f'%best_score)
r = grid.score(x_train,y_train)
print("R值(准确率):",r)
我这里把模型训练后在训练集上的准确率也打印下来对比一下。运行后如图:
这里需要注意一下的是,best score是在网格搜索过程中,最佳参数在K次在训练集的(K-1)上作训练,余1训练集上做验证然后准确率取平均算出来的准确率,所以我们最佳参数模型找到之后用这个模型