sklearn-GridSearchCV调节超参数

sklearn-GridSearchCV调节超参数

同样的模型不同的参数下,模型的得分差距很大。sklearn中提供了参数调节函数:GridSearchCV。将待挑选的参数输入,可以自动的挑选最佳的参数和结果。

缺陷: 一旦模型的量级上去之后,将需要很长的时间函数才能运行完成。因为该函数执行一次所训练和测试的次数为:优化参数组合数*K(K折交叉验证)。当数据集很大时,多次反复训练模型将非常耗时。

对于数据集很大时可以参考这篇博客:一种将grid-search速度提升10倍的方法
关于交叉验证可以参考这篇博客:交叉验证

  • 函数原型
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=True)
  • 功能
    遍历待优化的参数的所有组合,在每一组参数下使用交叉验证训练模型。
  • 参数
  • estimator:所使用的分类器,如estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features=’sqrt’,random_state=10), 并且传入除需要确定最佳的参数之外的其他参数。每一个分类器都需要一个scoring参数,或者score方法。
  • param_grid:值为字典或者列表,即需要最优化的参数的取值,param_grid =param_test1,param_test1 = {‘n_estimators’:range(10,71,10)}。
  • scoring :准确度评价标准,默认None,这时需要使用score函数;或者如scoring=’roc_auc’,根据所选模型不同,评价准则不同。字符串(函数名),或是可调用对象,需要其函数签名形如:scorer(estimator, X, y);如果是None,则使用estimator的误差估计函数。
  • cv :交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。
  • refit :默认为True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可用的训练集与开发集进行,作为最终用于性能评估的最佳模型参数。即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集。
  • iid:默认True,为True时,默认为各个样本fold概率分布一致,误差估计为所有样本之和,而非各个fold的平均。
  • verbose:日志冗长度,int:冗长度,0:不输出训练过程,1:偶尔输出,>1:对每个子模型都输出。
  • n_jobs: 并行数,int:个数,-1:跟CPU核数一致, 1:默认值。
  • pre_dispatch:指定总共分发的并行任务数。当n_jobs大于1时,数据将在每个运行点进行复制,这可能导致OOM,而设置pre_dispatch参数,则可以预先划分总共的job数量,使数据最多被复制pre_dispatch次
  • 常用方法和属性
    grid.fit(X,y) :运行网格搜索
    grid_scores_:给出不同参数情况下的评价结果
    best_params_:描述了已取得最佳结果的参数的组合
    best_score_:成员提供优化过程期间观察到的最好的评分

  • 案例

from sklearn.model_selection import GridSearchCV, KFold, train_test_split
from sklearn.metrics import make_scorer, accuracy_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer

data = load_breast_cancer()

X_train, X_test, y_train, y_test = train_test_split(
    data['data'], data['target'], train_size=0.8, random_state=0)

regressor = DecisionTreeClassifier(random_state=0)
parameters = {'max_depth': range(1, 6)}
scoring_fnc = make_scorer(accuracy_score)
kfold = KFold(n_splits=10)

grid = GridSearchCV(regressor, parameters, scoring_fnc, cv=kfold)
grid = grid.fit(X_train, y_train)
reg = grid.best_estimator_

print('best score: %f'%grid.best_score_)
print('best parameters:')
for key in parameters.keys():
    print('%s: %d'%(key, reg.get_params()[key]))

print('test score: %f'%reg.score(X_test, y_test))

import pandas as pd
pd.DataFrame(grid.cv_results_).T
  • 参考文献
    sklearn-GridSearchCV,CV调节超参使用方法
    网格搜索算法与K折交叉验证
    Sklearn-GridSearchCV网格搜索
    Python超参数自动搜索模块GridSearchCV上手

你可能感兴趣的:(sklearn,machine,learning)