互聯快訊:
據北京市生活垃圾分類治理行動計劃:年底前,全市垃圾分類示範片區覆蓋率將達到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) 將序列中的元素以指定的字符連接生成一個新的字符串,words是list
測試:使用.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條,影響了準確率。
如果你覺得這個公眾號不錯,保存下面二維碼
發送給你的好友吧!