如何使用hyperopt对Lightgbm进行自动调参

之前的教程以及介绍过如何使用hyperopt对xgboost进行调参,并且已经说明了,该代码模板可以十分轻松的转移到lightgbm,或者catboost上。而本篇教程就是对原模板的一次迁移,前半部分为教程-如何使用hyperopt对xgboost进行自动调参的迁移,后半部分是对在Hyperopt框架下使用XGboost与交叉验证的迁移。

关于Hyperopt

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

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

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

迁移一:自动调参

获取数据

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

import numpy as np
import pandas as pddef GetNewDataByPandas():wine = pd.read_csv("/home/fonttian/Data/UCI/wine/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自带的读取格式。

from sklearn.model_selection import train_test_split
# 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)import lightgbm as lgbtrain_data = lgb.Dataset(data=x_train,label=y_train)
test_data = lgb.Dataset(data=x_test,label=y_test)

定义参数空间

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

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

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

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

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

from sklearn.metrics import mean_squared_errordef lightgbm_factory(argsDict):argsDict = argsDict_tranform(argsDict)params = {'nthread': -1,  # 进程数'max_depth': argsDict['max_depth'],  # 最大深度'num_trees': argsDict['num_trees'],  # 树的数量'eta': argsDict['learning_rate'],  # 学习率'bagging_fraction': argsDict['bagging_fraction'],  # 采样数'num_leaves': argsDict['num_leaves'],  # 终点节点最小样本占比的和'objective': 'regression','feature_fraction': 0.7,  # 样本列采样'lambda_l1': 0,  # L1 正则化'lambda_l2': 0,  # L2 正则化'bagging_seed': 100,  # 随机种子,light中默认为100}params['metric'] = ['rmse']model_lgb = lgb.train(params, train_data, num_boost_round=300, valid_sets=[test_data],early_stopping_rounds=100)return get_tranformer_score(model_lgb)def get_tranformer_score(tranformer):model = tranformerprediction = model.predict(x_predict, num_iteration=model.best_iteration)return mean_squared_error(y_predict, prediction)

调用Hyperopt开始调参

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

# 开始使用hyperopt进行自动调参
algo = partial(tpe.suggest, n_startup_jobs=1)
best = fmin(lightgbm_factory, space, algo=algo, max_evals=20, pass_expr_memo_ctrl=None)
/home/fonttian/anaconda3/lib/python3.6/site-packages/lightgbm/engine.py:116: UserWarning: Found `num_trees` in params. Will use it instead of argumentwarnings.warn("Found `{}` in params. Will use it instead of argument".format(alias))[1]  valid_0's rmse: 0.793788
Training until validation scores don't improve for 100 rounds.
[2] valid_0's rmse: 0.776669
[3] valid_0's rmse: 0.762522
[4] valid_0's rmse: 0.749776
.........
[299]   valid_0's rmse: 0.562895
[300]   valid_0's rmse: 0.56334
Did not meet early stopping. Best iteration is:
[226]   valid_0's rmse: 0.560096

展示结果

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

RMSE = lightgbm_factory(best)
print('best :', best)
print('best param after transform :')
argsDict_tranform(best,isPrint=True)
print('rmse of the best lightgbm:', np.sqrt(RMSE))
[1]  valid_0's rmse: 0.793948
Training until validation scores don't improve for 100 rounds.
[2] valid_0's rmse: 0.776625
...
[239]   valid_0's rmse: 0.569307
Early stopping, best iteration is:
[139]   valid_0's rmse: 0.567378
best : {'bagging_fraction': 0.555, 'learning_rate': 0.0510231388682371, 'max_depth': 29, 'num_leaves': 265, 'num_trees': 629}
best param after transform :
{'bagging_fraction': 0.5555, 'learning_rate': 0.051020462777364745, 'max_depth': 34, 'num_leaves': 805, 'num_trees': 779}
rmse of the best lightgbm: 0.5964674105744058

迁移二-交叉验证

说明

其实本部分与之前的一样重点依旧在于Hyperopt与Lightgbm参数传入上的一个冲突,不过解决方案很简单,先构建带有Hyperopt参数空间的模型,然后再从构建的模型中获取参数。其实这点xgboost,hyperopt,catboost三个模型的解决方案都一样。catboost自带的教程中也有这种解决方案。只不过catboost自带的教程不和lightgbm与xgboost一样在自己的原项目里,而是在原账号下又额外开了个Github项目,导致不太容易发现。实际上我也是最近在写这个的时候,才发现catboost原来是自带教程的。也正因为如此,本系列教程就不再往catboost上迁移代码了。请自行参考catboost自带的教程

使用CV方法进行交叉验证

sklearn部分过于简单,本处将不再做迁移。如有需要请自行迁移。

import hyperopttrain_all_data = lgb.Dataset(data=x_train_all,label=y_train_all)def hyperopt_objective(params):model = lgb.LGBMRegressor(num_leaves=31,max_depth=int(params['max_depth']) + 5,learning_rate=params['learning_rate'],objective='regression',eval_metric='rmse',nthread=-1,)num_round = 10res = lgb.cv(model.get_params(),train_all_data, num_round, nfold=5, metrics='rmse',early_stopping_rounds=10)return min(res['rmse-mean']) # as hyperopt minimises
# 这里的warnings实在太多了,我们加入代码不再让其显示
import warnings
warnings.filterwarnings("ignore")from numpy.random import RandomStateparams_space = {'max_depth': hyperopt.hp.randint('max_depth', 6),'learning_rate': hyperopt.hp.uniform('learning_rate', 1e-3, 5e-1),
}trials = hyperopt.Trials()best = hyperopt.fmin(hyperopt_objective,space=params_space,algo=hyperopt.tpe.suggest,max_evals=50,trials=trials,rstate=RandomState(123)
)print("\n展示hyperopt获取的最佳结果,但是要注意的是我们对hyperopt最初的取值范围做过一次转换")
print(best)
展示hyperopt获取的最佳结果,但是要注意的是我们对hyperopt最初的取值范围做过一次转换
{'learning_rate': 0.059356676015000595, 'max_depth': 5}

额外的:CSDN与知乎

以后文章会做内容分级:主要内容将发布在知乎,首发仍然在CSDN,知乎只保留部分内容,而CSDN比较全面。CSDN会有的而知乎没有的:一些比较简单的内容,或者草稿。知乎主要发重点内容,以质量为主。

  • CSDN博客地址
  • 知乎主页

Lightgbm with Hyperopt相关推荐

  1. Hyperopt 入门指南

    Hyperopt:是进行超参数优化的一个类库.有了它我们就可以拜托手动调参的烦恼,并且往往能够在相对较短的时间内获取原优于手动调参的最终结果. 一般而言,使用hyperopt的方式的过程可以总结为: ...

  2. Hyperopt官方中文文档导读

    在2017年的圣诞节前,我翻译了有关HyperOpt的中文文档,这也时填补了空白,以此作为献给所有中国程序员,以及所有其他机器学习相关行业人员的圣诞礼物.圣诞快乐,各位. 更新 Hyperopt官方文 ...

  3. 使用hyperopt(Bayesian optimization)为lightGBM模型挑选最优参数进行模型构建、by Cross Validation

    使用hyperopt为lightGBM模型挑选最优参数进行模型构建.by Cross Validation lightGBM是微软开发的xgboost的改进版本.已经成为各种的比赛的标配工具,尤其是类 ...

  4. 机器学习调参与贝叶斯优化及其典型python实现hyperopt

    机器学习调参与贝叶斯优化及其典型python实现hyperopt hyperopt的详细实施参考笔者的如下文章: 使用hyperopt(Bayesian optimization)为lightGBM模 ...

  5. 在Hyperopt框架下使用XGboost与交叉验证

    Hyperopttutorials:Xgboost+CVHyperopt \ tutorials: Xgboost + CVHyperopt tutorials:Xgboost+CV 前言 Xgboo ...

  6. 如何使用hyperopt对xgboost进行自动调参

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

  7. 实战: 对GBDT(lightGBM)分类任务进行贝叶斯优化, 并与随机方法对比

    目录: 一. 数据预处理 1.1 读取&清理&切割数据 1.2 标签的分布 二. 基础模型建立 2.1 LightGBM建模 2.2 默认参数的效果 三. 设置参数空间 3.* 参数空 ...

  8. 超参数的调优(lightgbm)

    参考 原文 Automated Hyperparameter Optimization 超参数的优化过程:通过自动化 目的:使用带有策略的启发式搜索(informed search)在更短的时间内找到 ...

  9. 一文掌握模型调参神器:Hyperopt

    hyperopt是一个Python库,主要使用 ①随机搜索算法 ②模拟退火算法 ③TPE算法 来对某个算法模型的最佳参数进行智能搜索,它的全称是Hyperparameter Optimization. ...

最新文章

  1. js中的装饰器执行顺序
  2. 1080Ti 就搞定最新 SOTA 模型?一个普通研究生勇敢发毕业论文引起热议
  3. 分区文件http://wenku.baidu.com/view/d839d1868762caaedd33d4b7.html
  4. mysql数据库开启慢查询日志
  5. vmwars虚拟机上克隆centos7和centos6.5的网络配置
  6. 原生js实现Object.assign和Object.create
  7. java 气泡聊天消息_CSS3 巧妙实现聊天气泡
  8. Wi-Fi和WLAN有什么区别
  9. 学习c#不容错过的网站
  10. 使用lucene实现简单的全文检索
  11. Algorithm:贪心策略之区间覆盖问题
  12. webpack中如何使用vue
  13. 黑马程序员传智播客python 协程greenlet gevent学习笔记
  14. 配音软件文字转语音有哪些?
  15. 开源中最好的Web开发的资源
  16. html 图片下载浏览器默认会打开新页面预览图片解决方案
  17. 计算机主机箱内的硬件设备主要有哪些,电脑主机有哪些硬件设备
  18. canvas学习(html5)画画
  19. intellij IDEA更换主题为Darcula后中文项目名称变口(方框)的解决办法
  20. 今天14:00 | NeurIPS 专场三 青年科学家专场

热门文章

  1. swoole安装全纪录
  2. Magicodes.WeiChat——自定义knockoutjs template、component实现微信自定义菜单
  3. Verilog HDL程序设计——基本要素
  4. 科达南沙电子警察“扩编”
  5. 尽管苹果打死不认 但iCloud被破解是真的:媒体亲身验证
  6. 最近用到的几种前后端交互方式
  7. centos 安装testlink出现:You don't have permission to access /testlink on this server
  8. 一个妹子的美团面试经历,成功拿到 Offer
  9. 全文搜索引擎选 ElasticSearch 还是 Solr?
  10. Java线程详解(12)-有返回值的线程