当前位置:   article > 正文

从0开始玩一玩xgboost |官网demo | 可选目标函数 | 各种评价指标 | 特征重要度可视化_xgboost官网 demo

xgboost官网 demo

从业这么多年,说说对机器学习算法的认识。
关于分类问题,结构化数据的分类回归问题都可以用xgboost来解决;nlp的所有问题都可以抽象成分类问题,也就是nlp问题都可以用bert来解决,包括命名实体识别、实体关系抽取、实体链接(百度叫实体链指)等。有兴趣可以看这个基于bert的实体关系抽取,点我

这里说说xgboost怎么玩。


官网博客,点我

1.安装

mac安装,我直接:pip install xgboost安装报错(mac安装坑挺深),conda安装:conda install py-xgboost 就没有问题了,依赖什么的都会一起安装,省事。
在这里插入图片描述
要结合matplotlib画图工具一起使用的话一定要:conda install matplotlib进行安装,xgboost使用conda 安装,matplotlib再使用pip安装的话会出现环境污染问题,conda list查看环境情况会发现有两个版本的numpy、scipy,这是因为pip安装的源和conda安装的源不一样,默认版本不一样,不要混着使用。
在这里插入图片描述

2.运行报错:AttributeError: module ‘xgboost’ has no attribute ‘DMatrix’

修改文件名,你的文件名很可能是xgboost.py

3.输入数据格式 :libsvm

libsvm 使用的训练数据和检验数据文件格式如下:

[label] [index1]:[value1] [index2]:[value2] …
[label] [index1]:[value1] [index2]:[value2] …
  • 1
  • 2

label 目标值,就是说 class(属于哪一类),就是你要分类的种类,通常是一些整数。
index 是有顺序的索引,通常是连续的整数。就是指特征编号,必须按照升序排列
value 就是特征值,用来 train 的数据,通常是一堆实数组成。

详细见:地址,点我

4.mushroom数据

每个样本描述了蘑菇的22个属性,比如形状、气味等等(将22维原始特征用加工后变成了126维特征并存为libsvm格式),然后给出了这个蘑菇是否可食用。其中6513个样本做训练,1611个样本做测试。

libsvm格式数据下载(训练测试数据都在这里):下载地址,点我

5.跑一个最简单的demo
# coding=utf-8
import xgboost as xgb
import numpy as np

if __name__ == '__main__':
    # 读取数据
    data_train = xgb.DMatrix('agaricus_train.txt')
    data_test = xgb.DMatrix('agaricus_test.txt')

    # 设定相关参数,训练模型
    param = {'max_depth': 2, 'eta': 1, 'silent': 1, 'objective': 'binary:logistic'}
    n_round = 10
    model = xgb.train(param, data_train, num_boost_round=n_round)

    # 预测结果
    y_predict = model.predict(data_test)
    # 实际标签
    y_true = data_test.get_label()
    
    print('y_predict:', y_predict)
    print('y_true:', y_true)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

终端输出(可以看到预测结果和标签结果是一致的,阈值设置0.5即可):
在这里插入图片描述

6.可选目标函数(objective)

二分类问题一般选择:reg:logistic
多分类问题一般选择:multi:softmax

“reg:linear” —— 线性回归。
“reg:logistic”—— 逻辑回归。
“binary:logistic”—— 二分类的逻辑回归问题,输出为概率。
“binary:logitraw”—— 二分类的逻辑回归问题,输出的结果为wTx。
“count:poisson”—— 计数问题的poisson回归,输出结果为poisson分布。在poisson回归中,max_delta_step的缺省值为0.7(used to safeguard optimization)
“multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)
“multi:softprob” –和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。没行数据表示样本所属于每个类别的概率。
“rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
7.输出评价指标

如果不知道这些指标怎么计算,这篇博客帮你搞明白:
文章地址,点它:搞懂回归和分类模型的评价指标的计算:混淆矩阵,ROC,AUC,KS,SSE,R-square,Adjusted R-Square

from sklearn import metrics
print ('AUC: %.4f' % metrics.roc_auc_score(y_true,y_predict_prob))  # y_predict_prob是概率值
print ('ACC: %.4f' % metrics.accuracy_score(y_true,y_predict))
print ('Recall: %.4f' % metrics.recall_score(y_true,y_predict))
print ('F1-score: %.4f' %metrics.f1_score(y_true,y_predict))
print ('Precesion: %.4f' %metrics.precision_score(y_true,y_predict))
print(metrics.confusion_matrix(y_true,y_predict))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
8.特征重要度可视化
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
from xgboost import plot_importance
from matplotlib import pyplot as plt
plot_importance(model)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

效果:
在这里插入图片描述

9.输出top-n重要特征
feature_score = model.get_fscore()
feature_score = dict(sorted(feature_score.items(), key=lambda x: x[1], reverse=True))
  • 1
  • 2

输出:

{'f29': 48, 'f6': 44, 'f2': 36, 'f4': 20, 'f179': 18, 'f133': 16, 'f95': 12, 'f7': 10, 'f71': 10, 'f12': 10, 'f5': 10, 'f96': 8, 'f21': 6, 'f81': 6, 'f43': 6, 'f141': 6, 'f115': 6, 'f27': 4, 'f132': 4, 'f74': 4, 'f1': 4, 'f83': 4, 'f121': 4, 'f178': 4, 'f84': 4, 'f93': 4, 'f99': 4, 'f124': 4, 'f118': 2, 'f88': 2, 'f46': 2, 'f201': 2, 'f199': 2, 'f151': 2, 'f101': 2, 'f54': 2, 'f0': 2, 'f41': 2, 'f144': 2, 'f36': 2, 'f225': 2, 'f117': 2, 'f98': 2, 'f80': 2, 'f17': 2, 'f25': 2, 'f55': 2, 'f146': 2, 'f128': 2, 'f44': 2}
  • 1
10.如何调参

看这篇博客

11.xgboost相比GBDT的改进
算法层面

主要是两点:
1.损失函数的优化。xgboost损失函数是误差部分是二阶泰勒展开,GBDT 是一阶泰勒展开。因此损失函数近似的更精准。
2.节点分裂策略的优化。实现了利用分捅/分位数方法,实现了全局和局部的近似分裂点算法,降低了计算量,并且在eps参数设置合理的情况下,能达到穷举法几乎一样的性能

其他:
3.传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)
4.XGB加了正则项,普通GBDT没有。为了防止过拟合
5.对每颗子树增加一个参数,使得每颗子树的权重降低,防止过拟合,这个参数叫shrinkage,相当于学习速率(xgboost中的eta)
6.对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
7.列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。

系统层面

8.对每个特征进行分块(block)并排序,使得在寻找最佳分裂点的时候能够并行化计算。这是xgboost比一般GBDT更快的一个重要原因。
9.通过设置合理的block的大小,充分利用了CPU缓存进行读取加速(cache-aware access)。使得数据读取的速度更快。因为太小的block的尺寸使得多线程中每个线程负载太小降低了并行效率。太大的block尺寸会导致CPU的缓存获取miss掉。
10.block压缩与拆分。out-of-core 通过将block压缩(block compressoin)并存储到硬盘上,并且通过将block分区到多个硬盘上(block Sharding)实现了更大的IO 读写速度,因此,因为加入了硬盘存储block读写的部分不仅仅使得xgboost处理大数据量的能力有所提升,并且通过提高IO的吞吐量使得xgboost相比一般实利用这种技术实现大数据计算的框架更快。

12.RF与GBDT之间的区别

GBDT是一种boosting算法。boosting工作机制:先从初始训练集训练出一个基学习器,然后在根据基学习器的表现对训练样本分布进行调整,使得先前的基学习器做错的训练样本在后续获得更多关注(增加错误样本权重),然后基于调整后的样本分布训练下一个基学习器,如此重复,直到基学习器达到指定的T时,最终将T个基学习器进行加权结合,得出预测。

随机森林是对bagging算法的一点改动,但是更能体现样本集之间的差异性。会提高最终预测结果的泛化能力。

相同点

都是由多棵树组成
最终的结果都是由多棵树一起决定

不同点

1.组成随机森林的树可以分类树也可以是回归树,而GBDT只由回归树组成
2.组成随机森林的树可以并行生成,而GBDT是串行生成
3.随机森林的结果是多数表决,而GBDT则是多棵树累加之和表决的
4.随机森林对异常值不敏感,而GBDT对异常值比较敏感
5.随机森林是通过减少模型的方差来提高性能,而GBDT是减少模型的偏差来提高性能的
6.随机森林不需要进行数据预处理,即特征归一化。而GBDT则需要进行特征归一化

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/97448
推荐阅读
相关标签
  

闽ICP备14008679号