本文主要就是随便谈谈自身对半监督算法的理解,这里主要谈半监督分类


首先是为什么使用半监督学习算法?

一般而言,当训练数据量过少时,监督学习得到的模型效果不能满足需求,因此用半监督学习来增强效果。训练样本少,会导致两个问题,一方面是样本的分布不能真正代表真实数据的分布特征,另一方面是数据量过少不能满足训练学习的要求,“只能remember,不能learn”。这两个原因都会导致训练数据得到的模型会出现不能正确找到真实数据的分类边界问题。半监督学习解决了两个问题,一个是利用现有数据模拟出真实数据在特征空间的分布特点,二是在此基础上确定分类边界,即确定P(X) 和P(Y|X)


关于半监督学习的算法?

上面提到了半监督学习的目的,因此对应有很多算法,包括半监督SVM,高斯模型,KNN模型等都提供了对应的解决办法。这些算法都有基于相应的假设,给出了相应的办法。比如,KNN在此处就假设最近的K个带标签的样本中样本数量最多的类别就是该样本的类别。半监督SVM则假设分类边界通过的一定是最样本分布最稀疏的部分。。等等,不再细谈。因为以上算法在实际应用中可操作性太低,结果也很难以把控。

基于KNN的有一个标签传播算法,它假设距离样本点最近的数据点的标签就是该样本点的标签,需要经过迭代,每次迭代只赋予一个样本点标签。该算法受离群点和偶然性因素影响太大,效果不佳。


主要谈一下self-trainning 和co-trainning两种算法。

self-trainning的假设是利用现有训练数据得到的模型,对无标签数据进行预测,置信度高的数据更可能被正确赋予了标签,所以可以用于加入训练集。所以算法的流程就是:

1,利用现有训练数据训练模型,预测无标签数据

2,将置信度比较高的一部分无标签数据和它们被模型赋予标签一起加入训练集

3,如果满足训练集和模型符合要求,则输出当前的训练集和模型, 否则,  回到1

很显然,这是一个迭代的过程,同时也是一个开放的过程,3里的要求其实就是操作者自身的主观意愿,而且模型的选取也是无限制的(SVM,RM,LR等等都可以)。这里主要给出几个建议。

选取样本的时候不但要考虑置信度,还要考虑置信度的差值,只有样本在某一类别的置信度明显高于其他所有类别的置信度时,才能选取到训练集中去。

迭代的过程中需要不断增强对新样本选取的要求。

此过程需要很谨慎,因为不当的操作会使得加入的新训练样本有很大的错误,不会得到应有的结果。self-trainning算法是基于自身不断迭代学习的,所以很容易出现“走偏”的情况。


co-trainning算法:

这是针对self-trainning缺陷而来的一个算法,这里不再是自学习,而且互相学习。在每次迭代中都得到两个模型,而且各自有独立的训练集。

算法过程不再赘述,和上面一样,只是它有两个训练集(基于原始训练集而来,随机划分得到的,互补),每次迭代各自训练出一个模型,并将置信度高的样本加入到对方的训练集中。注意,是加入到对方的训练集,不是自己的!下次迭代依然是基于各自的训练集再训练得到模型。

可以看出,两个模型起到了相互校正的效果,一定程度上防止了半监督的“走偏”,但是,这是有前提条件的!!!!!训练模型所用的特征集合需要时不同的特征集合!!不然是无效的。至于模型的选取也是无所谓的,甚至在两个训练集上可以选取不同的算法来训练模型。


最后,很重要的一点

半监督的结果好坏不能再单单用监督学习的那些指标来鉴定了。

很奇怪吧。。其实也没什么

大部分情况下验证集数据的选取其实都是来源于最初的有标签的数据,所以训练集的问题,验证集一般同样存在,比如,量过少(缺乏代表性,具有偶然性),分布不均衡。这样的话,使用验证集来评价半监督学习的结果本身是存在问题的。当然,如果你的验证集建立的很完善,那就完全是可以的。

个人觉得半监督学习的结果难以评估也是制约它发展的一个重要原因。

先写到这里吧