[toc]

由于各个新模型在执行交叉验证的过程中间是相互独立的,所以我们可以充分利用多核处理器(Multicore processor)甚至是分布式的计算资源来从事并行搜索,节省运算时间。

1
2
3
# 导入20类新闻文本抓取器
from sklearn.datasets import fetch_20newsgroups
import numpy as np
1
news = fetch_20newsgroups(subset='all')
1
2
3
4
# 分割数据
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(news.data[:3000], news.target[:3000], test_size=0.25, random_state=33)
1
2
3
4
5
6
7
8
9
10
11
12
# 导入支持向量机(分类)模型
from sklearn.svm import SVC

# 导入TF-IDF文本抽取器
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline

# 利用Pipeline进行系统搭建
clf = Pipeline([('vect', TfidfVectorizer(stop_words='english')), ('svc', SVC())])

# 超参数设置 4*3=12组
parameters = {'svc__gamma':np.logspace(-2, 1, 4), 'svc__C':np.logspace(-1, 1, 3)}
1
2
3
4
from sklearn.model_selection import GridSearchCV

# 初始化配置,n_job=-1代表使用计算机的全部CPU
gs = GridSearchCV(estimator=clf, param_grid=parameters, verbose=2, refit=True, cv=3, n_jobs=-1)

网络搜索函数参数:

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’)

  • estimator

    选择使用的分类器,并且传入除需要确定最佳的参数之外的其他参数。每一个分类器都需要一个 scoring 参数,或者 score 方法:

    estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features=‘sqrt’,random_state=10),

  • param_grid

    需要最优化的参数的取值,值为字典或者列表,例如:param_grid =param_test1,param_test1 = {‘n_estimators’:range(10,71,10)}。

  • scoring=None

    模型评价标准,默认 None,这时需要使用 score 函数;或者如 scoring=‘roc_auc’,根据所选模型不同,评价准则不同。字符串(函数名),或是可调用对象,需要其函数签名形如:scorer(estimator, X, y);如果是 None,则使用 estimator 的误差估计函数。具体值的选取看本篇第三节内容。

  • fit_params=None

  • n_jobs=1

    n_jobs: 并行数,int:个数,-1:跟 CPU 核数一致, 1:默认值

  • iid=True

    iid:默认 True,为 True 时,默认为各个样本 fold 概率分布一致,误差估计为所有样本之和,而非各个 fold 的平均。

  • refit=True

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

  • cv=None

    交叉验证参数,默认 None,使用三折交叉验证。指定 fold 数量,默认为 3,也可以是 yield 训练/测试数据的生成器。

  • verbose=0, scoring=None

    verbose:日志冗长度,int:冗长度,0:不输出训练过程,1:偶尔输出,>1:对每个子模型都输出。

  • pre_dispatch=‘2*n_jobs’

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

  • error_score=’raise’

  • return_train_score=’warn’

    如果“False”,cv_results_属性将不包括训练分数

    回到 sklearn 里面的 GridSearchCV,GridSearchCV 用于系统地遍历多种参数组合,通过交叉验证确定最佳效果参数。

1
2
%time
gs_result = gs.fit(X_train, y_train)
1
2
3
4
5
6
Wall time: 0 ns
Fitting 3 folds for each of 12 candidates, totalling 36 fits


[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.
[Parallel(n_jobs=-1)]: Done 36 out of 36 | elapsed: 1.5min finished

在这里插入图片描述

返回结果

  • cv_results_ : dict of numpy (masked) ndarrays

    具有键作为列标题和值作为列的 dict,可以导入到 DataFrame 中。注意,“params”键用于存储所有参数候选项的参数设置列表。

  • best_estimator_ : estimator

    通过搜索选择的估计器,即在左侧数据上给出最高分数(或指定的最小损失)的估计器。 如果 refit = False,则不可用。

  • best_score_ : float

    best_estimator 的分数

  • best_params_ : dict

    在保存数据上给出最佳结果的参数设置

  • best_index_ : int

    对应于最佳候选参数设置的索引(cv_results_数组)。
    search.cv_results _ [‘params’] [search.best_index_]中的 dict 给出了最佳模型的参数设置,给出了最高的平均分数(search.best_score_)。

  • scorer_ : function

    Scorer function used on the held out data to choose the best parameters for the model.

  • n_splits_ : int

    The number of cross-validation splits (folds/iterations).

  • grid_scores_:

    给出不同参数情况下的评价结果

1
2
print(gs_result.score(X_test, y_test))
print(gs_result.best_params_, gs.best_score_)
1
2
0.8226666666666667
{'svc__C': 10.0, 'svc__gamma': 0.1} 0.7888888888888889