3.5.7 模型选择: 选择预测器及其参数

3.5.7.1 网格搜索和交叉验证预测器

3.5.7.1.1 网格搜索

scikit-learn提供了一个对象,给定数据,计算预测器在一个参数网格的分数,并且选择可以最大化交叉验证分数的参数。这个对象用一个构建中的预测器并且暴露了一个预测器的探索集API:

In [16]:

  1. from sklearn import svm, grid_search
  2. gammas = np.logspace(-6, -1, 10)
  3. svc = svm.SVC()
  4. clf = grid_search.GridSearchCV(estimator=svc, param_grid=dict(gamma=gammas), n_jobs=-1)
  5. clf.fit(digits.data[:1000], digits.target[:1000])

Out[16]:

  1. GridSearchCV(cv=None, error_score='raise',
  2. estimator=SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,
  3. kernel='rbf', max_iter=-1, probability=False, random_state=None,
  4. shrinking=True, tol=0.001, verbose=False),
  5. fit_params={}, iid=True, loss_func=None, n_jobs=-1,
  6. param_grid={'gamma': array([ 1.00000e-06, 3.59381e-06, 1.29155e-05, 4.64159e-05,
  7. 1.66810e-04, 5.99484e-04, 2.15443e-03, 7.74264e-03,
  8. 2.78256e-02, 1.00000e-01])},
  9. pre_dispatch='2*n_jobs', refit=True, score_func=None, scoring=None,
  10. verbose=0)

In [20]:

  1. clf.best_score_

Out[20]:

  1. 0.93200000000000005

In [22]:

  1. clf.best_estimator_.gamma

Out[22]:

  1. 0.00059948425031894088

默认,GridSearchCV使用三折交叉验证。但是,如果识别传递了一个分类器都不是一个回归器,它将使用一个分层三折。

3.5.7.1.2 交叉验证预测器

一个算法一个算法为基础的设置参数来进行交叉验证更有效。这也就是为什么,对于一些预测器,scikit-learn暴露一个“CV”预测器, 这个预测器通过交叉验证自动设置他们的参数:

In [23]:

  1. from sklearn import linear_model, datasets
  2. lasso = linear_model.LassoCV()
  3. diabetes = datasets.load_diabetes()
  4. X_diabetes = diabetes.data
  5. y_diabetes = diabetes.target
  6. lasso.fit(X_diabetes, y_diabetes)

Out[23]:

  1. LassoCV(alphas=None, copy_X=True, cv=None, eps=0.001, fit_intercept=True,
  2. max_iter=1000, n_alphas=100, n_jobs=1, normalize=False, positive=False,
  3. precompute='auto', random_state=None, selection='cyclic', tol=0.0001,
  4. verbose=False)

In [26]:

  1. # 预测器自动选择他的lambda:
  2. lasso.alpha_

Out[26]:

  1. 0.012291895087486173

这些预测器与他们的对等物调用方式类似,只是在名字后面增加了‘CV’。

练习 在糖尿病数据集中,找到最优化的正则化参数alpha。