基于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

标签 = ["体育", "健康", "女人", "娱乐", "房地产", "教育", "文化", "新闻", "旅游", "汽车", "科技", "财经"]

训练数据分为两列,第一列是类别标签,第二列是新闻内容

1561944022045

统计训练集/测试集每个标签对应的新闻数据的数量:

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, 数据分为两列,第一列是分词后的新闻数据,第二列是新闻类别标签,如下示例:

    1561953566977

  • 数据集划分:把数据划分为训练集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

[2] http://sklearn.apachecn.org/#/

posted @ 2020-01-02 15:33  GC_AIDM  阅读(1522)  评论(0编辑  收藏  举报