基于TFIDF+XGBoost文本主题分类

在丰富的自然语言处理领域中,文本分类是最基本的应用场景,因此使用一套合适的方案对于文本分类上的运用具有积极的效果。本文主要介绍基于词频的TF-IDF的特征提取,加上XGBoost的文本多分类方方案。
1.数据预处理
首先,文本数据源来自于网络爬取数据,所有标签都通过人工标注的方式产生,具有数据质量不高,结构复杂的问题。其结构为每一行代表一个新闻训练实例,其中context中表示爬去的新闻具体文本内容,tittle表示新闻标题,theme表示每一个新闻训练实例的标签(label)。从中可以看出数据中含有网络爬虫包含的HTML标签,部分数据项为空,包含无关标点符号(比如逗号,顿号,句号等),也包含了数字等等,同时也包含文本主题分类无关的高频词汇(如的,得等)。这些内容增加了利用监督学习训练模型的的噪声干扰。因此对于数据我这里做了基本预处理,引入Python正则表达式库,将HTML标签,文本标点符号,数字内容过滤掉,然后引入中文停词表(可以上网络下载),也将数据集中的文本在中文文本分词阶段,过滤掉在停词表中的词汇。
2.中文文本分词
对于自然语言领域而言,中英文数据集有个显著特点,就是中文词汇之间没有明显的分隔符,而英文之间却有自然的空格符来分隔,因此数据需要使用分词工具来将一大段文本分割为不同的单词词汇,用以转为训练矩阵进行主题分类。这里使用的是中文jieba分词工具,将每一段文本处理成分词结构,之后存储于一个txt文件中,分词处理的代码和处理后的数据如下图所示:
图1 分词代码
图2 分词处理后的数据格式
3.文本特征提取
经过如上步骤的文本数据处理过程之后,我们需要将文本文件转化为数值向量以便于能够带入机器学习分类器进行分类,本文此处使用的是TF-IDF算法进行处理。
3.1 TF-IDF算法原理
该算法通过统计字词分布频率用以评估一个字词对于一个文本数据集的重要程度。字词的重要性是指如果它在文本中出现的次数越多,那么其所占概率分布相比于其他词汇更高,则表明该词汇对这个文本而言越重要。TF-IDF的算法思想就在于如果一个分词相对于一个文档出现频率(TF)越高,则表示这个分词对于这个文档而言很重要。如果一个文档集合中(多个文档构成的集合),该类分词出现的文档数目越少,则越能将此类文档与其他文档区分开,而表征此类文档出现的状态参数即为IDF(逆文档频率)值大小。最后将二者频率相乘,即可得到文本词频矩阵,我们也就完成了文本向量化过程。
3.2TF-IDF算法过程
1.计算文本中每一个分词频率(TF)
图3 分词频率计算
2.计算每一个分词的逆文档频率值(IDF)
图4 分词频率计算
3.计算该类分词文本词频的值(TF-IDF),计算公式即为:TF-IDF=TFIDF
4.将计算所得所有分词词频值构成一个矩阵
3.3IF-TDF算法缺陷
基于TF-IDF的方法是通过统计的思想来实现文本数据向数值型数据转化的。在中文文本语义中,一般开头第一二句话表示该文本主题思想。而这类方法有个缺点,即为通过频率分布可能无法得到表示某一类文本中心思想的主题句段,字词的特征,因此在文本情感分类,主题分类方面存在误差,也可以说这也是基于词频的文本处理方案的通病。
四.文本分类
经过以上步骤处理过的文本数据集就转化为了词频矩阵。这类矩阵维度适中,可以直接带入统计机器学习库进行主题分类处理,本文在之前比赛经验中,决定采取统计机器学习中对于高精度要求具有普适性的XGBoost进行建模应用,以达到分类目的。
4.1 XGBoost算法前置理论
**4.1.1 决策树模型与Boosting算法**
决策树作为一类基础的二叉树模型,每一个决策结果只有“是”或者“否”,其简单,易分类的特点使其广泛用于机器学习分类与回归的基础场景,这里一般采用CART生成算法,为了减少过拟合现象,对于生成的树会进行剪枝操作(该部分详细理论请参阅李航《统计学方法》第五章)。
Boosting算法,即提升方法,该算法思想通过将不同的弱分类器线性叠加,同时赋予相应权重,以对于数据进行拟合,从而达到相关分类或者回归效果。其通过拟合下面的假设函数(如下图所示)进行建模。其中w为模型基函数(即为弱分类器),W(m)为每一个弱分类器权值。
图5 假设函数
一般Boosting算法建模过程如下图所示,来源于李航《统计学方法》:
图6 boosting建模过程
其思路即为不同弱分类器线性加法,通过添加不同的弱分类器进行训练,得到损失函数最小值后即停止模型计算过程。
**4.1.2 Gradient boosting(GB)算法**
Gradient Boosting是一种Boosting的方法,其代价函数是常见的拟合程度+正则化项结构,损失函数值取得最小值则代表该模型效果最好。它在数据建模过程中,每一次建模会对于通过代入预先设定好的不同弱分类器和弱分类器数目进行建模。其在模型损失函数的梯度下降方向进行探索,在找到沿着梯度方向下降的时候,此时找到了模型损失函数瞬时最小值,会记录参数进行建模。之后其会进一步沿着梯度下降方向进行相同操作,最后当梯度值变化不大或者相等时停止整个过程。除此外GB算法中弱分类器可以更换为任意机器学习基础模型。
**4.1.3 Gradient boosting Decision Tree(GBDT)算法**
顾名思义,该算法即为GB算法与决策树相结合,其将多个决策树模型作为弱分类器,代入到GB算法作为框架拟合数据集的算法模型。其中CART决策树可以用如下假设函数来表示:
图7 GBDT算法假设函数
其中Rj表示假设空间,γ每次决策树分叉的返回值,I()表示指示函数,在空号中条件成立情况下为1,否则为0.其中的参数J表征树的深度。
而GBDT算法流程大致如下图所示:(图片来源于《The Elements of Statistical Learning》一文)
图8 GBDT算法流程
其中可知该算法关键在于通过不断迭代损失函数值,从而不断拟合下面的式子(如下图所示),从而得到最优解。(注意该式子有的材料将其称作残差计算式,但该算法核心还是在于梯度更新最优解)
图9 损失函数迭代式
**4.1.4 XGBoost算法**
Xgboost是基于GB算法框架来实现的,其弱学习器除了可以是CART决策树也可以是线性分类器。通过参阅paper《XGBoost: A Scalable Tree Boosting System》,其跟CART决策树的GB算法大致有如下区别:
(1). 如下图所示,xgboost在损失函数中的拟合程度,加上了正则化项,当学习器为CART决策树时,正则化项fk与树的参数相关。
图10 XGBoost损失函数
(2).如下面两幅图所示, GB中使用使用损失函数对f(x)的一阶导数计算出梯度最优解,来迭代损失函数从而学习生成f(x),而XGBoost算法在迭代过程中是将一阶导数和二阶导数结合起来进行f(x)更新从而达到快速优化每次模型训练速度的目的。如下图所示,第t次损失函数更新计算式。
图11 XGBoost损失函数
图12 XGBoost损失函数泰勒展开
(3). 如下四副图所示,在文中等式4表示XGBoost模型损失函数,其中XGBoost利用5式计算叶节点最优权重值和利用式子6计算叶子节点最优值。CART回归树中寻找树每一层根节点的最佳切分点的衡量标准是最小化均方差,而在XGBoost中的切分点的标准是树的LR和LF集合并集最大化,计算式如式子7所示 ,式子一般用来计算取得最佳切分点位置,式子中参数都在损失函数(式子4)每次取最优解后迭代更新,确定最优切分点位置。
图13 式子4
图14 式子5
图15 式子6
图16 式子7
**4.1.5XGBoost算法实现**
代码如下图所示,此处基于XGBoost的sklearn入口实现算法应用,其中在数据切分后,先来者5轮交叉验证进行模型参数选择,之后利用选取的参数模型进行建模训练,最终得出相关数据报告即可,这部分关键代码截图如下所示:
图17 算法代码
*五.文本主题分类结果

最终我们选取了learning—rate=0.1的模型进行建模,最终结果如下图所示:
图18 数据分析报告
模型精度达到了74%,远远胜过于贝叶斯的63%与logistic模型的69%(这两类模型作者之前跑过作为对比),的确XGBoost方法对于高精度应用场景具有更好的效果。最后在输出模型标签分布图,即可看到具体标签重要程度,可以进行建模的特征选取。如下图所示:
(注意:此处作者训练服务器python库matpolib中文乱码,就不再处理,详情请自己添加中文规则进入matpolib源码中设置即可)
图19 特征重要性分布图