当前位置: 首页 > news >正文

湖南网站制作方案济南传承网络技术有限公司

湖南网站制作方案,济南传承网络技术有限公司,佛山大良网站建设,温州网络公司前十名文章目录lecture17#xff1a;XGBoost(eXtreme Gradient Boosting)目录1. XGBoost的基本信息2. XGBoost与GBDT的异同点3. XGBoost的原理3.1定义树的复杂度3.2 分裂节点3.3 自定义损失函数4. XGBoost的使用lecture17#xff1a;XGBoost(eXtreme Gradient Boosting) 目录 1. … 文章目录lecture17XGBoost(eXtreme Gradient Boosting)目录1. XGBoost的基本信息2. XGBoost与GBDT的异同点3. XGBoost的原理3.1定义树的复杂度3.2 分裂节点3.3 自定义损失函数4. XGBoost的使用lecture17XGBoost(eXtreme Gradient Boosting) 目录 1. XGBoost的基本信息 全称eXtreme Gradient Boosting 作者程天奇华盛顿大学博士 基础GBDT 所属boosting 迭代算法、树类算法 应用类型分类和回归 优点速度快效果好可以并行计算处理大量数据支持多种语言支持自定义损失函数正则化高度灵活性缺失值处理剪枝内置交叉验证在已有模型基础上继续训练等等 缺点发布时间短工业领域应用较少需要检验 参考博客 2. XGBoost与GBDT的异同点 相同点 xgboost是在GBDT的基础上对boosting算法进行的改进内部决策树使用的是回归树简单回顾GBDT如下 注意 XGBoost和GBDT本质的思想都是一种残差学习方式即当前的弱分类器的主要目标是学习上一个弱分类器的误差最后通过将所有的弱分类器集成在一起组成一个混合模型从而降低模型的方差和偏差。 不同点 如果不考虑工程实现、解决问题上的一些差异xgboost与gbdt比较大的不同就是目标函数的定义。如下图是XGBoost目标函数的定义 注意从目标函数的表达式可以看出XGBoost的目标函数主要分为加入一颗新树后模型的误差正则化项和一个常数项其中模型误差项可以将加入的新树看成∆X然后对L函数求泰勒展开就得到最下面的公式了从最下面的公式可以看出目标函数中的损失项包括上一颗树所在模型的损失当前加入新树后模型的一阶导数和加入新树后的二阶导数。XGBoost利用泰勒展开三项做一个近似我们可以很清晰地看到最终的目标函数只依赖于每个数据点的在误差函数上的一阶导数和二阶导数。正则化项包括对当前新加入的树叶子结点个数的约束L1正则化项和当前新加入树的叶子结点的权重的约束L2正则化项。 3. XGBoost的原理 对于上面给出的目标函数我们可以进一步化简 3.1定义树的复杂度 对于f的定义做一下细化把树拆分成结构部分q和叶子权重部分w。下图是一个具体的例子。结构函数q把输入映射到叶子的索引号上面去而w给定了每个索引号对应的叶子分数是什么 定义这个复杂度包含了一棵树里面节点的个数以及每个树叶子节点上面输出分数的L2模平方。 当然这不是唯一的一种定义方式不过这一定义方式学习出的树效果一般都比较不错。下图还给出了复杂度计算的一个例子 在这种新的定义下我们可以把目标函数进行如下改写其中I被定义为每个叶子上面样本集合 g是一阶导数h是二阶导数 注意 在上面的公式中由于误差项中的第一项是上一个树所在模型的误差与当前新加入的树无关所以为一个常数与目标函数的优化优化的目标是找到一颗最佳的树f(t)将误差降低无关可以省略于是误差项变成了一阶导数和二阶导数之和由于最终的样本都会划分到每个叶子节点上所以可以将最开始的样本的遍历换成叶子结点的遍历从而可以和正则化项中的L2项进行合并得到最终的公式如上图。 3.2 分裂节点 论文中给出了两种分裂节点的方法 1贪心法 每一次尝试去对已有的叶子加入一个分割且每次分割的目标就是使得损失函数最小 注意 XGBoost和决策树的构造准则不同它不在基于gini系数或者熵而是通过比较划分前和划分后对模型的损失之前推到的那个目标函数的影响来选出最佳的树节点的划分。 对于每次扩展我们还是要枚举所有可能的分割方案如何高效地枚举所有的分割呢我假设我们要枚举所有x a 这样的条件对于某个特定的分割a我们要计算a左边和右边的导数和 我们可以发现对于所有的a我们只要做一遍从左到右的扫描就可以枚举出所有分割的梯度和GL和GR。然后用上面的公式计算每个分割方案的分数就可以了。 观察这个目标函数大家会发现第二个值得注意的事情就是引入分割不一定会使得情况变好因为我们有一个引入新叶子的惩罚项。优化这个目标对应了树的剪枝 当引入的分割带来的增益小于一个阀值的时候我们可以剪掉这个分割。大家可以发现当我们正式地推导目标的时候像计算分数和剪枝这样的策略都会自然地出现而不再是一种因为heuristic启发式而进行的操作了。 **下面是论文中的算法 ** 2近似算法 主要针对数据太大不能直接进行计算 3.3 自定义损失函数 1常用损失函数 2一阶导数和二阶导数的推到 4. XGBoost的使用 1官方代码 #!/usr/bin/python import numpy as np import xgboost as xgb ### # advanced: customized loss function # print (start running example to used customized objective function)dtrain xgb.DMatrix(../data/agaricus.txt.train) dtest xgb.DMatrix(../data/agaricus.txt.test)# note: for customized objective function, we leave objective as default # note: what we are getting is margin value in prediction # you must know what you are doing param {max_depth: 2, eta: 1, silent: 1} watchlist [(dtest, eval), (dtrain, train)] num_round 2# user define objective function, given prediction, return gradient and second order gradient # this is log likelihood loss def logregobj(preds, dtrain):labels dtrain.get_label()preds 1.0 / (1.0 np.exp(-preds))grad preds - labelshess preds * (1.0-preds)return grad, hess# user defined evaluation function, return a pair metric_name, result # NOTE: when you do customized loss function, the default prediction value is margin # this may make builtin evaluation metric not function properly # for example, we are doing logistic loss, the prediction is score before logistic transformation # the builtin evaluation error assumes input is after logistic transformation # Take this in mind when you use the customization, and maybe you need write customized evaluation function def evalerror(preds, dtrain):labels dtrain.get_label()# return a pair metric_name, result# since preds are margin(before logistic transformation, cutoff at 0)return error, float(sum(labels ! (preds 0.0))) / len(labels)# training with customized objective, we can also do step by step training # simply look at xgboost.pys implementation of train bst xgb.train(param, dtrain, num_round, watchlist, logregobj, evalerror)2XGBoost调参 通用参数 这些参数用来控制XGBoost的宏观功能。 booster[默认gbtree] 选择每次迭代的模型有两种选择gbtree基于树的模型 gbliner线性模型 silent[默认0] 当这个参数值为1时静默模式开启不会输出任何信息。一般这个参数就保持默认的0因为这样能帮我们更好地理解模型 nthread[默认值为最大可能的线程数] 这个参数用来进行多线程控制应当输入系统的核数。如果你希望使用CPU全部的核那就不要输入这个参数算法会自动检测它。 还有两个参数XGBoost会自动设置目前你不用管它。接下来咱们一起看booster参数 booster参数 尽管有两种booster可供选择我这里只介绍tree booster因为它的表现远远胜过linear booster所以linear booster很少用到 eta[默认0.3] 和GBM中的 learning rate 参数类似。通过减少每一步的权重可以提高模型的鲁棒性。典型值为0.01-0.2。 min_child_weight[默认1] 决定最小叶子节点样本权重和。和GBM的 min_child_leaf 参数类似但不完全一样。XGBoost的这个参数是最小样本权重的和而GBM参数是最小样本总数。这个参数用于避免过拟合。当它的值较大时可以避免模型学习到局部的特殊样本。但是如果这个值过高会导致欠拟合。这个参数需要使用CV来调整。 max_depth[默认6] 和GBM中的参数相同这个值为树的最大深度这个值也是用来避免过拟合的。max_depth越大模型会学到更具体更局部的样本。需要使用CV函数来进行调优。典型值3-10 max_leaf_nodes 树上最大的节点或叶子的数量。可以替代max_depth的作用。因为如果生成的是二叉树一个深度为n的树最多生成n^2个叶子如果定义了这个参数GBM会忽略max_depth参数。 gamma[默认0] 在节点分裂时只有分裂后损失函数的值下降了才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。这个参数的值越大算法越保守。这个参数的值和损失函数息息相关所以是需要调整的。 max_delta_step[默认0] 这参数限制每棵树权重改变的最大步长。如果这个参数的值为0那就意味着没有约束。如果它被赋予了某个正值那么它会让这个算法更加保守。通常这个参数不需要设置。但是当各类别的样本十分不平衡时它对逻辑回归是很有帮助的。这个参数一般用不到但是你可以挖掘出来它更多的用处 subsample[默认1] 和GBM中的subsample参数一模一样。这个参数控制对于每棵树随机采样的比例。减小这个参数的值算法会更加保守避免过拟合。但是如果这个值设置得过小它可能会导致欠拟合。典型值0.5-1 典型值0.5-1 和GBM里面的max_features参数类似。用来控制每棵随机采样的列数的占比(每一列是一个特征)。典型值0.5-1 colsample_bylevel[默认1] 用来控制树的每一级的每一次分裂对列数的采样的占比。我个人一般不太用这个参数因为subsample参数和colsample_bytree参数可以起到相同的作用。但是如果感兴趣可以挖掘这个参数更多的用处。 lambda[默认1] 权重的L2正则化项。(和Ridge regression类似)。这个参数是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数但是这个参数在减少过拟合上还是可以挖掘出更多用处的 alpha[默认1] 权重的L1正则化项。(和Lasso regression类似)。可以应用在很高维度的情况下使得算法的速度更快。 scale_pos_weight[默认1] 在各类别样本十分不平衡时把这个参数设定为一个正值可以使算法更快收敛。 学习目标参数 这个参数用来控制理想的优化目标和每一步结果的度量方法。 objective[默认reg:linear] 这个参数定义需要被最小化的损失函数。最常用的值有 binary:logistic 二分类的逻辑回归返回预测的概率(不是类别)。multi:softmax 使用softmax的多分类器返回预测的类别(不是概率)。 在这种情况下你还需要多设一个参数num_class(类别数目)。 multi:softprob 和multi:softmax参数一样但是返回的是每个数据属于各个类别的概率。 eval_metric[默认值取决于objective参数的取值] 对于有效数据的度量方法。对于回归问题默认值是rmse对于分类问题默认值是error。典型值有 seed(默认0) 随机数的种子设置它可以复现随机数据的结果也可以用于调整参数 3Python中对XGBoost的使用 任务二分类存在样本不均衡问题scale_pos_weight参数可以加快训练速度 def xgboost_predict():import xgboost as xgb#xgboost start heredtest xgb.DMatrix(test_x)dval xgb.DMatrix(val_x , label val_y)dtrain xgb.DMatrix(x,label y)params {booster:gbtree,silent:1 ,#设置成1则没有运行信息输出最好是设置为0.#nthread:7,# cpu 线程数 默认最大eta: 0.007, # 如同学习率min_child_weight:3, # 这个参数默认是 1是每个叶子里面 h 的和至少是多少对正负样本不均衡时的 0-1 分类而言#假设 h 在 0.01 附近min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。#这个参数非常影响结果控制叶子节点中二阶导的和的最小值该参数值越小越容易 overfitting。max_depth:6, # 构建树的深度越大越容易过拟合gamma:0.1, # 树的叶子节点上作进一步分区所需的最小损失减少,越大越保守一般0.1、0.2这样子。subsample:0.7, # 随机采样训练样本colsample_bytree:0.7, # 生成树时进行的列采样 lambda:2, # 控制模型复杂度的权重值的L2正则化项参数参数越大模型越不容易过拟合。#alpha:0, # L1 正则项参数#scale_pos_weight:1, #如果取值大于0的话在类别样本不平衡的情况下有助于快速收敛。#objective: multi:softmax, #多分类的问题#num_class:10, # 类别数多分类与 multisoftmax 并用seed:1000, #随机种子#eval_metric: auc}watchlist [(dval,val),(dtrain,train)] xgboost_model xgb.train(params , dtrain , num_boost_round 3000 , evals watchlist)#xgboost_model.save_model(./xgboost.model)#predict the test setxgboost_predict_y xgboost_model.predict(dtest , ntree_limit xgboost_model.best_ntree_limit)DART将dropput思想引入XGBoost import xgboost as xgb # read in data dtrain xgb.DMatrix(demo/data/agaricus.txt.train) dtest xgb.DMatrix(demo/data/agaricus.txt.test) # specify parameters via map param {booster: dart,max_depth: 5, learning_rate: 0.1,objective: binary:logistic, silent: True,sample_type: uniform,normalize_type: tree,rate_drop: 0.1,skip_drop: 0.5} num_round 50 bst xgb.train(param, dtrain, num_round) # make prediction # ntree_limit must not be 0 preds bst.predict(dtest, ntree_limitnum_round) XGBoost在sklearn中的例子 from sklearn.model_selection import train_test_split from sklearn import metrics from sklearn.datasets import make_hastie_10_2 import xgboost as xgb #记录程序运行时间 import time start_time time.time() X, y make_hastie_10_2(random_state0) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.5, random_state0)##test_size测试集合所占比例#xgb矩阵赋值 xgb_train xgb.DMatrix(X_train, labely_train) xgb_test xgb.DMatrix(X_test,labely_test)##参数 params{ booster:gbtree, silent:1 ,#设置成1则没有运行信息输出最好是设置为0. #nthread:7,# cpu 线程数 默认最大 eta: 0.007, # 如同学习率 min_child_weight:3, # 这个参数默认是 1是每个叶子里面 h 的和至少是多少对正负样本不均衡时的 0-1 分类而言 #假设 h 在 0.01 附近min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。 #这个参数非常影响结果控制叶子节点中二阶导的和的最小值该参数值越小越容易 overfitting。 max_depth:6, # 构建树的深度越大越容易过拟合 gamma:0.1, # 树的叶子节点上作进一步分区所需的最小损失减少,越大越保守一般0.1、0.2这样子。 subsample:0.7, # 随机采样训练样本 colsample_bytree:0.7, # 生成树时进行的列采样 lambda:2, # 控制模型复杂度的权重值的L2正则化项参数参数越大模型越不容易过拟合。 #alpha:0, # L1 正则项参数 #scale_pos_weight:1, #如果取值大于0的话在类别样本不平衡的情况下有助于快速收敛。 #objective: multi:softmax, #多分类的问题 #num_class:10, # 类别数多分类与 multisoftmax 并用 seed:1000, #随机种子 #eval_metric: auc }plst list(params.items()) num_rounds 100 # 迭代次数watchlist [(xgb_train, train),(xgb_test, val)]#训练模型并保存 # early_stopping_rounds 当设置的迭代次数较大时early_stopping_rounds 可在一定的迭代次数内准确率没有提升就停止训练 model xgb.train(plst, xgb_train, num_rounds, watchlist,early_stopping_rounds100)#model.save_model(./model/xgb.model) # 用于存储训练出的模型 print(best best_ntree_limit,model.best_ntree_limit)y_pred model.predict(xgb_test,ntree_limitmodel.best_ntree_limit) print(error%f % ( sum(1 for i in range(len(y_pred)) if int(y_pred[i]0.5)!y_test[i]) /float(len(y_pred)))) #输出运行时长 cost_time time.time()-start_time print(xgboost success!,\n,cost time:,cost_time,(s)......)
http://www.huolong8.cn/news/376469/

相关文章:

  • 搜房网网站跳出率常州网络排名优化
  • 沈阳住房和城乡建设厅网站网站设计问题
  • 极速网站制作wordpress添加多语言
  • wordpress首页添加图片不显示seo做的最好的网站
  • 网站开发的可行性传奇官网
  • 网站开发 英文文章什么网站做展板的多
  • 塔城网站seo网站备案怎么这么麻烦
  • 上海松江做网站江苏建设工程安全监督网站
  • 网站开发部门工资会计分录德语网站制作
  • app网站建设公司做企业网站的要点
  • 焦作北京网站建设中油六建公司官网
  • 有关网站建设新闻资讯山东省示范校建设网站
  • 1920的网站做字体大小怎么做网站流量赚钱
  • 室内设计意向图网站成都旅游公司排名前十
  • 做网站运营有提成吗wordpress首页文章数量
  • h5网站用什么软件做输入网址一键生成app
  • 笔记本做网站服务器商城式网站具备哪些功能吗
  • 学习网站建设的书籍做资源的教育类网站或公司
  • 常用wap网站开发工具 手机网站制淘宝领券网站怎么做
  • 梅州网站建设梅州一键建站网站
  • 用什么网站开发巴西客户用python做网站和用php
  • 西安直播室网站建设望城经开区建设开发公司门户网站
  • 网站开发建设用的软件修改wordpress前端
  • 中交路桥建设有限公司网站访问国外网站速度慢
  • 简约 网站百度推广的网站怎么做
  • 长沙网站制作有哪些公司艺术设计专业学什么
  • 珠海一元夺宝网站建设室内设计入门教程
  • 机械设计师接私活的网站劳动合同模板免费
  • 高端大气网站源码合肥高端网站设计
  • 网站制作公司去哪找成都营销型网站建设