机器学习之模型调参利器gridSearchCV(网格搜索)

gridSearchCV(网格搜索)的参数、方法及示例

1.简介

GridSearchCV存在的意义就是自动调参,只要把参数传递进去,就可以得出最优化的参数和结果,但这种方法适合于数据量比较小的情况下,当存在大量的数据时就很难得出结果,就得另寻别路。

数据量比较大的时候可以使用一个快捷的调优方法–梯度下降,本质是一种贪心思想的方法。 使用当前对模型影响比较最大的参数进行调优,依次拿下一个影响比较大的参数再次进行调优,直到所有的参数调优结束。这种方法的缺点就是只能进行局部的调优,不能对全局进行调优。

通常算法不够好,需要调试参数时必不可少。比如SVM的惩罚因子C,核函数kernel,gamma参数等,对于不同的数据使用不同的参数,结果效果可能差1-5个点,sklearn为我们提供专门调试参数的函数grid_search。

2.参数说明

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’)
(1) estimator

选择使用的分类器,并且传入除需要确定最佳的参数之外的其他参数。每一个分类器都需要一个scoring参数,或者score方法:estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features=‘sqrt’,random_state=10),

(2) param_grid

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

(3) scoring=None

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

(4) fit_params=None

(5) n_jobs=1

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

(6) iid=True

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

(7) refit=True

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

(8) cv=None

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

(9) verbose=0, scoring=None

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

(10) pre_dispatch=‘2*n_jobs’

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

(11) error_score=’raise’

(12) return_train_score=’warn’

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

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

实例代码一

# !/usr/bin/python
# -*- coding:utf-8 -*-
import numpy as np
from sklearn import svm
from sklearn.model_selection import GridSearchCV
import matplotlib.pyplot as plt


if __name__ == "__main__":
    N = 50
    np.random.seed(0)
    x = np.sort(np.random.uniform(0, 6, N), axis=0)
    y = 2*np.sin(x) + 0.1*np.random.randn(N)
    x = x.reshape(-1, 1)
    print ('x =\n', x)
    print ('y =\n', y)

#     model = svm.SVR(kernel='rbf')
#     c_can = np.logspace(-2, 2, 10)
#     gamma_can = np.logspace(-2, 2, 10)
#     svr = GridSearchCV(model, param_grid={'C': c_can, 'gamma': gamma_can}, cv=5)
#     svr.fit(x, y)
#     print ('验证参数:\n', svr.best_params_)
    
    #svm的惩罚因子C ,和函数kernel,gamma等参数。
    model = svm.SVR(kernel='rbf')
    c_can = np.logspace(-2, 2, 10)
    gamma_can = np.logspace(-2, 2, 10)
    #GridSearchCV方法的讲解 
#     model:需要使用的模型
#     param_grid: 需要最优化参数的取值,值为字典或者列表 
#     cv:交叉验证的参数,一般NONE
    svr = GridSearchCV(model, param_grid={'C': c_can, 'gamma': gamma_can}, cv=5)
    svr.fit(x,y)
    print ('验证参数:\n',svr.best_params_)
    

    x_test = np.linspace(x.min(), x.max(), 100).reshape(-1, 1)
    y_hat = svr.predict(x_test)
    
    sp = svr.best_estimator_.support_
    plt.figure(facecolor='w')
    plt.scatter(x[sp], y[sp], s=120, c='r', marker='*', label='Support Vectors', zorder=3)
    plt.plot(x_test, y_hat, 'r-', linewidth=2, label='RBF Kernel')
    plt.plot(x, y, 'go', markersize=5)
    plt.legend(loc='upper right')
    plt.title('SVR', fontsize=16)
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.grid(True)
    plt.show()

运行结果:
x =
[[0.1127388 ]
[0.12131038]
[0.36135283]
[0.42621635]
[0.5227758 ]
[0.70964656]
[0.77355779]
[0.86011972]
[1.26229537]
[1.58733367]
[1.89257011]
[2.1570474 ]
[2.18226463]
[2.30064911]
[2.48797164]
[2.5419288 ]
[2.62219172]
[2.62552327]
[2.73690199]
[2.76887617]
[3.13108993]
[3.17336952]
[3.2692991 ]
[3.29288102]
[3.40826737]
[3.41060369]
[3.61658026]
[3.67257434]
[3.70160398]
[3.70581298]
[3.83952613]
[3.87536468]
[4.00060029]
[4.02382722]
[4.09092179]
[4.18578718]
[4.2911362 ]
[4.64540214]
[4.66894051]
[4.68317506]
[4.75035023]
[4.79495139]
[4.99571907]
[5.22007289]
[5.350638 ]
[5.55357983]
[5.66248847]
[5.6680135 ]
[5.78197656]
[5.87171005]]
y =
[ 0.05437325 0.43710367 0.65611482 0.78304981 0.87329469 1.38088042
1.23598022 1.49456731 1.81603293 2.03841677 1.84627139 1.54797796
1.63479377 1.53337832 1.22278185 1.15897721 0.92928812 0.95065638
0.72022281 0.69233817 -0.06030957 -0.23617129 -0.23697659 -0.34160192
-0.69007014 -0.48527812 -1.00538468 -1.00756566 -0.98948253 -1.05661601
-1.17133143 -1.46283398 -1.47415531 -1.61280243 -1.7131299 -1.78692494
-1.85631003 -1.98989791 -2.11462751 -1.90906396 -1.95199287 -2.14681169
-1.77143442 -1.55815674 -1.48840245 -1.35114367 -1.27027958 -1.04875251
-1.00128962 -0.67767925]
验证参数:
{‘C’: 35.93813663804626, ‘gamma’: 0.5994842503189409}

在这里插入图片描述

遇到的问题解决方法

python中将csv中的string类型转换为float类型

pima = pd.read_csv("F:\\bikes.csv",engine='python')
 
# 前两列丢掉
pima = pima.ix[:, 1:]
 
# 找到列名,转化为列表
col = list(pima.columns)
 
# 把所有列的类型都转化为数值型,出错的地方填入NaN,再把NaN的地方补0
pima[col] = pima[col].apply(pd.to_numeric, errors='coerce').fillna(0.0)
# 至此,object的列(列中存储的是string类型)转成了float
 
# 最后一步,把所有列都转化成float类型,done!
pima = pd.DataFrame(pima, dtype='float')

实例代码二

model = XGBClassifier()               
learning_rate = [0.0001,0.001,0.01,0.1] #学习率
gamma = [1, 0.1, 0.01, 0.001]
param_grid = dict(learning_rate = learning_rate,gamma = gamma)#转化为字典格式,网络搜索要求
 
kflod = StratifiedKFold(n_splits=10, shuffle = True,random_state=7)#将训练/测试数据集划分10个互斥子集,
 
grid_search = GridSearchCV(model,param_grid,scoring = 'neg_log_loss',n_jobs = -1,cv = kflod)
#scoring指定损失函数类型,n_jobs指定全部cpu跑,cv指定交叉验证
grid_result = grid_search.fit(X_train, Y_train) #运行网格搜索
print("Best: %f using %s" % (grid_result.best_score_,grid_search.best_params_))
#grid_scores_:给出不同参数情况下的评价结果。best_params_:描述了已取得最佳结果的参数的组合
#best_score_:成员提供优化过程期间观察到的最好的评分
#具有键作为列标题和值作为列的dict,可以导入到DataFrame中。
#注意,“params”键用于存储所有参数候选项的参数设置列表。
means = grid_result.cv_results_['mean_test_score']
params = grid_result.cv_results_['params']
for mean,param in zip(means,params):
    print("%f  with:   %r" % (mean,param))

致谢: 请读者点点小红心!!!

  • 10
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪子私房菜

给小强一点爱心呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值