GridSearchCV存在的意义就是自动调参,只要把参数传递进去,就可以得出最优化的参数和结果,但这种方法适合于数据量比较小的情况下,当存在大量的数据时就很难得出结果,就得另寻别路。
数据量比较大的时候可以使用一个快捷的调优方法–梯度下降,本质是一种贪心思想的方法。 使用当前对模型影响比较最大的参数进行调优,依次拿下一个影响比较大的参数再次进行调优,直到所有的参数调优结束。这种方法的缺点就是只能进行局部的调优,不能对全局进行调优。
通常算法不够好,需要调试参数时必不可少。比如SVM的惩罚因子C,核函数kernel,gamma参数等,对于不同的数据使用不同的参数,结果效果可能差1-5个点,sklearn为我们提供专门调试参数的函数grid_search。
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))
致谢: 请读者点点小红心!!!