python search函数_Python超参数自动搜索模块GridSearchCV

1.说明SVM的惩罚因子C,核函数kernel,gamma参数等,对于不同的数据使用不同的参数,结果效果可能差1-5个点,sklearn为我们提供专门调试参数的函数grid_search

GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,它能够返回最好的模型参数组合。

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

但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。这个时候就是需要动脑筋了。数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法:拿当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,

2.GridSearchCV函数的参数

函数原型: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)

其中cv可以是整数或者交叉验证生成器或一个可迭代器,cv参数对应的4种输入列举如下:None:默认参数,函数会使用默认的3折交叉验证

整数k:k折交叉验证。对于分类任务,使用StratifiedKFold(类别平衡,每类的训练集占比一样多,具体可以查看官方文档)。对于其他任务,使用KFold

交叉验证生成器:得自己写生成器,头疼,略

可以生成训练集与测试集的迭代器:同上,略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的误差估计函数。scoring参数选择如下:

参考地址:3.3. Metrics and scoring: quantifying the quality of predictions​scikit-learn.org

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次

3.使用步骤,以KNN为例

一、评测标准模型的测评标准:分类的准确度(accuracy);

预测准确度 = 预测成功的样本个数/预测数据集样本总数;

二、超参数

1)问题超参数:运行机器学习算法前需要指定的参数;

kNN算法中的超参数:k、weights、P;

一般超参数之间也相互影响;

调参,就是调超参数;

k:样本的类别数

2)kNN算法中,除了K值外的另一个超参数:距离的权重(1/距离)k个点中,将不同类的点的权重相加,最大的那一类为目标标签scikit-learn库中的KNeighborsClassifier类中,weights()函数;

在__init__()中默认两个参数值:__init__(n_neighbors = 5, weights = 'uniform');

weights = 'uniform',表示不考虑距离权重这个超参数;

weights= 'distance',表示考虑距离权重这个超参数;

3)kNN算法的第三个超参数:P,距离参数只有当kNN算法考虑距离权重超参数(weights)时,才会考虑是否输入距离参数(P);

欧拉距离,曼哈顿距离,明可夫斯基距离

图中绿色最短的为欧拉距离,红黄蓝为曼哈顿距离

将距离一般化:明可夫斯基距离在明科夫斯基距离中:当P = 1,明科夫斯基距离 == 曼哈顿距离;

当P = 2,明科夫斯基距离 == 欧拉距离;

当P >= 3,对应的明科夫斯基距离为其它距离;

4)调参的方法调参目的,找到最优的超参数;

机器学习算法应用在不同的领域中,不同领域内有其特有的知识

第一步,在 GridSearchCV 函数的 param_grid 参数中定义超参数。该参数是一个数组,数组中包括一个个字典,我们只需要把每一组超参数组合放置在该字典中即可。字典的键为超参数名称,键的值为超参数的搜索取值范围。

第一个字典中有两个超参数:n_neighbors 和 weights 。n_neighbors 取值范围是 1-20,weights 键值 uniform 表示不考虑距离,这组参数会循环搜索 20 次。

第二个字典中 weights 变为 distance 表示要考虑距离,n_neighbors 和 p 两个超参数循环 20*10 共 200 次。

两个字典加起来一共要循环搜索 220 次,后续就会建立 220 个模型中并根据得分返回最好的超参数组合。

第二步,建模。先创建默认的 kNN 模型,把模型和刚才的超参数传进网格搜索函数中,接着传入训练数据集进行 fit 拟合,这时模型会尝试 220 组超参数组合,数据大的话会比较费时,可以使用 %%time 魔法命令记录运行时间。knn_clf = KNeighborsClassifier()

grid_search = GridSearchCV(knn_clf,param_grid,n_jobs=-1,verbose=2)

%%time

grid_search.fit(x_train_norm,y_train)#这是取出参数最好的一组对应的分类器

grid_search.best_estimator_

#这是取出最好的超参数组合对应的准确率

grid_search.best_score_

grid_search.best_params_#这是取出最好的一组超参数

#用最好的一组超参数的分类器对象去预测测试集

knn_clf = grid_search.best_estimator_

y_pre2 = knn_clf.predict(x_test_norm)

print(knn_clf.score(x_test,y_test))#算法的精确度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值