? Xgboost从名字中可以看出是属于booting算法。Boosting就是一个强分类器,它是由若干个弱分类器(树模型)组合而成。这里的树模型是CART(分类回归树)模型。
? 通过不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是该样本的预测值 。
pip install xgboost
pip install jieba
pip install sklearn
数据分为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
新闻文本去除停用词
# 停用词示例
"""
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
CountModel = CountVectorizer(max_features=3000).fit(X_train)
用CountVectorizer进行文本特征向量化,对于每一个训练文本,它只考虑每种词汇在该训练文本中出现的频率。max_features=3000 表示对所有关键词的term frequency进行降序排序,只取前3000个作为关键词集[1] 。
Tf_IdfModel = TfidfTransformer().fit(CountModel.transform(X_train))
训练集用fit_transform,测试集用transform
train_data = CountModel.fit_transform(X_train)
test_data = CountModel.transform(X_test)
joblib.dump(CountModel, model_path + count_model)
joblib.dump(Tf_IdfModel, model_path + tfidf_model)
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
"""
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
基于TfidfVectorizer、Xgboost的新闻文本数据分类
原文:https://www.cnblogs.com/shenggang/p/12133246.html