xgboost答疑解惑
source:https://www.jianshu.com/p/1083b6feb576
两种调用方式
- 自身接口
- 类似sklearn的接口
三种接口的调用方式见:添加链接描述
添加链接描述
Xgboost版本对比(原生版与sklearn接口版)
对比预测结果,原生xgb与sklearn接口的训练过程相同,结果也相同。
不同之处在于:
- 原生采用xgb.train()训练,sklearn接口采用model.fit() 。
- sklearn接口中的参数n_estimators在原生xgb中定义在xgb.train()的num_boost_round
- sklearnwatchlist为[(xtrain,ytrain),(xtest,ytest)]形式,而原生则是ain,‘train’),(dtest,‘test’)],在数据和标签都在DMatrix中,元组里可以定位输出时的名字。
- 举例
分别使用两个版本对同一个数据集进行测试
- 导入库
from sklearn.model_selection import train_test_split
from pandas import DataFrame
from sklearn import metrics
from sklearn.datasets import make_hastie_10_2
from xgboost.sklearn import XGBClassifier
import xgboost as xgb
import pandas as pd#准备数据,y本来是[-1:1],xgboost自带接口邀请标签是[0:1],把-1的转成1了。
X, y = make_hastie_10_2(random_state=0)
X = DataFrame(X)
y = DataFrame(y)
y.columns={"label"}
label={-1:0,1:1}
y.label=y.label.map(label)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)#划分数据集
- 用两个版本设定相同的参数,对数据集进行训练
1)XGBoost自带接口
#XGBoost自带接口
params={'eta': 0.3,'max_depth':3, 'min_child_weight':1,'gamma':0.3, 'subsample':0.8,'colsample_bytree':0.8,'booster':'gbtree','objective': 'binary:logistic','nthread':12,'scale_pos_weight': 1,'lambda':1, 'seed':27,'silent':0 ,'eval_metric': 'auc'
}
d_train = xgb.DMatrix(X_train, label=y_train)
d_valid = xgb.DMatrix(X_test, label=y_test)
d_test = xgb.DMatrix(X_test)
watchlist = [(d_train, 'train'), (d_valid, 'valid')]#sklearn接口
clf = XGBClassifier(n_estimators=30,#三十棵树learning_rate =0.3,max_depth=3,min_child_weight=1,gamma=0.3,subsample=0.8,colsample_bytree=0.8,objective= 'binary:logistic',nthread=12,scale_pos_weight=1,reg_lambda=1,seed=27)
watchlist2 = [(X_train,y_train),(X_test,y_test)]print("XGBoost_自带接口进行训练:")
model_bst = xgb.train(params, d_train, 30, watchlist, early_stopping_rounds=500, verbose_eval=10)
print("XGBoost_sklearn接口进行训练:")
model_sklearn=clf.fit(X_train, y_train, eval_set=watchlist2,eval_metric='auc',verbose=10, early_stopping_rounds=500)y_bst= model_bst.predict(d_test)
y_sklearn= clf.predict_proba(X_test)[:,1]
xgboost源码
一般使用xgboost直接用pip install安装即可,下载源码主要以学习为主。
下载使用命令:
git clone https://github.com/dmlc/xgboost
xgboost学习率与迭代次数
- 原生接口:迭代次数通过num_boost_round设置,学习率通过eta设置。
- sklearn接口:迭代次数通过 n_estimators设置,学习率通过 learning_rate设置
迭代次数越多,花费时间越长。
为优化这种情况,xgboost除了可以设置固定迭代次数以外,还可以根据评估,判断如果n次不再改进,则停止迭代(具体见eval部分)
学习率越高收敛越快,但也可能因为粒度太大,错过极值点。
调参方法:先粗调再细调,一开始将学习率设大一点,比如0.1-0.3,次数有说往大了调有说往小了调。待试验。
xgboost的eval系列参数
eval系列参数用于评估模型的状态,可以在每次迭代之后给模型打分,它本身与模型如何计算无关(无论它设成什么,最终模型都不变),只是评估当前模型好坏。这个功能非常重要,比如:有时候会看到在迭代过程中训练集评分提高,而测试集评分下降,一般就是过拟合了。使用它还可以控制当模型不再改进时,停止迭代(具体通过early_stopping_rounds设置)。
evals设置估计数据
evals可设置训练集和测试集,在每次迭代后用训练集和测试集代入模型,并给预测结果评分。eval_metric现成的评估函数
可以设置rmse,logloss,error,merror,mlogloss,auc,ndcg,map等xgb自带的评估函数。feval自定义评估函数
本例就需要自定义估伻函数,使用feval方法实现。它和梯度下降算法无法,主要用于显示,并判断何时终止迭代。最好别写太复杂,否则会延长计算时间。early_stopping_rounds自动停止迭代
通过early_stopping_rounds设置,如果在n轮内正确率没有提升,则退出迭代,具体根据evals给出的数据判断,若其中包含多组数据,则取最后一个。
如果设置了early_stopping_rounds,模型会生成三个属性,best_score, best_iteration, bst.best_ntree_limit,以便下次选择最合适的迭代次数。verbose_eval输出评估信息
如果设置为True输出评估信息,设置为数字,如5则每5次评估输出一次。
样本不均衡问题
设置scale_pos_weight
有时会遇到样本不均衡的问题,比如正例占99%,反例占1%,那么如果预测为全正例或者随机抽机,正确率也占99%。此时可使用scale_pos_weight提高反例权重,默认为1,不增加权重。DMatrix设置weight
使用xgb自带的调用接口 (非sklearn接口),需要把数据转成DMatrix格式,如果想给不同实例分配不同权重,可以转换时使用weight参数,它传入与实例个数等长的数组,数组中每个数对应一个实例的权重,在xgb每次迭代后调整权重时也会将它计算在内。
Xgboost的误差函数
Xgboost可以处理二分类,多分类,回归问题。处理不同问题,主要的区别在于指定不同的误差函数,xgboost会根据不同误差函数计算的结果调整权重进行下一次迭代。
通过参数objective可设置xgb自带的误差函数:回归一般用reg:xxx(如reg:linear),二分类用binary:xxx(如binary:logistic),多分类用multi:xxx(如multi:softmax)。误差函数的功能是通过训练集的label和预测值计算一阶梯度,二阶梯度,在源码中可以看到它们是如何实现的(C语言部分)。在调用train()训练时,也可以用参数obj自定义误差函数。
xgboost答疑解惑相关推荐
- 院长齐聚,答疑解惑 | 清华-青岛数据科学研究院“院长接待日”成功举办
2017年12月14日下午,清华-青岛数据科学研究院(以下简称:数据院)"院长接待日"活动在双清大厦四层成功举行.院长俞士纶.副院长王建民和执行副院长韩亦舜与来自校内不同院系对大数 ...
- DxOMARK如何测试音频质量?小编带你答疑解惑
昨日晚间,DxOMARK正式推出全新的手机音频评分系统DXOMARK Audio.根据结果来看,华为Mate 20 X获得75分,位列榜首,表现不俗.相信很多人都有一个疑问,那就是DXOMARK Au ...
- kicad绿油开窗_KICAD新手答疑解惑专帖
回复: 81 KICAD新手答疑解惑专帖 当前离线 精华汤圆VIP++ {*} (23407445) 出0入0汤圆 电梯直达 发表于 2020-3-23 22:18:37 | 只看该作者 |正序浏览 ...
- 李飞飞高徒Andrej Karpathy为大家答疑解惑
编者按:李飞飞高徒Andrej Karpathy2015年在斯坦福大学获得计算机科学专业博士,2016进入OpenAI工作,主要研究兴趣为:深度学习,生成模型和强化学习.2011至2015年先后在Go ...
- android答疑解惑 知识星球
借着几位好友推送星球,明哥也准备了下,今天谈下这个星球的目的. 这个念头,是一瞬间产生的.产生的原因是,感觉到困惑.很多朋友问我,你咋不写深安卓度文章了.按照你的水平,写出来肯定大卖. 嗨,自知能量如 ...
- 电子电气架构系列 —— 关于车载DoIP的一些答疑解惑
我是穿拖鞋的汉子,魔都中坚持长期主义的工程师. 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 好的生活不是拼命透支,而是款款而行.当我们被欲望追赶,步子迈得太快,就容易丧失自我.懂得 ...
- 新高考如何选科?职引专家问答为您答疑解惑
现在我们大多数省份的选科模式,是三加一加二,物理和历史两门科目必选其一,政治.生物.地理.化学四门科目选两科,一共有12种选科组合. 可是对于咱们高中生还有家长来说,选科关系到我们未来这个学习课程的难 ...
- 话里话外:新顾问答疑解惑对话大公开
提问人: malven.mao 解惑人:aaron.sun malven.mao: 对于某个项目,要列pdca, 但是我不确定某些问题可能会做多久, 会做成怎么样, 在这种情况下, 我该怎么来列计划? ...
- 新浪项目-------小知识点答疑解惑
1.IOS解惑(1)之@property(nonatomic,getter=isOn) BOOL on;中的getter解惑 //如果这个property是 BOOL on,那么Objc默认创建的 s ...
最新文章
- 二进制计算机课教案,计算机与二进制教案.pdf
- linux安装没有root权限
- silverlight实现2D人物动画
- ide快捷键_新买的固态硬盘用AHCI不能装系统,而用IDE却可以?问题就在这里
- Spark技术内幕: Task向Executor提交的源代码解析
- .NET Core + Kubernetes:StatefulSet
- 函数重载、引用再探、内联函数
- 力改变物体形状举例_人教版八年级物理下册第七章《力》知识点大全
- U盘安装CentOS 7错误 /dev/root does not exist, could not
- 圆通速递:2022年1月快递产品收入36.19亿元 同比增长20.09%
- linux 线程异常退出_Linux 进程必知必会
- sqlserver 2016 安装
- 总结数字签名实现身份验证
- 【IoT】STM32 文件系统 fatfs 移植笔记详解
- 告别脚本小子系列丨JAVA安全(6)——反序列化利用链(上)
- 相似度算法--莱文斯坦距离加入同义词逻辑
- Docker各操作系统安装方式及优缺点
- 哈工大软件构造2022笔记(持续更新----1)
- android7.0计时器代码,iCountTimer Pro(锻炼计时器)
- iw在java中什么意思,请问程序里piw和iw有什么区别