基于TfidfVectorizer、Xgboost的新闻文本数据分类
一. 算法介绍
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