一. 算法介紹
1.1. 算法簡介
Xgboost從名字中可以看出是屬於booting算法。Boosting就是一個強分類器,它是由若干個弱分類器(樹模型)組合而成。這里的樹模型是CART(分類回歸樹)模型。
1.2 .算法思想
通過不斷地添加樹,不斷地進行特征分裂來生長一棵樹,每次添加一個樹,其實是學習一個新函數,去擬合上次預測的殘差。當我們訓練完成得到k棵樹,我們要預測一個樣本的分數,其實就是根據這個樣本的特征,在每棵樹中會落到對應的一個葉子節點,每個葉子節點就對應一個分數,最后只需要將每棵樹對應的分數加起來就是該樣本的預測值 。
1.3. 程序運行環境
- Windows 或者Liniux 平台
- Python3+
- 安裝包: jieba, Xgboost, sklearn
1.4. Xgboost與jieba安裝
pip install xgboost
pip install jieba
pip install sklearn
二. 數據准備
2.1. 數據示例
數據分為2部分,sohu_train.txt(24000行,12個標簽) 停用詞數據:stopword1.txt
標簽 = ["體育", "健康", "女人", "娛樂", "房地產", "教育", "文化", "新聞", "旅游", "汽車", "科技", "財經"]
訓練數據分為兩列,第一列是類別標簽,第二列是新聞內容

統計訓練集/測試集每個標簽對應的新聞數據的數量:
import pandas as pd
train_data = pd.read_csv('./data/sohu_train.txt', sep='\t', header=None) #
for name, group in train_data.groupby(0):
print(name, len(group))
"""
統計結果:
體育 2000
健康 2000
女人 2000
娛樂 2000
房地產 2000
教育 2000
文化 2000
新聞 2000
旅游 2000
汽車 2000
科技 2000
財經 2000
2.2. 數據准備
-
新聞文本去除停用詞
# 停用詞示例 """ caption [- ╳ ╲ ╱ ╰ ╮ ╯ ╬ ╭ ╪ ╫ ╨ ╩ ╦ ╧ """ # 去除停用詞 def stop_word_list(): stopwords = [line.strip() for line in open(self.data_dir + 'stopwords.txt', encoding='utf-8').readlines()] return stopwords -
新聞數據分詞
def clean_str(string): strings = re.sub(r'[^\u4e00-\u9fa5]', " ", string) string = ' '.join(strings.split()) return string.strip() def seg_depart(sentence): sentence_depart = jieba.cut(sentence.strip()) stopwords = stop_word_list() outstr = '' for word in sentence_depart: if word not in stopwords: outstr += word outstr += " " return clean_str(outstr)經過分詞得到文件:sohu_train_seg.txt, 數據分為兩列,第一列是分詞后的新聞數據,第二列是新聞類別標簽,如下示例:

-
數據集划分:把數據划分為訓練集train.txt和測試集test.txt
# 構造訓練集、測試集 def get_train_test_data(data_name): data_X = [] data_y = [] with open(data_path + data_name, encoding='UTF-8') as f: data_list = f.readlines() random.shuffle(data_list) for line in data_list: row = line.rstrip('\n').split('\t') if len(row) < 2: continue feature = row[0] data_X.append(feature) data_y.append(row[1]) X_train, X_test, y_train, y_test = train_test_split(data_X, data_y, test_size=0.2) return X_train, X_test, y_train, y_test
三. 數據建模
3.1. 特征工程
CountModel = CountVectorizer(max_features=3000).fit(X_train)
用CountVectorizer進行文本特征向量化,對於每一個訓練文本,它只考慮每種詞匯在該訓練文本中出現的頻率。max_features=3000 表示對所有關鍵詞的term frequency進行降序排序,只取前3000個作為關鍵詞集[1] 。
3.2 實例化模型對象
Tf_IdfModel = TfidfTransformer().fit(CountModel.transform(X_train))
3.3 統計詞頻
訓練集用fit_transform,測試集用transform
train_data = CountModel.fit_transform(X_train)
test_data = CountModel.transform(X_test)
3.4 保存向量化的文本和實例化對象
joblib.dump(CountModel, model_path + count_model)
joblib.dump(Tf_IdfModel, model_path + tfidf_model)
3.5 模型訓練與保存[2]
def train_model_xgboost(model_name):
train_data, test_data = tranform_train_test('sohu-CountModel.pkl', 'sohu-TFIDF-Model.pkl')
clf = XGBClassifier(learning_rate=0.1, max_depth=3, scale_pos_weight=1)
clf.fit(train_data, y_train)
joblib.dump(clf, self.model_dir + model_name)
clf = joblib.load(self.model_dir + model_name) # 模型保存
print('Xgboost Result:', clf.score(test_data, y_test))
打印出准確率:
"""
Xgboost Result: 0.83875
"""
3.6 模型評估
print('Xgboost Result:', clf.score(test_data, y_test))
"""
Xgboost Result: 0.83875
"""
准確率:0.83875
參考:
[1] https://blog.csdn.net/weixin_38278334/article/details/82320307
