標簽: 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跑一遍看看效果,所以在這里分享給大家如何操作,希望會對大家有所幫助
