标签: xgboost

作者:炼己者

欢迎大家访问我的简书以及我的博客

本博客所有内容以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,并且是非商业用途,谢谢!

大家如果感觉格式看着别扭的话,也可以去我的简书里看,这里面markdown的编辑效果不错

1.摘要

  • xgboost 是个很棒的算法,基本上遇到分类问题,都会先拿xgboost跑一跑,因为它的效果是很好的。此算法源自陈天奇大佬,它的原理我就不多说了,可以去看大神的论文。
  • 本文主要介绍xgboost算法的实现。xgboost算法有两种方法可以实现,第一种就是调用sklearn库,第二种就是网上下载的xgboost包

2.操作思路

(1)调用sklearn库的xgboost算法来进行文本分类

  • 第一步:把文本转为TFIDF向量

这里面就涉及到了文本的预处理了,有很多操作,套路是固定的。比如去停用词,去掉一些指定的奇怪符号,分词等操作。详情大家可以看这篇文章——中文文本的预处理 。对于怎么用sklearn库将文本转为TFIDF向量,大家可以看这篇文章——使用不同的方法计算TF-IDF值

  • 第二步:调用sklearn的xgboost算法
from xgboost import XGBClassifier
xgbc = XGBClassifier()
xgbc.fit(X_train, y_train)

X_train, y_train数据格式符合sklearn的要求即可,这里不再赘述,其实直接调用sklearn计算tfidf的方法就可以了

(2)调用xgboost库来进行文本分类

首先下载xgboost算法包,从下面这个网址就可以找到windows版本的了

https://www.lfd.uci.edu/~gohlke/pythonlibs/

看了网上很多文章,好多都不直截了当地把数据给你看,竟说一些虚的。你不知道这个算法包所要求的数据格式,那该怎么操作。

所以我们首先看一下xgboost算法包所要求的数据格式

-1 3367:0.5103014996095588 58258:0.7395069334859974 2027:0.43900099637970286 100000:0
-1 4:1.0 100000:0
-1 415:0.6398192123775941 1519:0.4588776849973563 416:0.3584690940979446 1793:0.40344923876987276 181:0.2979786334564799 100000:0
-1 100000:0
-1 1198:0.40847247591945973 2696:0.3283454215475906 4177:0.44923012253203026 5138:0.5667874369451246 793:0.322578190068597 89:0.3134120772849428 100000:0
-1 5723:0.7442708333186842 11957:0.667877927971206 100000:0
-1 1242:0.291656345459087 1042:0.5230367071957044 867:0.201093108317622 4653:0.12886942653591874 1677:0.11557567851702705 401:0.09045277190046198 1418:0.37780570665526336 23187:0.17435885282574362 19413:0.18153924925026366 47353:0.21588503167788953 26486:0.1776484644780567 140:0.06556371798587017 3552:0.3134346764736389 9923:0.14897284990847234 4235:0.1400130703981178 10074:0.201093108317622 5003:0.1400130703981178 477:0.059368723610437456 3138:0.12432562118943459 18158:0.19244038783832423 11634:0.13464996157113307 100000:0
-1 4009:0.25082607952773406 2565:0.23419907434673645 1804:0.3433315414553655 17453:0.45143782878931465 5423:0.3564658009755151 19011:0.4717358825927435 3323:0.3780312936247865 4965:0.26087188739580747 100000:0
-1 22:0.1587631734435183 412:0.1300669379236184 413:0.22962362689914045 414:0.9071773544857186 181:0.15109135553114256 415:0.16221155015652758 416:0.1817633053585686 100000:0
-1 1384:0.7633678190724622 1:0.6459640646387018 100000:0
-1 2:0.6671390512446658 4915:0.7449332092908513 100000:0

每一行表示一个样本,我们用第一行举例,开头的“-1”是样本的类别(也就是标签)。剩下的数据比如这个,"3367:0.5103014996095588",左边的3367是指词的ID值,右边就是TFIDF值。是不是感觉很眼熟,没错,用gensim库计算的TFIDF值就可以得到这种格式。

还是看那篇文章——使用不同的方法计算TF-IDF值

给大家看一下用gensim得到TFIDF的格式

[[(0, 0.33699829595119235),
(1, 0.8119707171924228),
(2, 0.33699829595119235),
(4, 0.33699829595119235)],
[(0, 0.10212329019650272),
(2, 0.10212329019650272),
(4, 0.10212329019650272),
(5, 0.9842319344536239)],
[(6, 0.5773502691896258), (7, 0.5773502691896258), (8, 0.5773502691896258)],
[(0, 0.33699829595119235),
(1, 0.8119707171924228),
(2, 0.33699829595119235),
(4, 0.33699829595119235)]]

所以接下来把用gensim训练得到的TFIDF向量转为我们需要的数据格式即可

我在这里写个示例代码,大家仿照着做即可,至于标签的写入仿照着来就行

a = [[(0, 0.33699829595119235),
(1, 0.8119707171924228),
(2, 0.33699829595119235),
(4, 0.33699829595119235)],
[(0, 0.10212329019650272),
(2, 0.10212329019650272),
(4, 0.10212329019650272),
(5, 0.9842319344536239)],
[(6, 0.5773502691896258), (7, 0.5773502691896258), (8, 0.5773502691896258)],
[(0, 0.33699829595119235),
(1, 0.8119707171924228),
(2, 0.33699829595119235),
(4, 0.33699829595119235)]] with open('test.txt','w',encoding='utf-8') as fw:
for i in range(len(a)):
for j in range(len(a[i])):
fw.write(str(a[i][j][0]) + ":" + str(a[i][j][1]) + '\n')

由上面代码可输出:

0:0.33699829595119235
1:0.8119707171924228
2:0.33699829595119235
4:0.33699829595119235
0:0.10212329019650272
2:0.10212329019650272
4:0.10212329019650272
5:0.9842319344536239
6:0.5773502691896258
7:0.5773502691896258
8:0.5773502691896258
0:0.33699829595119235
1:0.8119707171924228
2:0.33699829595119235
4:0.33699829595119235

数据转换好之后,我们可以正式操作了

A. 导入数据包

import xgboost as xgb

B. XGBoost自定义了一个数据矩阵类DMatrix,将我们的数据转为矩阵

  • temp_train.txt 和 temp_test.txt就是我们的前面转换好的数据
dtrain = xgb.DMatrix('temp_train.txt')
dtest = xgb.DMatrix('temp_test.txt')

C. 训练并保存模型

  • 模型参数
param = {'max_depth':2,'eta':1,'silent':0,'objective':'binary:logistic'}
num_round = 2
  • 训练模型并保存模型
bst = xgb.train(param,dtrain,num_round)
bst.save_model('xgboost.model')
  • 预测标签(xgboost得到的是预测标签的概率,所以我们要将其转为标签)
preds = bst.predict(dtest) # 得到的是第一类别的概率
p_label = [round(value) for value in preds] # 得到预测标签

3. 总结

xgboost是一个很好的算法,一般的分类比赛都会先用xgboost跑一遍看看效果,所以在这里分享给大家如何操作,希望会对大家有所帮助

xgboost算法教程(两种使用方法)的更多相关文章

  1. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  2. Linux系统中存储设备的两种表示方法

    转:https://blog.csdn.net/holybin/article/details/38637381 一.对于IDE接口的硬盘的两种表示方法: 1.IDE接口硬盘,对于整块硬盘的两种表示方 ...

  3. win7系统不能用telnet命令的两种解决方法

    电脑专业人员对telnet命令都不陌生了,Telnet当成一种通信协议,在日常工作中,经常面对网络问题的人都会用到telnet命令,因为简单有效,可以帮助更快的找出问题.要是在使用过程中碰到win7纯 ...

  4. 两种js方法发起微信支付:WeixinJSBridge,wx.chooseWXPay区别

    原文链接:https://www.2cto.com/weixin/201507/412752.html 1.为什么会有两种JS方法可以发起微信支付? 当你登陆微信公众号之后,左边有两个菜单栏,一个是微 ...

  5. keil结合st-link使用SWO的两种调试方法笔记

    通过strongerHuang的教程,实现了SWO的两种调试方法, 1.在keil调试的过程中,使用debug printf viewer打印信息, 2.在STM32 ST-LINK Utility中 ...

  6. 电脑出现kernelbase.dll错误的两种解决方法

    KernelBase.dll是Windows操作系统的重要文件,它为各种应用程序提供服务.如果电脑提示kernelbase.dll错误,这该怎么处理?大家可以用电脑自带的防火墙或者是第三方软件来进行故 ...

  7. git两种合并方法 比较merge和rebase

    18:01 2015/11/18git两种合并方法 比较merge和rebase其实很简单,就是合并后每个commit提交的id记录的顺序而已注意:重要的是如果公司用了grrit,grrit不允许用m ...

  8. 两种Ajax方法

    两种Ajax方法 Ajax是一种用于快速创建动态网页的技术,他通过在后台与服务器进行少量的数据交换,可以实现网页的异步更新,不需要像传统网页那样重新加载页面也可以做到对网页的某部分作出更新,现在这项技 ...

  9. mysql in 的两种使用方法

    简述MySQL 的in 的两种使用方法: 他们各自是在 in keyword后跟一张表(记录集).以及在in后面加上字符串集. 先讲后面跟着一张表的. 首先阐述三张表的结构: s(sno,sname. ...

随机推荐

  1. 【[SCOI2016]背单词】

    这是一道贪心题 刚开始yy出来一个比较\(sb\)的贪心 之后发现它错了 首先这道题得先把题面翻译成人话 如果存在一个单词是它的后缀,且当前没被填入,代价为\(n*n\): 如果不存在一个单词是它的后 ...

  2. nowcoder模拟赛

    R1 D1 普及组... T1/T2 咕 T3 链接:C 小A有一个只包含左右括号的字符串S.但他觉得这个字符串不够美观,因为它不是一个合法的括号串.一个合法的括号串是这样定义的: ()是合法的括号串 ...

  3. Kali-linux使用SET实施攻击

    前面介绍了社会工程学工具包(SET)的简单使用.为了能帮助用户更容易的理解社会工程学的强大功能.本节将介绍使用社会工程学工具包实施各种攻击. 7.4.1 针对性钓鱼攻击向量 针对性钓鱼攻击向量通过构造 ...

  4. springmvc与Structs2本质区别

    1.前端控制器不同:structs2入口是一个filter过滤器,springmvc入口是一个servlet. 2.设计思想不同: struts2通过在action类中定义成员变量接收请求参数,str ...

  5. iOS:cocoapods 配置相关(19-04-02更)

    1.gem sources 2.libwebp 1.gem sources 因为,mac更新,cocoapods也要更新,使用下面指令,提示找不到.org,原因是淘宝的镜像源.org换成.com,所以 ...

  6. python 实现查找某个字符在字符串中出现次数,并以字典形式输出

    把字符串'aenabsascd'中的字符出现的次数统计出来,并以字典形式输出 方法一: def count_str(str): dic={} for i in str: dic[i]=str.coun ...

  7. iOS通过切片仿断点机制上传文件

    项目开发中,有时候我们需要将本地的文件上传到服务器,简单的几张图片还好,但是针对iPhone里面的视频文件进行上传,为了用户体验,我们有必要实现断点上传.其实也不是真的断点,这里我们只是模仿断点机制. ...

  8. javascript编写的一个完整全方位轮播图效果

    1 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...

  9. Shell学习——子shell操作记录转储

    概述 主要介绍子shell历史操作记录的保存以及解析,比如python, scala等,用于(准)实时监控用户行为. 背景 一级shell的历史操作记录已由系统实现,当用户从开始登录shell(这里指 ...

  10. 内置函数--eval

    eval参数是一个字符串, 可以把这个字符串当成表达式来求值, 比如'x+2'就是一个表达式字符串>>> x = 2>>> print (eval('x+2'))2 ...