本教程重点在于传授如何使用Hyperopt对xgboost进行自动调参。但是这份代码也是我一直使用的代码模板之一,所以在其他数据集上套用该模板也是十分容易的。

同时因为xgboost,lightgbm,catboost。三个类库调用方法都比较一致,所以在本部分结束之后,我们有理由相信,你将会学会在这三个类库上使用hyperopt。除此之外要额外说明的是,本文并不涉及交叉验证的问题,交叉验证请查看其他教程。

什么是Hyperopt?

Hyperopt:是python中的一个用于"分布式异步算法组态/超参数优化"的类库。使用它我们可以拜托繁杂的超参数优化过程,自动获取最佳的超参数。广泛意义上,可以将带有超参数的模型看作是一个必然的非凸函数,因此hyperopt几乎可以稳定的获取比手工更加合理的调参结果。尤其对于调参比较复杂的模型而言,其更是能以远快于人工调参的速度同样获得远远超过人工调参的最终性能。

文档地址?

目前中文文档的地址由本人FontTian在2017年翻译,但是hyperopt文档本身确实写的不怎么样。所以才有了这份教程。源代码请前往Github教程地址下载下载。

  • 中文文档地址
  • FontTian的博客
  • Hyperopt官方文档地址

教程

获取数据

这里我们使用UCI的红酒质量数据集,除此之外我还额外增加了两个特征。

from hyperopt import fmin, tpe, hp, partial
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import mean_squared_error, zero_one_loss
import xgboost as xgb
import pandas as pddef GetNewDataByPandas():wine = pd.read_csv("../data/wine.csv")wine['alcohol**2'] = pow(wine["alcohol"], 2)wine['volatileAcidity*alcohol'] = wine["alcohol"] * wine['volatile acidity']y = np.array(wine.quality)X = np.array(wine.drop("quality", axis=1))columns = np.array(wine.columns)return X, y, columns

分割数据并转换

首先将数据分割为三份,一部分用于预测,训练数据则同样分成额外的两部分用于evallist参数。

同时为了加快速度和减少内存,我们将数据转换为xgboost自带的读取格式。

# Read wine quality data from file
X, y, wineNames = GetNewDataByPandas()# split data to [[0.8,0.2],01]
x_train_all, x_predict, y_train_all, y_predict = train_test_split(X, y, test_size=0.10, random_state=100)x_train, x_test, y_train, y_test = train_test_split(x_train_all, y_train_all, test_size=0.2, random_state=100)dtrain = xgb.DMatrix(data=x_train,label=y_train,missing=-999.0)
dtest = xgb.DMatrix(data=x_test,label=y_test,missing=-999.0)evallist = [(dtest, 'eval'), (dtrain, 'train')]

定义参数空间

使用hyperopt自带的函数定义参数空间,但是因为其randint()方法产生的数组范围是从0开始的,所以我额外定义了一个数据转换方法,对原始参数空间进行一次转换。

关于hyperopt中定义参数区间需要使用的函数请参考:

  • 中文地址,请点击这里
  • 英文地址,请点击这里
# 自定义hyperopt的参数空间
space = {"max_depth": hp.randint("max_depth", 15),"n_estimators": hp.randint("n_estimators", 300),'learning_rate': hp.uniform('learning_rate', 1e-3, 5e-1),"subsample": hp.randint("subsample", 5),"min_child_weight": hp.randint("min_child_weight", 6),}def argsDict_tranform(argsDict, isPrint=False):argsDict["max_depth"] = argsDict["max_depth"] + 5argsDict['n_estimators'] = argsDict['n_estimators'] + 150argsDict["learning_rate"] = argsDict["learning_rate"] * 0.02 + 0.05argsDict["subsample"] = argsDict["subsample"] * 0.1 + 0.5argsDict["min_child_weight"] = argsDict["min_child_weight"] + 1if isPrint:print(argsDict)else:passreturn argsDict

创建模型工厂与分数获取器

xgboost模型工厂用于生产我们需要的model,而分数获取器则是为了解耦。这样在实际的测试工作中更加套用代码和修改。

def xgboost_factory(argsDict):argsDict = argsDict_tranform(argsDict)params = {'nthread': -1,  # 进程数'max_depth': argsDict['max_depth'],  # 最大深度'n_estimators': argsDict['n_estimators'],  # 树的数量'eta': argsDict['learning_rate'],  # 学习率'subsample': argsDict['subsample'],  # 采样数'min_child_weight': argsDict['min_child_weight'],  # 终点节点最小样本占比的和'objective': 'reg:linear','silent': 0,  # 是否显示'gamma': 0,  # 是否后剪枝'colsample_bytree': 0.7,  # 样本列采样'alpha': 0,  # L1 正则化'lambda': 0,  # L2 正则化'scale_pos_weight': 0,  # 取值>0时,在数据不平衡时有助于收敛'seed': 100,  # 随机种子'missing': -999,  # 填充缺失值}params['eval_metric'] = ['rmse']xrf = xgb.train(params, dtrain, params['n_estimators'], evallist,early_stopping_rounds=100)return get_tranformer_score(xrf)def get_tranformer_score(tranformer):xrf = tranformerdpredict = xgb.DMatrix(x_predict)prediction = xrf.predict(dpredict, ntree_limit=xrf.best_ntree_limit)return mean_squared_error(y_predict, prediction)

调用Hyperopt开始调参

之后我们调用hyperopt进行自动调参即可,同时通过返回值获取最佳模型的结果。

# 开始使用hyperopt进行自动调参
algo = partial(tpe.suggest, n_startup_jobs=1)
best = fmin(xgboost_factory, space, algo=algo, max_evals=20, pass_expr_memo_ctrl=None)
[15:23:32] /workspace/src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 142 extra nodes, 0 pruned nodes, max_depth=10
[0] eval-rmse:5.03273   train-rmse:4.90203
Multiple eval metrics have been passed: 'train-rmse' will be used for early stopping.Will train until train-rmse hasn't improved in 100 rounds.
[15:23:32] /workspace/src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 172 extra nodes, 0 pruned nodes, max_depth=10
[1] eval-rmse:4.77384   train-rmse:4.64767...[15:24:04] /workspace/src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 192 extra nodes, 0 pruned nodes, max_depth=15
[299]   eval-rmse:0.570382  train-rmse:0.000749

展示结果

展示我们获取的最佳参数,以及该模型在训练集上的最终表现,如果想要使用交叉验证请参考其他教程。

RMSE = xgboost_factory(best)
print('best :', best)
print('best param after transform :')
argsDict_tranform(best,isPrint=True)
print('rmse of the best xgboost:', np.sqrt(RMSE))
[15:24:52] /workspace/src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 428 extra nodes, 0 pruned nodes, max_depth=14
[0] eval-rmse:5.02286   train-rmse:4.89385
Multiple eval metrics have been passed: 'train-rmse' will be used for early stopping.Will train until train-rmse hasn't improved in 100 rounds.
[15:24:52] /workspace/src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 680 extra nodes, 0 pruned nodes, max_depth=14
[1] eval-rmse:4.75938   train-rmse:4.63251...[298]  eval-rmse:0.583923  train-rmse:0.000705
[15:24:54] /workspace/src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 22 extra nodes, 0 pruned nodes, max_depth=7
[299]   eval-rmse:0.583926  train-rmse:0.000704
best : {'learning_rate': 0.05385158551863543, 'max_depth': 14, 'min_child_weight': 2, 'n_estimators': 173, 'subsample': 0.8}
best param after transform :
{'learning_rate': 0.051077031710372714, 'max_depth': 19, 'min_child_weight': 3, 'n_estimators': 323, 'subsample': 0.5800000000000001}
rmse of the best xgboost: 0.5240080946197716

如何使用hyperopt对xgboost进行自动调参相关推荐

  1. 使用Hyperopt实现机器学习自动调参

    文章目录 机器学习自动调参 1. Hyperopt **Hyperopt搜索参数空间** 参数空间的设置 使用sample函数从参数空间内采样: 在参数空间内使用函数: **指定搜索的算法** 实例 ...

  2. 加载svr模型_机器学习XGBoost实战,网格搜索自动调参,对比随机森林,线性回归,SVR【完整代码(含注释)+数据集见原文链接】...

    建议:阅读2020.8.7的文章,完全了解GDBT和XGBT的原理. 机器学习- XGBoost,GDBT[过程:决策树,集成学习,随机森林,GDBT,XGBT,LightGBM] 本次实践内容: 数 ...

  3. 使用Ray Tune自动调参

    文章目录 前言 一.Ray Tune是什么? 二.使用步骤 1.安装包 2.引入库 3.读入数据(与Ray Tune无关) 4.构建神经网络模型(与Ray Tune无关) 5.模型的训练和测试(与Ra ...

  4. Auto ML自动调参

    Auto ML自动调参 本文介绍Auto ML自动调参的算法介绍及操作流程. 操作步骤 登录PAI控制台. 单击左侧导航栏的实验并选择某个实验. 本文以雾霾天气预测实验为例. 在实验画布区,单击左上角 ...

  5. sklearn快速入门教程:(四)模型自动调参

    上个教程中我们已经看到在sklearn中调用机器学习模型其实非常简单.但要获得较好的预测效果则需要选取合适的超参数.在实际的项目中其实也有不少参数是由工程师借助其经验手动调整的,但在许多场景下这种方式 ...

  6. XGBoost实战与调参优化

    本篇主要内容包括XGBoost的入门教学.调参优化,将之前自己遇到的问题细心的整理一遍:XGBoost参数繁多,所以如果要调参,就一定要知道每个参数的作用于意义,因此本人十分建议在实战之前对XGBoo ...

  7. pytorch使用Ray-tune对原有训练模型的代码改写,自动调参(一)

    借助Ray-tune可以对pytorch自动调参,下面就一步步地改写,从原始的训练代码慢慢变为可以自动调参的代码的教程• 保姆级: 文章目录 安装依赖 pytorch模型改写至自动调参 步骤1:原有代 ...

  8. 让AI自动调参,才是百度无人车的进化方式:适应环境全靠自己 | 论文

    车栗子 发自 凹非寺 量子位 出品 | 公众号 QbitAI  自动驾驶汽车,需要应对各式各样的路况,工作环境是每时每刻在变化的. 所以,训练好L4级的自动驾驶系统并不简单.需要依赖奖励函数 (R ...

  9. TensorFlow使用Keras Tuner自动调参

    TensorFlow使用Keras Tuner自动调参 数据集 归一化 图像分类模型 Hyperband 运行超参数搜索(自动调参) 获取最佳超参数 使用最佳超参数构建和训练模型 整体代码 代码地址: ...

最新文章

  1. win7计算机组策略打不开,win7系统gpedit.msc组策略打不开该怎么解决?方法步骤
  2. different application signatures解决方法
  3. C语言高级编程:sizeof计算数组大小需要注意的问题
  4. linux防火墙停用,关闭LINUX防火墙
  5. JAVA入门级教学之(猜数字测试)
  6. python configparser 空格_python的ConfigParser模块
  7. vb6,sql与access 获取当前日期
  8. 苹果连接电脑 计算机不显示硬盘,苹果连接电脑没反应怎么办?苹果连接电脑没反应解决方法...
  9. 人大金仓安装教程(windows)
  10. LeetCode剑指offer题目分类汇总及题解
  11. 微信H5域名被屏蔽被拦截的最新解决方案(微信域名防投诉)
  12. Using Vanishing Points for Camera Calibration
  13. linux 拍照软件有哪些,六款基于Linux的开源照片管理软件推荐
  14. 联想电脑bios设置u盘启动 windows安装 重装系统盘
  15. Linux 启动优化实战-2.41 秒启动应用!
  16. HEX转BCD ,HEX转ASCII,HEX转DEC 算法合集 | C语言实现
  17. 小花梨的字符串 ——java 美登杯
  18. 实验1 理想介质中的均匀平面波传播
  19. 一个可以添加商品、查询商品的程序,登录成功的话,再去操作,添加、查询商品,添加商品也是写在文件里面...
  20. 计算机软件 csc csu,4-TS-软件设计说明模板(GJB438A).doc

热门文章

  1. Windows 10 的新 bug 可导致任意文件被覆写
  2. 了解一下ES6: 函数简述深浅拷贝
  3. 安装rational rose
  4. Redis的zset有多牛?请把耳朵递过来
  5. redis事务不具有回滚机制,那么它是如何进行事务控制的
  6. Springboot中mongodb的使用
  7. 鼠标划过表格行变色效果JS
  8. linux terminal教程,Linux入门教程 - 如何记录和重放Linux终端会话
  9. java最基础语句,Java基础:Java语句
  10. android的动态注册,Android应用开发之BroadcastReceiver(广播)的静态注册和动态注册 --Android开发...