目录

一、交叉验证

二、网格搜索

三、贝叶斯优化

建模的整个过程中最耗时的部分是特征工程(含变量分析),其次可能是调参,所以今天来通过代码实战介绍调参的相关方法:网格搜索、贝叶斯调参。

一、交叉验证

工作中最常用的训练集测试集划分方法主要是随机比例分割和(分层)交叉验证,随机比例分割可以按照7-3、8-2的比例划分训练集、测试集,但是这样的数据划分存在一定随机性,不如使用交叉验证来的严谨。

1、导包、设定初始参数

# 导包
import re
import os
from sqlalchemy import create_engine
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
import sklearn
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve,roc_auc_score
import xgboost as xgb
from xgboost.sklearn import XGBClassifier
import matplotlib.pyplot as plt
import gc
from sklearn import metrics
from sklearn.model_selection import cross_val_predict,cross_validate# 设定xgb参数
params={'objective':'binary:logistic','eval_metric':'auc','n_estimators':500,'eta':0.03,'max_depth':3,'min_child_weight':100,'scale_pos_weight':1,'gamma':5,'reg_alpha':10,'reg_lambda':10,'subsample':0.7,'colsample_bytree':0.7,'seed':123
}

2、初始化模型对象、5折交叉验证,交叉验证函数cross_validate可以设定多个目标(此处使用AUC)、而cross_val_score只能设置一个

xgb = XGBClassifier(**params)
scoring=['roc_auc']
scores=cross_validate(xgb,df[col_list],df.y,cv=5,scoring=scoring,return_train_score=True )
scores 

3、Xgb、lgb的原生接口可用自带的cv函数

xgb.cv(params,df,num_boost_round=10,nfold=5,stratified=True,metrics='auc' ,as_pandas=True)

二、网格搜索

通过遍历全部的参数组合,寻找测试集效果最优的参数组

1、设定调参参数及范围,使用网格搜索

from sklearn.model_selection import GridSearchCV
train=df_train.head(60000)
test=df_train.tail(10000)param_value_dics={'n_estimators':range(100,900,500),'eta':np.arange(0.02,0.2,0.1),'max_depth':range(3,5,1),
#                    'num_leaves':range(10,30,10),
#                    'min_child_weight':range(300,1500,500),}xgb_model=XGBClassifier(**params)
clf=GridSearchCV(xgb_model,param_value_dics,scoring='roc_auc',n_jobs=-1,cv=5,return_train_score=True)
clf.fit(df[col_list], df.y)

2、返回最优参数

clf.best_params_

3、返回最优参数的模型

clf.best_estimator_

4、返回最优参数下的测试集评估指标(此处设定的AUC)

clf.best_score_

网格搜索在设定的参数范围中全局遍历寻找最优参数、即全局最优解,但是这样的计算量下程序运行简直是龟速,而且它网格搜索的目标是测试集效果最优、在这种目标下调参训练仍然存在过拟合的风险;针对这些问题,有了贝叶斯优化调参。

三、贝叶斯优化

贝叶斯调参需要自定义目标函数,可根据实际情况灵活选择,而且运行速度快、在运行的同时就能展示每次当下参数的模型结果,确实是很好用的方法

1、导包

from bayes_opt import BayesianOptimization
import warnings
warnings.filterwarnings("ignore")
from sklearn import metrics
from sklearn.model_selection import cross_val_predict,cross_validate
from xgboost import XGBClassifier

2、自定义调参目标,此处使用cv下测试集的AUC均值为调参目标


def xgb_cv(n_estimators,max_depth,eta,subsample,colsample_bytree):params={'objective':'binary:logistic','eval_metric':'auc','n_estimators':10,'eta':0.03,'max_depth':3,'min_child_weight':100,'scale_pos_weight':1,'gamma':5,'reg_alpha':10,'reg_lambda':10,'subsample':0.7,'colsample_bytree':0.7,'seed':123,}params.update({'n_estimators':int(n_estimators),'max_depth':int(max_depth),'eta':eta,'sub    sample':subsample,'colsample_bytree':colsample_bytree})model=XGBClassifier(**params)cv_result=cross_validate(model,df_train.head(10000)[col_list],df_train.head(10000).y,     cv=5,scoring='roc_auc',return_train_score=True)return cv_result.get('test_score').mean()

3、设定调参范围,注意数值范围的固定格式:(left,right),贝叶斯调参会在该范围内随机选取实数点,对于n_estimators、max_depth等参数,随即出来的结果一样是浮点数、所以在模型部分要将这些参数转化为整型:int(n_estimators)

param_value_dics={'n_estimators':(100, 500),'max_depth':(3, 6),'eta':(0.02,0.2),'subsample':(0.6, 1.0),'colsample_bytree':(0.6, 1.0)}

4、 建立贝叶斯调参对象,迭代20次

lgb_bo = BayesianOptimization(xgb_cv,param_value_dics)
lgb_bo.maximize(init_points=1,n_iter=20) #init_points-调参基准点,n_iter-迭代次数

5、查看最优参数结果

lgb_bo.max

6、查看全部调参结果

lgb_bo.res

7、将全部调参结果转化为DataFrame,便于观察和展示

result=pd.DataFrame([res.get('params') for res in lgb_bo.res])
result['target']=[res.get('target') for res in lgb_bo.res]
result[['max_depth','n_estimators']]=result[['max_depth','n_estimators']].astype('int')
result

8、在当前调参的结果下,可以再次细化设定或修改参数范围、进一步调参

lgb_bo.set_bounds({'n_estimators':(400, 450)})
lgb_bo.maximize(init_points=1,n_iter=20)

更多知识及代码分享,关注公众号Python风控模型与数据分析

python网格搜索、贝叶斯调参实战相关推荐

  1. 机器学习调参——网格搜索调参,随机搜索调参,贝叶斯调参

    from sklearn.datasets import load_boston from sklearn.metrics import mean_squared_error from lightgb ...

  2. 网格搜索、随机搜索和贝叶斯调参总结与实践

    网格搜索 网格搜索时应用最广泛的超参数搜素算法,网格搜索通过查找搜索范围内的所有点,来确定最优值.一般是通过给出较大的搜索范围以及较小的步长,网格搜索时一定可以找到全局最大值或全局最小值的. 但是网格 ...

  3. 自动化机器学习(AutoML)之自动贝叶斯调参

    一.Python实现自动贝叶斯调整超参数 [导读]机器学习中,调参是一项繁琐但至关重要的任务,因为它很大程度上影响了算法的性能.手动调参十分耗时,网格和随机搜索不需要人力,但需要很长的运行时间.因此, ...

  4. 贝叶斯调参——bayes_opt

    一.简介 贝叶斯调参主要思想是,给定优化的目标函数(广义的函数,只需指定输入和输出即可,无需知道内部结构以及数学性质),通过不断地添加样本点来更新目标函数的后验分布 他与常规的网格搜索或者随机搜索的区 ...

  5. 调参1——随机森林贝叶斯调参

    贝叶斯调参教程请参考:https://blog.csdn.net/weixin_35757704/article/details/118480135 安装贝叶斯调参: pip install baye ...

  6. LGBM使用贝叶斯调参

    贝叶斯调参的相关知识与代码格式请参考:https://blog.csdn.net/weixin_35757704/article/details/118416689 构造LGBM模型 model = ...

  7. python朴素贝叶斯调参_邹博机器学习升级版II附讲义、参考书与源码下载(数学 xgboost lda hmm svm)...

    课程介绍 本课程特点是从数学层面推导最经典的机器学习算法,以及每种算法的示例和代码实现(Python).如何做算法的参数调试.以实际应用案例分析各种算法的选择等. 1.每个算法模块按照"原理 ...

  8. 机器学习之Grid Search网格搜索(自动调参)

    什么是Grid Search 网格搜索? Grid Search:一种调参手段:穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果.其原理就像是在数组里找最 ...

  9. 【参数调优】网格搜索GridSearchCV输出调参各个结果cv_results_

    cv_results_本身就是一个字典形式的输出,里面含有很多结果 param_test1 = {'n_estimators': range(10, 101, 10)} gssearch = Grid ...

  10. python贝叶斯优化算法_【干货】手把手教你Python实现自动贝叶斯调整超参数

    [导读]机器学习中,调参是一项繁琐但至关重要的任务,因为它很大程度上影响了算法的性能.手动调参十分耗时,网格和随机搜索不需要人力,但需要很长的运行时间.因此,诞生了许多自动调整超参数的方法.贝叶斯优化 ...

最新文章

  1. KS007基于JSP实现人个人博客系统
  2. 配置vsftpd的遇到的坑及搭建虚拟账户
  3. MyBatis-12MyBatis动态SQL之【choose when otherwise】
  4. nodejs在Liunx上的部署生产方式-PM2
  5. PHP 使用concat的无限分类
  6. numpy实现BN层
  7. AngularJS页面【uib-dropdown】控件在模态窗口(弹出窗)中无法使用问题
  8. js递归遍历树形json数据
  9. go中的interface
  10. 学习配置tomcat虚拟主机
  11. eclipse中项目运行时报错之 Compilation error解决方法
  12. 在线小游戏,在线小游戏大全,网页在线小游戏大全
  13. 自己设置假期的日历控件_在假期旅行时使用PC娱乐自己
  14. Android Studio飘红错误
  15. 把笔记本改造成无线路由器 —— 手机抓包牛刀小试
  16. python反向切片_python切片
  17. Allegro PCB -通孔焊盘制作 及Flash制作
  18. cas147859-70-9(简称Pheno)苯酚,4,4‘-(10,20-二苯基-21H,23H-卟吩-5,15-二酰基)双酚
  19. 领导说,不懂汇报,怎么给你升职?让我学习麦肯锡的:金字塔原理、MECE法则...
  20. 大数据技术在CBTC列车控制系统中的应用

热门文章

  1. CE修改器教程总结2
  2. 二次规划(QP)求解与序列二次规划(SQP)求解非线性规划问题
  3. ECharts - dataset组件的用法详解
  4. 算法导论(第三版)第一章习题答案
  5. 一天搞懂深度学习—学习笔记3(RNN)
  6. oracle ocp考题,Oracle OCP认证考试题库更新,052新考题整理(带答案)-72
  7. python程序设计与算法基础教程微课版课后答案_Python程序设计与算法基础教程
  8. vba中split用法
  9. 中英文停用词(stop word)列表
  10. Java认证与授权服务JAAS基础概念