美文网首页
xgboost分类算法

xgboost分类算法

作者: 炼己者 | 来源:发表于2018-09-21 23:55 被阅读686次

    标签: xgboost
    作者:炼己者


    欢迎大家访问我的简书以及我的博客
    本博客所有内容以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,并且是非商业用途,谢谢!


    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分类算法

          本文链接:https://www.haomeiwen.com/subject/zrwznftx.html