【重磅】終於有人把XGboost講明白了,原來是這樣

2021-02-20 python充電站

互聯快訊:

據北京市生活垃圾分類治理行動計劃:年底前,全市垃圾分類示範片區覆蓋率將達到60%,明年底達到90%。目前,分類標準為廚餘垃圾、其它垃圾、有害垃圾、可回收物4類;居民將垃圾分好送到投放點,廚餘垃圾每公斤獲得2個積分,可回收物每公斤積16分,積分可換取日用品。(財聯社)

以後帝都的居民每天的日常應該是這樣的

 好久沒有更新了,今天更新一下xgboost吧,順便把之前LTP分詞落下的給大家補上了!

XGboost原理

點擊連結至原理講解

xgboost實戰

一、將收集到的語料進行文本預處理

1)train.txt預處理為train.csv,格式為id,內容,標籤

使用excel打開train.txt然後選擇分隔符為英文逗號,這樣內容在一列,然後再為他們添加id,從1-900,接著添加標籤,0,1,2分別表示財經,體育,軍事。最後另存為csv文件。

2)對內容進行分詞和停用詞過濾,這裡使用結巴和LTP分詞,然後存入新的csv文件

import pandas as pdimport jiebafrom pyltp import Segmentorimport os


LTP_DATA_DIR = 'ltp_model\\ltp_data_v3.4.0\\' cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model') def clean_stopwords(contents): contents_list = [] stopwords_list = set(stopwords) for row in contents: words_list = jieba.lcut(row) words = [w for w in words_list if w not in stopwords_list] sentence_0 = ' '.join(words) sentence=segmentor(sentence_0) contents_list.append(sentence) return contents_list
def segmentor(sentence): segmentor = Segmentor() segmentor.load(cws_model_path) words = segmentor.segment(sentence) print('\t'.join(words))    words1 = ' '.join(words) segmentor.release() return words1def after_clean2csv(contents, labels): columns = ['contents', 'labels'] save_file = pd.DataFrame(columns=columns, data=list(zip(contents, labels))) save_file.to_csv('xgboost/train_test3.csv', index=False, encoding="utf-8",header=0)
def stopwordslist(filepath): stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()] return stopwords
if __name__ == '__main__': stopwords = stopwordslist('xgboost/stopWords.txt') train_data = pd.read_csv('/xgboost/train.csv', sep=',', names=['ID','review', 'label']).astype(str) labels = [] for i in range(len(train_data['label'])): labels.append(train_data['label'][i]) print(train_data["label"][i]) contents = clean_stopwords(train_data['review'])
after_clean2csv(contents, labels)

解析代碼

1、pd.read_csv()csv文件讀入並轉化為數據框形式

 

pd.read_csv(filepath_or_buffer, sep=',', names=None)

filepath_or_buffer 必填參數,文件所在處的路徑

sep:指定分隔符,默認為逗號','

names: 指定列的名稱,用列表表示。一般我們沒有表頭,即header=None時,這個用來添加列名.

2、'\t'.join(words)  將序列中的元素以指定的字符連接生成一個新的字符串,wordslist

測試:使用.join方法讓list轉化為str

list1 =['hh','bbbb','wo']print(type(list1))str1 = ' '.join(list1)print(type(str1))print(list1)print(str1)

結果:

<class 'list'><class 'str'>['hh', 'bbbb', 'wo']hh bbbb wo可以看到list變為了str

可能出現的bug

解析bug

因為可能已經打開了這個文件,關閉這個文件即可

轉換成功之後的test3.csv文件截圖如下:

二、文本特徵提取

    使用sklearn計算訓練集的TF-IDF,並將訓練集和測試集分別轉換為TF-IDF權重矩陣,作為模型的輸入。

train_data = pd.read_csv('E:/hebin/xgboost/train_test3.csv', sep=',', names=['contents', 'labels']).astype(str)cw = lambda x: int(x)train_data['labels'] = train_data['labels'].apply(cw)   x_train, x_test, y_train, y_test = train_test_split(train_data['contents'], train_data['labels'], test_size=0.3)    vectorizer = CountVectorizer(max_features=5000)tf_idf_transformer = TfidfTransformer()
tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train))x_train_weight = tf_idf.toarray() tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test))x_test_weight = tf_idf.toarray()

解析代碼

1)cw = lambda x: int(x)

使用lambda表達式,輸入x,返回int(x)。跟定義一個函數c1,傳入x,返回int(x)一樣。

c = lambda x:int(x)a = '10'b = c(a)print(b)print(type(b))def c1(x):    return int(x)b1 =c1(a)print(b1)print(type(b1))

結果

10<class 'int'>10<class 'int'>

2)sklearn的train_test_split

train_test_split函數用於將矩陣隨機劃分為訓練子集和測試子集,並返回劃分好的訓練集測試集樣本和訓練集測試集標籤。

X_train,X_test, y_train,y_test=cross_validation.train_test_split(train_data,train_target,test_size=0.3)

train_data:被劃分的樣本特徵集

train_target:被劃分的樣本標籤

test_size:如果是浮點數,在0-1之間,表示測試樣本佔比;如果是整數的話就是樣本的數量

3) TF-IDF(term frequency–inverse document frequency,詞頻-逆向文件頻率)是一種用於信息檢索(information retrieval)與文本挖掘(text mining)的常用加權技術。

TF-IDF是一種統計方法,用以評估字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。

TF是詞頻(Term Frequency)詞頻(TF)表示詞條(關鍵字)在文本中出現的頻率。

IDF是逆向文件頻率(Inverse DocumentFrequency),逆向文件頻率(IDF) :某一特定詞語的IDF,可以由總文件數目除以包含該詞語的文件的數目,再將得到的商取對數得到。

vectorizer = CountVectorizer(5000)

CountVectorizer會將文本中的詞語轉換為詞頻矩陣,它通過fit_transform函數計算各個詞語出現的次數,通過get_feature_names()可獲得所有文本的關鍵詞,通過toarray()可看到詞頻矩陣的結果。

TfidfTransformer,TfidfTransformer用於統計vectorizer中每個詞語的TF-IDF值

 vectorizer.fit_transform(x_train)計算每個詞出現的次數        tf_idf_transformer.fit_transform將詞頻矩陣統計成TF-IDF值

三、數據轉換為DMatrix類型

DMatrix是XGBoost的二進位的緩存文件,加載的數據存儲在對象DMatrix中。

dtrain= xgb.DMatrix(x_train_weight, label=y_train)
dtest = xgb.DMatrix(x_test_weight, label=y_test)

解析:

https://xgboost.readthedocs.io/en/latest/python/python_api.html

可能出現的bug2

解析bug

ValueError是因為int型不能將非純數字的字符串轉換為整數,說明獲取到的字符串有非純數字的,所以才會出現錯誤,結合給出的錯誤提示labels。發現train_test3在標籤列的第一行有labels

改正方法:

方法一、刪去train_test3在標籤列的第一行之後重新訓練,成功。

方法二、在文本預處理時候,to_csv方法中使用header=0,讓csv文件不保存列名。

四、基於XGBoost原生接口進行分類
    param = {'silent': 0, 'eta': 0.3,'max_depth': 6, 'objective': 'multi:softmax', 'num_class': 3,             'eval_metric':'merror'}      evallist = [(dtrain, 'train'),(dtest, 'test')]    num_round = 100      xgb_model = xgb.train(param, dtrain,num_round, evallist)            y_predict =xgb_model.predict(dtest)      label_all = ['財經', '體育', '軍事']    confusion_mat =metrics.confusion_matrix(y_test, y_predict)    df = pd.DataFrame(confusion_mat,columns=label_all)    df.index = label_all    print('準確率:',metrics.accuracy_score(y_test, y_predict))    print('confusion_matrix:', df)    print('分類報告:',metrics.classification_report(y_test, y_predict))

解析:

參考https://xgboost.readthedocs.io/en/latest/python/python_api.html

1、

xgboost.train(params,dtrain,num_round,evallist)

params:booster的參數

dtrain:要訓練的數據

num_round:迭代次數

evallist:(對列表(DMatix,string))在培訓期間評估度量標準的驗證集列表。驗證指標將幫助我們跟蹤模型的性能。

2、

metrics.confusion_matrix(y_test, y_predict)

計算混淆矩陣用來評估分類的準確度.

3、

metrics.accuracy_score(y_test, y_predict)

分類準確率分數是指所有分類正確的百分比

4、

metrics.classification_report(y_test, y_predict)

用於顯示主要分類指標的文本報告.在報告中顯示每個類的精確度,召回率,F1值等信息。

F1值是精確度和召回率的調和平均值,精確度和召回率都高時, F1值也會高. F1值在1時達到最佳值(完美的精確度和召回率),最差為0.

最終結果為

eee,準確率有點低,主要由於tf-idf比較依賴數據,而本次實驗數據只有900條,影響了準確率。

如果你覺得這個公眾號不錯,保存下面二維碼

發送給你的好友吧!

相關焦點

  • 西方人終於明白,原來傲慢和自由是要付出代價的!
    現在,英國政府才意識到可能檢測有用,佔豪還專門在前兩天寫了評論文章《歐洲終於明白,原來中國這招才是最管用的!》(點擊藍字查閱)。而就在剛剛,佔豪(微信公眾號:佔豪)又看到一篇文章,文章是德國電視一臺網站11月2日刊登發表的題為《中國為什麼沒有發生第二波疫情》的文章。文章分析了為什麼中國沒有第二波疫情,最後總結三條:一、檢測。
  • 韓國大戶人家的一日三餐,看過終於明白:原來韓劇裡並非騙人的
    閱讀本文前,請您先點擊上面的藍色字體,再點擊「關注」,這樣您就可以免費收到最新內容了。
  • 韓國大戶人家的一日三餐,看完終於明白:原來韓劇裡不是騙人的
    主食是米飯和煎雞蛋,搭配幾碟涼菜,海鮮辣湯。
  • 郭碧婷媽媽沒有出席郭碧婷婚禮,看到媽媽照片後:終於明白了!
    閱讀本文前,請您先點擊上面的藍色字體「你在搞笑嗎」,再點擊「關注」,這樣您就可以繼續免費收到文章了在看到郭碧婷媽媽年輕時候的照片之後,網友直呼:終於明白了!郭碧婷之所以能長得這麼好看,原來是因為爸爸和媽媽都這麼的漂亮和可愛,郭碧婷姐妹自然就會長得很好看了。
  • 深情林宥嘉終於娶到丁文琪 這樣的「溫柔痴漢」才是實力撩妹王
    那句「我們原來就是很不一樣的人,我很感性,你很有條理,但是我很喜歡這樣的不一樣,」 講真,嘉姐看這段視頻的時候真的真的眼角銜淚,因為一直唱苦情歌的人,終於在婚禮上道了一句嘴甜的話。對於這麼悶悶且真誠的大男孩,這樣的話一輩子說出一次就足夠珍貴!
  • 肇東有人上門免費安裝淨水器?當心!真相原來是這樣的...
    鮮花  丨甜品  丨情趣  丨熱銷在肇東,如果有人喊你免費安裝淨水器 ,是大實惠
  • 重磅來襲!佟麗婭離婚,四海八荒來賀電!林志玲婚事將近, 他卻不是言承旭!
    今日有網友爆料陳思誠與佟麗婭確定離婚了,目前在辦理共同財產分割。:不管真的假的,我希望丫丫能過得開心,遠離渣男辣女:希望渣男事業步步維艱凱薩大地YOYO喲:這樣的渣男留在身邊就是禍害 支持佟麗婭 就不該與原諒
  • 想明白了再結婚
    記住:想明白了再結婚,想不明白,那今晚就別睡了!只是有人說這會兒結,也有人說再等等,小海鷗也是無比的糾結!!但是,不管怎樣,大家都要想明白了再結婚,對麼?熱播新劇由佟大為、王麗坤、鄧家佳等主演的《想明白了再結婚》,通過三對不同境遇不同年齡層的閃婚夫妻的婚戀經,探討快餐式婚戀文化盛行的當下社會婚姻的真諦。
  • 墨西哥人講什麼語言?經過這次,終於明白了.
    各司其職,積極迎檢。這只是在迎檢辦公室的情況。
  • 夢想丨首屆自拍女神冠軍尹曉靜的夢想原來是這樣的!
    姐姐發現朋友圈有人參加女神大賽,就勸她也去報名,而身邊的朋友在這時候也都和她說:「你一定要去!我們都支持你!」因為親人和朋友的鼓勵,尹曉靜就報名參加了女神大賽。  報名以後,大家都不遺餘力地在為尹曉靜投票,她終於在眾多女神中脫穎而出,成功入圍前20強!
  • 看完這個終於明白了!
    大家有沒有發現,在日常生活中,有很多被人約定俗成的叫法或是稱謂,我們總是習慣於這樣或那樣的表達,卻很少想過為什麼。只是偶爾會腦洞大開,就比如想一想:人民幣上明明都標註了的一元,為何我們老是叫它一塊?隨手一查,發現其實早就有人對此有疑惑了,相關詞條竟有700多萬。
  • 我終於弄明白N95系列口罩的區別了
    很多地方也給武漢捐贈了很多N95口罩,但是最近我看到很多武漢醫院表示有部分N95系列的口罩不能用於醫護使用,這說明普通民眾對N95系列口罩的區別和標準並不是特別清楚,查了很多地方的資料信息後,我終於弄明白N95系列口罩的區別了。市面可購買的N95口罩有哪些?
  • 最簡單的幸福:有家回,有人等,有飯吃
    但很多人終其一生,都不曾明白,到底什麼才是真正的幸福?曾看過這樣一個小故事,印象深刻。一隻小狗問它的媽媽:媽媽,幸福在哪裡?狗媽媽告訴它:幸福就在你的尾巴上。於是,小狗不停地追,它要追上自己的尾巴,看看幸福到底是什麼樣子。可是,它發現自己無論怎麼努力也追不到尾巴上的幸福,只是在原地打轉,頭暈腦脹。
  • 原來,你是這樣的「垃圾哥」
    隨後小編聯繫了一名現場的志願者,要來了更多的現場視頻:原來是一名粗心老者,誤把自己的手機當成垃圾放在垃圾袋裡丟了出去,等發現時,小區的垃圾投放處已經垃圾歸類到街道的垃圾箱裡了。朋友圈有人轉發:「給毫不猶豫跳進垃圾箱的警察同志點讚
  • 吳尊老婆單人婚紗照,顏值身材不輸女明星,終於明白吳尊眼光了
    而最近在《婚前21天》的節目中,這一組婚紗照也被曝光,大家看到了這一組婚紗照之後,忍不住感慨,之前不明白為何吳尊可以從初戀一直相守到現在,即便是面對娛樂圈那麼多的誘惑,也一直都是無動於衷,直到看了吳尊老婆的這一組婚紗照的時候
  • 朋友講的故事:身價好多個億的老闆,讓我明白了富貴背後的秘密
    最困難的時候,他都是這樣做,可想而知發達的時候,他對待身邊的員工必然是不薄,所以他手下的一幫子鐵桿兄弟,都是死心塌地,據說跟著他的十幾號骨幹,都很多年了。我相信這樣的人,還會繼續好下去。話說朋友從這家房地產公司出來,忽然去了一家公司當了副總經理的角色。
  • 重磅:治療癌症神藥Venetoclax終於上市!
    那麼今天就是要帶給大家一個重磅好、好、好消息!這款名為Venetoclax的突破性抗癌藥已經獲得了美國食品和藥物管理局的批准,正式在美國上市!此種新藥的面世,徹底顛覆了癌症治療的傳統化療方式!在這30年中反覆試驗,終於在今年首次用於人體試驗,而這次救命神藥終於上市,也是經過了反覆實驗,確保安全後才開始大規模生產。現有抗癌藥物是通過不加區分地攻擊快速分裂的細胞來抑制癌細胞的擴散,但這會傷害到正常細胞如血液細胞,腸道細胞和頭髮毛囊,患者在治療過程中會出現噁心、腹瀉、掉發等症狀。而新藥Venetoclax,完全沒有此類副作用,實在是癌症患者的福音。
  • 啾啾度假會員:田英能在峇里島的精選假期,八天時間終於明白了什麼叫做度假!
    一說起峇里島,大部分人的腦海中都會浮現出這樣的畫面:迷人的白色沙灘,藍的讓人心醉的海水。但當你踏上這片土地,你便會感受到更多元化、更真實的峇里島。這裡的歷史、文化、宗教、美食都值得你細細品味。會員田英能一行7人在年2月趕赴峇里島,感受這裡獨特的魅力和文化。下面就讓我們跟隨她們的腳步,一起感受旅行的中的喜悅吧!
  • 「良民證」原來是這樣的!
    (圖片進行了部分處理)  在抗日戰爭題材的影視劇裡,我們經常看到這樣的畫面:路口的日本鬼子全副武裝,逐個盤問、搜查過往的老百姓,如果老百姓能拿出證件,並說上幾句當時的宣傳口號,日本鬼子就會說:「你的,大大的良民」,然後放行,這個重要的證件就是俗稱的「良民證」。你見到過真實的「良民證」什麼樣子嗎?
  • 聽伊依媽媽講故事第745期:數學繪本故事《奶奶的紅裙子》
    把部分變成了另一個整體,原來紅色的綢緞是奶奶的媽媽,做的紅色的綢緞裙子,是奶奶結婚時穿的。隨著時間的流逝,害羞的新娘變成了孩子的媽媽,紅色的綢緞裙子被剪成各種各樣的大塊、小塊、更小塊把整體分成大小不同的部分,做成了孩子的被罩、包袱、飯桌布等,部分可以變成很多新的整體,奶奶好像魔法師一樣,過一段時間就變出一個新的物品,小主人公的小荷包就是這樣變來的。