Hyperopttutorials:Xgboost+CVHyperopt \ tutorials: Xgboost + CVHyperopt tutorials:Xgboost+CV

前言

Xgboost中内置了交叉验证,如果我们需要在Hyperopt中使用交叉验证的话,只需要直接调用即可。前边我们依旧采用第一篇教程使用过的代码。如果你已经看过前一篇文章,那么我建议你直接跳到交叉验证部分。

与第一篇教程-如何使用hyperopt对xgboost进行自动调参相同的是,本处教程中的代码也可以很好的被套用。并且可以很好的迁移到lightgbm与catboost上面。源代码请前往Github教程地址下载下载。

加载数据

读取数据并分割

因为我们这里使用的是交叉验证因此我们也就不再需要,将数据集分割为三份了,只需要分割出百分之十的数据用于预测就好。注意随机数的问题。

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')]

利用交叉验证训练

训练模型

在之前的代码中,我将数据分割为 6:3:1,其分别为,训练数据,性能监视用数据,和最后的预测数据。这个比例只是为了示例用,并不具有代表性。

本处则主要介绍交叉验证方法。

交叉验证与Hyperopt结合

xgboost进行交叉验证与Hyperopt结合有两种方案,第一种方案是使用本身自带的CV方法,但是这种方案的存在一个问题,就是CV中无法直接传递分开的参数,而只能传递唯一参数params,因此我们需要先生成一个model,然后通过get_params()来获取参数,这种方式代码会稍微多几行。不过相较于与sklearn结合的形式,计算时间上则有很大的提升。

第二种方案:也可以直接使用sklearn.model_selection中的多种交叉验证方案,只将xgboost作为单个模型传入。但是个人并不建议这样做。首先是和sklearn的交互会一定程度上导致计算性能的下降,而且计算时间上差距可能会很大。所以个人建议只有在必要的时候,可以采用最传统的train_test_split方案时使用类似的代码结构,但是还是不适用和sklearn结合形式的交叉验证,具体怎么做会在其他例子中介绍。

使用CV方法进行交叉验证

直接使用xgboost中的cv方法进行交叉验证应该是最好的方案。唯一的问题是如何传入唯一的params参数。不知道为什么在我翻译玩hyperopt中文文档的这近一年,都没有见到有人写这一类的。有可能是没想到如何解决吧这个问题吧。

import hyperoptdef hyperopt_objective(params):model = xgb.XGBRegressor(max_depth=int(params['max_depth'])+5,learning_rate=params['learning_rate'],silent=1,objective='reg:linear',eval_metric='rmse',seed=619,nthread=-1,)res = xgb.cv(model.get_params(), dtrain, num_boost_round=10, nfold=5,callbacks=[xgb.callback.print_evaluation(show_stdv=False),xgb.callback.early_stop(3)])return np.min(res['test-rmse-mean']) # as hyperopt minimises
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)
[0]  train-rmse:3.24774  test-rmse:3.24823
Multiple eval metrics have been passed: 'test-rmse' will be used for early stopping.Will train until test-rmse hasn't improved in 3 rounds.
[1] train-rmse:2.07359  test-rmse:2.0891
[2] train-rmse:1.36012  test-rmse:1.40987
[3] train-rmse:0.928331 test-rmse:1.02378
[4] train-rmse:0.657333 test-rmse:0.827554
[5] train-rmse:0.488443 test-rmse:0.732572
[6] train-rmse:0.382361 test-rmse:0.690592
[7] train-rmse:0.310456 test-rmse:0.669706
[8] train-rmse:0.257609 test-rmse:0.661822
[9] train-rmse:0.216769 test-rmse:0.657073
[0] train-rmse:3.09603  test-rmse:3.09669
Multiple eval metrics have been passed: 'test-rmse' will be used for early stopping....[5]    train-rmse:0.511304 test-rmse:0.670014
[6] train-rmse:0.473608 test-rmse:0.65754
[7] train-rmse:0.450189 test-rmse:0.647339
[8] train-rmse:0.428634 test-rmse:0.642954
[9] train-rmse:0.410831 test-rmse:0.64032展示hyperopt获取的最佳结果,但是要注意的是我们对hyperopt最初的取值范围做过一次转换
{'learning_rate': 0.44307009444016143, 'max_depth': 0}

使用sklearn进行交叉验证

这里要注意的是运算速度上也是有一定差距的。而且可能很大。本例运行于我个人的笔记本(i7-5500u,Ubuntu18.04)时候,与sklearn结合的方案用时约是完全使用xgboost的3-6倍,而在我的另外一个系统上(i7-8750H,windows10),与sklearn结合的版本则只是xgboost的45%的运行时间。计算时间差异,也可能是由数据集的大小和硬件等多种原因造成的,因此具体情况建议自行实验。我在这里也很难给出一个较准确的答案。

def XGBRegressor_CV(params):from sklearn.model_selection import cross_val_scoremodel = xgb.XGBRegressor(max_depth=int(params['max_depth'])+5,learning_rate=params['learning_rate'],silent=1,objective='reg:linear',eval_metric='rmse',seed=619,nthread=-1,early_stopping_rounds=3)#     x_train, x_predict, y_train, y_predictmetric = cross_val_score(model, x_train, y_train, cv=5, scoring="neg_mean_squared_error")return min(-metric)
trials_2 = hyperopt.Trials()best_2 = hyperopt.fmin(XGBRegressor_CV,space=params_space,algo=hyperopt.tpe.suggest,max_evals=50,trials=trials_2,rstate=RandomState(123)
)print("\n展示hyperopt获取的最佳结果,但是要注意的是我们对hyperopt最初的取值范围做过一次转换")
print(best_2)
展示hyperopt获取的最佳结果,但是要注意的是我们对hyperopt最初的取值范围做过一次转换
{'learning_rate': 0.06047936704428278, 'max_depth': 4}

在Hyperopt框架下使用XGboost与交叉验证相关推荐

  1. 大数据分析实战-信用卡欺诈检测(二)-下采样方案和交叉验证

    第一部分已经写到这里了,看完第一部分再看这一部分:大数据分析实战-信用卡欺诈检测 文章目录 下采样方案 交叉验证 下采样方案 下采样方案的实现过程比较简单,只需要对正常样本进行采样,得到与异常样本一样 ...

  2. Kaggle上分技巧——单模K折交叉验证训练+多模型融合

    一.K折交叉验证训练单个模型 1.1 k 折交叉验证(K-Fold Cross Validation)原理 通过对 k 个不同分组训练的结果进行平均来减少方差,因此模型的性能对数据的划分就不那么敏感, ...

  3. 正则化、交叉验证、泛化能力

    一.正则化  1.模型选择典型的方式就是正则化.正则化就是结构风险最小化策略的实现,就是在经验风险项中添加一个郑泽华想或者叫做惩罚项.  正则化项与模型的关系一般是模型复杂度越高,正则化项的值就会越大 ...

  4. 交叉验证python_交叉验证

    交叉验证python Cross validation may be any of various model validation techniques that are used to asses ...

  5. [转载]「交叉验证」到底如何选择K值?

    「交叉验证」到底如何选择K值? 原文链接:https://cloud.tencent.com/developer/article/1410946 交叉验证(cross validation)一般被用于 ...

  6. 通过交叉验证寻找K近邻算法的最优K值

    问题引出 之前我们使用K近邻算法尝试寻找用户年龄与预估薪资之间的某种相关性,以及他们是否有购买SUV的决定.主要代码如下: from sklearn.neighbors import KNeighbo ...

  7. powerdesigner 概念模型_“使用满足”分析框架下社交媒体用户持续使用行为的概念模型研究...

    推文信息 张敏,孟蝶,张艳."使用-满足"分析框架下社交媒体用户持续使用行为的概念模型研究[J].信息资源管理学报,2020,10(01):92-101. "使用-满足& ...

  8. 【阿里妈妈数据科学系列】第二篇:在线分流框架下的AB Test

    背景 AB Test 是为同一目标制定两个方案,在同一时间维度,保证其他条件一致的情况下,分析实验组跟对照组的区别,根据不同的实验类型以及应用场景,产生了不同分桶逻辑的AB Test,包括在线分流及离 ...

  9. 基于《悉尼协议》框架下Java课程案例教学研究

    文章目录 基于<悉尼协议>框架下Java课程案例教学研究 一.Java课程教学存在问题 (一)Java课程目标定位不足 (二)Java课程教学存在的问题 1. 教材内容更新滞后 2. 学习 ...

最新文章

  1. android activityManager
  2. [Android] 底部菜单布局+PopupWindows实现弹出菜单功能(初级篇)
  3. springMVC两种方式实现多文件上传及效率比较
  4. java实现 支付宝支付
  5. Python操作文件和目录
  6. 主从模式在不同场景下的解释
  7. Ext核心代码分析之Function.createDelegate
  8. (Abstract Factory)抽象工厂模式的Java实现
  9. 全用户态网络开发套件F-Stack架构分析
  10. 反转链表与分组反转链表
  11. MySQL数据库安装教程
  12. 实验室纳新语音文字记录
  13. react之通俗易懂配置less
  14. JSTL自定义标签(三)
  15. nc63文件服务器,nc命令传输文件
  16. 9.6 多元函数微分学的几何应用
  17. Oasis montaj无法计算均衡重力异常
  18. C++取整数与取小数的函数和方法
  19. 转载 总结了一下十几年来的经验教训
  20. 深度学习下运维日志分析的趋势解读与应用实践

热门文章

  1. Fedora 与 Ubuntu 深度比较
  2. [Web 前端] mobx教程(二)-mobx主要概念
  3. Ubantu-16.04 eclipse安装
  4. 从源码编译InfluxDB
  5. 深度学习小技巧(二):如何保存和恢复scikit-learn训练的模型
  6. 利用ASP控制WEB打印代码方法集合
  7. 个人机房重构--七层实现登录
  8. 轻松理解https,So easy!
  9. 吃透了这些Redis知识点,面试官一定觉得你很NB
  10. 给转型做技术的同学的一些建议