1.简介

该部分是代码整理的第二部分,为了方便一些初学者调试代码,作者已将该部分代码打包成一个工程文件,包含简单的数据处理、xgboost配置、五折交叉训练和模型特征重要性打印四个部分。数据处理部分参考:代码整理一,这里只介绍不同的部分。本文主要是介绍一些重点的参数部分,一是方便自己以后再次查询,也希望帮助一些初学者快速的使用该项目,应用到自己的工程或者比赛中。如果只是想要阅读代码,可直接移步到尾部链接。

2. 数据处理

data = pd.concat([train_data, test_data])
cate_feature = ['gender', 'cell_province', 'id_province', 'id_city', 'rate', 'term']
for item in cate_feature:data[item] = LabelEncoder().fit_transform(data[item])item_dummies = pd.get_dummies(data[item])item_dummies.columns = [item + str(i + 1) for i in range(item_dummies.shape[1])]data = pd.concat([data, item_dummies], axis=1)
data.drop(cate_feature,axis=1,inplace=True)

该部分在lightgbm中只进行了labelEncoder编码处理,然后通过categorical_feature变量处理,在lightgbm中使用了类别特征的最优切分进行了处理,具体详情参考:柯国霖大佬的回答。xgboost中没有对类别特征做处理,这里对其进行了onehot编码处理。而在工程中,如果类别过多,我一般会放弃进行onehot,主要是由于进行onehot会导致特征过于稀疏,运算速度变慢,严重影响模型的迭代速度,并且最终对结果提升很有限,我通常只会进行labelEncoder, 也可以对特征进行embeding处理。

3.模型

3.1 参数

和lightgbm一样,xgboost也是使用key-value字典的方式存储参数,下面给出的事二分类的参数

params = {'booster': 'gbtree','objective': 'binary:logistic','eval_metric': 'auc','gamma': 0.1,'max_depth': 8,'alpha': 0,'lambda': 0,'subsample': 0.7,'colsample_bytree': 0.5,'min_child_weight': 3,'silent': 0,'eta': 0.03,'nthread': -1,'seed': 2019,
}

  • objective:目标函数
  • 二分类:常用的是binary:logistic
  • 多分类:multi:softmax,当是多分类任务时需要指定类别数量,eg:'num_class':33;
  • 回归任务:reg:linear
  • eval_metric:评价函数,如果该参数没有指定,缺省值是通过目标函数来做匹配,
  • 二分类:常用auclogloss
  • 多分类:mlogloss
  • 回归任务:均方误差:mse,均方根误差:rmse, 平均绝对值误差:mae
  • gamma:用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子
  • max_depth:树的深度,对结果影响较大,越深越容易过拟合
  • alpha:L1正则,树的深度过大时,可以适大该参数
  • lambda:L2正则
  • subsample:随机采样的比率,通俗理解就是选多少样本做为训练集,选择小于1的比例可以减少方差,即防止过拟合
  • colsample_bytree:这里是选择多少列作为训练集,具体的理解就是选择多少特征
  • min_child_weight:决定最小叶子节点样本权重和。当它的值较大时,可以避免模型学习到局部的特殊样本。但如果这个值过高,会导致欠拟合
  • eta:学习率
  • silent: 是否打印训练过程中的信息,0表示打印,1反之
  • nthread:运行的线程数,-1所有线程,该值需要根据具体情况调整,线程对最终结果有一点影响,曾今测试,线程越多,结果会变差一丢丢
  • seed:这个随机指定一个常数,防止每次结果不一致

3.2 五折交叉

folds = KFold(n_splits=5, shuffle=True, random_state=2019)

采用五折交叉统计实际就是训练多个模型和平均值融合,如果时间允许的情况下10折交叉会好于5折。5折交叉还可以采用StratifiedKFold做切分。

3.3 数据加载

XGBoost可以加载多种数据格式的训练数据:libsvm 格式的文本数据、Numpy 的二维数组、XGBoost 的二进制的缓存文件。加载的数据存储在对象 DMatrix 中,而llightgbm是存储在Dataset中

trn_data = xgb.DMatrix(train_x.iloc[trn_idx], label=train_y[trn_idx])
val_data = xgb.DMatrix(train_x.iloc[val_idx], label=train_y[val_idx])

3.4 训练和预测

##训练部分
watchlist = [(trn_data, 'train'), (val_data, 'valid')]
clf = xgb.train(params, trn_data, num_round, watchlist, verbose_eval=200, early_stopping_rounds=200)##预测部分
test_pred_prob += clf.predict(xgb.DMatrix(test), ntree_limit=clf.best_ntree_limit) / folds.n_splits

  • params:参数字典
  • trn_data :训练的数据
  • num_round:迭代次数
  • watchlist:这是一个列表,用于对训练过程中进行评估列表中的元素。形式是evals =[(dtrain,’train’),(dval,’val’)]或者是evals =[(dtrain,’train’)],对于第一种情况,它使得我们可以在训练过程中观察验证集的效果。
  • verbose_eval: 如果为True ,则对evals中元素的评估结果会输出在结果中;如果输入数字,假设为5,则每隔5个迭代输出一次。
  • ntree_limit:验证集中最好的结果做预测

4.模型重要性

模型重要性是根据树模型中该特征的分裂次数做统计的,可以基于此重要性来判断特种的重要程度,深入的挖掘特征,具体代码如下:

##保存特征重要性
fold_importance_df = pd.DataFrame()
fold_importance_df["Feature"] = clf.get_fscore().keys()
fold_importance_df["importance"] = clf.get_fscore().values()
fold_importance_df["fold"] = fold_ + 1
feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)##特征重要性显示
## plot feature importance
cols = (feature_importance_df[["Feature", "importance"]] .groupby("Feature").mean().sort_values(by="importance", ascending=False).index)
best_features = feature_importance_df.loc[feature_importance_df.Feature.isin(cols)].sort_values(by='importance',ascending=False)
plt.figure(figsize=(8, 15))
sns.barplot(y="Feature", x="importance",data=best_features.sort_values(by="importance", ascending=False))
plt.title('LightGBM Features (avg over folds)')
plt.tight_layout()
plt.savefig('../../result/xgb_importances.png')

在lightgbm中对应的事clf.feature_importance()函数,而在xgboost中对应的是clf.get_fscore()函数。如果特征过多无法完成显示,可以只取topN显示,如只显示top5

cols = (feature_importance_df[["Feature", "importance"]].groupby("Feature").mean().sort_values(by="importance", ascending=False)[:5].index)

5.小总结

xgboost和lightgbm对比,它的速度会慢很多,使用也没有lighgbm方便,但是可以将xgboost训练的结果和lightgbm做融合,提升最终的结果。

代码地址:data_mining_models

. 写在最后

欢迎关注作者和专栏,和作者一块成长:ML与DL成长之路,

推荐关注公众号:AI成长社,ML与DL的成长圣地。

同时推荐鱼佬专栏,学习更对竞赛知识,机器学习理论与数据竞赛实战


推荐阅读

【lightgbm/xgboost/nn代码整理一】lightgbm做二分类,多分类以及回归任务

【lightgbm/xgboost/nn代码整理三】keras做二分类,多分类以及回归任务

【lightgbm/xgboost/nn代码整理四】pytorch做二分类,多分类以及回归任务

libsvm回归参数寻优cgp_【lightgbm/xgboost/nn代码整理二】xgboost做二分类,多分类以及回归任务...相关推荐

  1. 人工鱼群算法参数寻优及可视化(Matlab代码实现)

               目录

  2. libsvm安装使用及网格搜索法参数寻优

    LIBSVM 是台湾大学林智仁( Chih-Jen Lin)教授开发的. 说明:本教程仅针对电脑为64位的计算机,如果是32位的计算机需要下载C语言编辑器进行手动编译. 1.下载libsvm ①下载地 ...

  3. R语言caret包构建xgboost模型实战:特征工程(连续数据离散化、因子化、无用特征删除)、配置模型参数(随机超参数寻优、10折交叉验证)并训练模型

    R语言caret包构建xgboost模型实战:特征工程(连续数据离散化.因子化.无用特征删除).配置模型参数(随机超参数寻优.10折交叉验证)并训练模型 目录

  4. MATLAB中使用LIBSVM进行SVM参数寻优

    MATLAB中使用LIBSVM进行SVM参数寻优 一些资源网站 配置 svmtrain svmParams -t:表示选择的核函数类型 -g为核函数的参数系数 -c为惩罚因子系数 -v为交叉验证的数, ...

  5. lssvm回归 matlab,用lssvm做回归预测,预测的结果偏差很大,如何进行参数寻优

    本帖最后由 xzlcqxy 于 2016-3-30 15:19 编辑 %清除变量空间 clc;clear;close all %% %数据导入.预处理 t=[0 6 10 11 12 13 14 15 ...

  6. 如何使用matlab参数寻优,LIBSVM在matlab中使用小结

    安装环节: 以下我说一下,我安装过程中所遇到的困难 1.matlab未安装完整导致编译后libsvm仍无法使用 对于32位的系统,libsvm没有现成的命令执行文件供matlab调用,因此需要我们自己 ...

  7. 自定义函数使用GridSearchCV参数寻优

    自定义函数使用GridSearchCV参数寻优 GirdSearchCV and RandomizedSearchCV 自定义函数中使用GirdSearchCV GridSearchCV参数说明 Gr ...

  8. python中算法(sklearn)的最优超参数寻优:skopt贝叶斯搜索

    python中算法(sklearn)的最优超参数寻优:skopt贝叶斯搜索 Jeff Dean在ICML 2019上进行了有关AutoML的演讲,并将自动化分为4个级别 手动构造预测变量,不引入学习的 ...

  9. python模拟退火(Simulated Annealing)参数寻优实战

    python模拟退火(Simulated Annealing)参数寻优实战 目录 python模拟退火(Simulated Annealing)参数寻优实战 模拟退火 模拟退火算法流程

最新文章

  1. [转]常见的动态规划问题分析与求解
  2. sql取字段前4位_4千左右预算,2020年Word/Excel/用友/ 金蝶/SQL数据库-财务会计轻薄笔记本推荐...
  3. 04-程序计数器(PC计数器)
  4. Redis数据库(三)——(主从复制、哨兵模式、集群)
  5. java多线程新特性
  6. cocos2dx setVisible 与setEnabled 小实例
  7. 子进程和父进程的结论_Python的多进程不是随便用滴!
  8. 具体数学-第10课(素数和阶乘的有趣性质)
  9. NoSuchMethod: ByteBuffer.position(I)
  10. html 两个表合并,SQL中将两个表合并成一个新表
  11. vbscript 微软教程网址
  12. ValueError: operands could not be broadcast together with remapped shapes 解决方法
  13. 极速办公(Excel)如何方框内打勾
  14. 大数据告诉您:采用IT人才外包的优势
  15. 花 作品php,《不谢之花》作品赏析
  16. mysql中根据部门名称生成部门简称(根据某一列的关键字在另一列生成特定值)
  17. CAD设置在标题中显示完整路径
  18. 渗透测试笔记 -------------持续更新中~
  19. AudioVstPlayer1.2(本地音乐+51个VST插件槽位管理_免费纯净音频播放器)2023.04.24
  20. android 获取父容器的背景,Android笔记--Fragment获取父Activity的控件并修改内容demo...

热门文章

  1. checkbox保存和赋值
  2. CentOS 7 gedit编辑器中文乱码解决方法
  3. UML类图画法及类之间几种关系
  4. 实现DIV居中布局三种途径(转)
  5. Xml文档添加节点和属性
  6. python笔记(五) - 获取对象的引用
  7. VS2019编译 当前最新版chromium
  8. gcc、arm-linux-gcc和arm-elf-gcc的关系?
  9. ESP32 coredump 分析
  10. ubyntu 链接mysql_ubuntu mysql远程连接