用半监督算法做文本分类(自训练)
标签: 半监督学习,文本分类
作者:炼己者
欢迎大家访问我的简书以及我的博客,大家如果感觉格式看着不舒服,也可以去看我的简书,里面也会有发布
本博客所有内容以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,并且是非商业用途,谢谢!
半监督学习文本分类系列
用半监督算法做文本分类(sklearn)
sklearn半监督学习(sklearn)
摘要
之前调用sklearn库里的半监督算法——标签传播算法做文本分类,但是它无法支持大数据量的操作,所以就放弃了。小的数据量是可以跑的,详情大家可以看以上两篇文章。
本文主要讲述的是基于自训练的半监督学习算法做文本分类,自训练算法是半监督学习中比较常见的方法之一,但是自训练方法有一个很大的问题,在迭代过程中,如果初始训练样本集中已标注样本的数量过少,则可能会出现错误标注,并通过迭代使错误逐渐被放大,最终导致错误累积。所以我们采用对未标注样本重复标记策略来优化自训练算法。
目录
- 数据预处理
- 传统自训练方法
- 重复标记策略
- 总结与展望
1.数据预处理
把文本转为TFIDF向量的过程,这里的操作可以看以下文章:
中文文本的预处理(sklearn)
使用不同的方法计算TF-IDF值
分类算法
xgboost分类算法
也可调用sklearn库里的算法来操作,这里可自由发挥,拿各种算法包去试试
2. 传统自训练方法
(1).操作思路:
- 样本集是由少量已标注的数据和大量未标注的数据组成
- 首先用监督学习算法(比如SVM)训练已标注数据,然后再用训练所得的初始分类器对未经标注数据进行预测,预测得出的预测类别概率越大,代表分类取得的置信度越高,将置信度较高的文本连同其分类标注一起加入到已标记的数据中,重新训练分类器(每次都要从未标注样本扣除被选择的样本),迭代训练直到未标注样本为空集结束。
(2).传统自训练方法的问题
- 很显然自训练算法的核心问题便是选择高置信度的未标记样本,完成训练集的扩充。这里面问题很明显,如果未标注的数据预测类别错误,那么每次迭代都会造成错误累积,长此以往分类器的性能势必下降,所以我们对未标记样本进行重复标记,减少分类错误在训练过程的积累,进而提高分类效果
3.改进的自训练方法
(1).什么是重复标记策略
- 重复标记策略的具体思想是在第t次迭代中,先对未标记数据进行预测,然后选择数量大于第 t-1 次迭代的未标记数据来扩充样本集,并且这些被选择的未标记数据不再从原始的未标记数据集中删除,而是每次迭代过程都对其进行重复标记,以此来保证错误标记的样本能在后续迭代过程中被修正。
如果不是很理解的话大家可以看一下算法步骤
(2).算法步骤
输入:标注数据集X1 ,未标注数据集X2,参数:预测概率p,预测概率的减小速率c
输出:最终分类器
1)初始化预测概率>p的样本集U1为空,初始化样本集U2为空
注释:
- U1的作用是添加每次迭代满足条件的未标注数据集
- U2的作用是把符合要求的数据添加训练数据中,起的是中间过度作用
- 这里划分U1和U2原因是U1每次迭代后要重置为空,而U2才是真正把符合要求的未标注数据加入到已标注数据中。U2就是个中间人
2)while(len(U2) < len(x2))
注释:
这里的意思是说只要满足条件的未标注数据量等于未标注数据的总量则跳出循环。
以下内容都是在while循环中完成
3)利用X1训练初始分类器clf0
4)利用clf0对X2进行标记
5)选择预测概率>p的数据放到U1中,准备对X1进行扩充
6) if: len(U2) != 0 and len(U1) <= len(U2),则p = p - c(预测概率降低)
else: U2 = U1
注释:
这里的意思是指如果本次预测概率>p的未标注样本集比上一次迭代的小而且上一次的不可以是空,那么让预测概率降低,否则把U1赋值给U2
7)重置U1为空集
8)把U2添加到X1中(更新样本集),再去训练分类器
如此循环往复,直到满足循环跳出条件,得到最终的分类器
(3).算法流程图
理解要点:
- 未标记数据从头到尾没有减少过
- 每次迭代只是从中取出满足条件的数据,用来训练分类器,让分类器越来越好。知道最终产生的分类器可以让所有未标记数据满足条件。这里的条件是在变化的,预测概率在降低
4.总结与展望
基于自训练的半监督学习算法做出来的效果有点奇怪,模型效果先下降后上升,由于数据量很大,代码还在运行,效果目前未知,后面代码运行结果出来再更新在这里。希望本文会对大家有所帮助