• 网格搜索

1. 网格搜索(Grid Search)就是你手动的给出一个模型中你想要改动的参数,程序自动的帮你使用穷举法来将所用的参数都运行一遍。决策树中我们常常将最大树深作为需要调节的参数;AdaBoost中将弱分类器的数量作为需要调节的参数。

2. 参数调优:为了确定最优搜索参数,需要选择一个评分方式(根据实际情况来确定的可能是accuracy、f1-score、f-beta、pricise、recall等)。

3. 交叉验证:有了好的评分方式,但是只用一次的结果就能说明某组的参数组合比另外的参数组合好吗?这显然是不严谨的,上小学的时候老师就告诉我们要求平均。所以就有了交叉验证这一概念。K折交叉验证即把数据评分分成K分,每次留一份作为测试集,K-1份作为训练集,进行K次模型评分,将K次评分求平均值返回,然后找出最大的一个评分使用的参数组合。这也就完成了交叉验证这一过程。

4. GridSearchCV可以自动对我们给定的参数进行组合,并得出每个组合的模型效果,通过比较其效果来选出最佳参数组合。

 

#GridSearchCV API文档
sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, 
                                     n_jobs=None, iid=’warn’, refit=True, 
                                     cv=’warn’, verbose=0, pre_dispatch=‘2*n_jobs’, 
                                     error_score=’raise-deprecating’, return_train_score=False)

 

GridSearchCV中各参数含义:

(1)estimator:需要搜索的算法模型,如KNN,SVM等等,可传入除需要确定的最佳参数之外的其他参数。

(2)param_grid:需要优化的参数的取值,其值为字典或者列表类型。

(3)scoring:模型的评价标准,默认是使用estimator的误差估计函数。当然我们也可以指定scoring = ‘roc_auc’或者‘recall’或者‘F1_score’等等,具体指定哪种评估标准,需要根据我们的模型estimator来选择。

(4)n_jobs:CPU并行数,默认为1,-1为使用所有的CPU。

(5)cv:交叉验证参数,默认为3,可以自己指定。

(6)pre_dispatch:指定总共分发的并行任务数。当n_jobs大于1时,数据将在每个运行点进行复制,这可能导致OOM,而设置pre_dispatch参数,则可以预先划分总共的job数量,使数据最多被复制pre_dispatch次

(7)refit:默认为True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可用的训练集与开发集进行,作为最终用于性能评估的最佳模型参数。即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集。

 

 

#简单使用方法
from sklearn.metrics import make_scorer, accuracy_score
from sklearn.model_selection import GridSearchCV

scorer = make_scorer(accuracy_score)

parameter_tree = {'max_depth': xrange(1, 10)}
grid = GridSearchCV(clf_Tree, parameter_tree, scorer, cv=kfold)
grid = grid.fit(X_train, y_train)

 

属性:

(1)cv_results_ :将键作为列标题和值作为列的字典,可将其导入到pandas DataFrame中。如:display(pd.DataFrame(grid.cv_results_).T),其中T表示转置。

(2)best_estimator_ : estimator或dict;由搜索选择的估算器,即在左侧数据上给出最高分数(或者如果指定最小损失)的估算器。 如果refit = False,则不可用。

(3)best_params_ : dict;在保持数据上给出最佳结果的参数设置。对于多度量评估,只有在指定了重新指定的情况下才会出现。

(4)best_score_ : float;best_estimator的平均交叉验证分数,对于多度量评估,只有在指定了重新指定的情况下才会出现。

方法:

(1)decision_function:使用找到的参数最好的分类器调用decision_function。

(2)fit(X, y),带入x_train与y_train进行模型训练

(3)get_params(deep=True):获取这个估计器的参数。

(4)predict(X):用找到的最佳参数调用预估器。(直接预测每个样本属于哪一个类别)

(5)predict_log_prada(X):用找到的最佳参数调用预估器。(得到每个测试集样本在每一个类别的得分取log情况)

(6)predict_proba(X):用找到的最佳参数调用预估器。(得到每个测试集样本在每一个类别的得分情况)