主动学习

用已标记样本训练出一个模型,用模型对未标记样本进行预测,选出对改善性能有帮助(比如选出那些不太确定的未标记样本)的样本,向专家征求最终标记的意见,并将专家意见作为标记,将该样本加入训练集得出新模型,不断重复这个工作。

关键:外界因素,即专家经验;

半监督学习

让学习器不依赖外界交互、自动地利用未标记样本提升学习性能,就是半监督学习;当然也可以用这种方法给金融样本打标签,进行拒绝推断。

纯半监督学习,其实就是充分利用已标记样本与未标记样本,得到一个模型,具有相当好的预测性;而直推学习,其实就是利用已知与未知标记样本建模,最终得到未标记样本的标签的预测。前者是得到了高泛化能力的模型,后者是得到未知标记样本的最优预测;其实可以看做是一回事。

通常需要做出一些假设,即未标记样本的数据分布信息与已标记样本直接相联系。

生成式方法(generative methods)

假设所有的数据,不论标记与否都由同一个潜在的模型生成的;而未标记数据的标记看作是潜在模型的缺失参数。使用EM演算法(专门求解含有隐变数的参数解问题)进行求解,相当於潜在模型的缺失参数是隐变数,模型的假设不同,方法不同。

这种方法在有标记数据极少的情形下往往比其他方法性能更好。

关键:模型假设必须准确,否则会降低泛化性能;这需要充分可靠的领域知识。

模型假设:比如高斯混合模型、混合专家模型、朴素贝叶斯模型。

学习到:最终得到样本的概率(当然也看假设的模型是什么)。

半监督SVM

半监督支持向量机(semi-supervised support vector machine,简称为S3VM)。

在不考虑标记样本时,SVM试图找到最大间隔划分的超平面,而考虑未标记样本后,S3VM试图找到的,是能够将两类有标记样本分开,同时要穿过数据低密度区域的超平面。(之所以要穿过低密度区,是因为存在未标记样本,有一些聚类的思想)

TSVM演算法,针对二分类问题:

步骤:

首先利用有标记样本学得一个SVM,利用该分类器对未标记数据进行标记指派,并将结果当做真实标记重新训练一个SVM,可以得出新的超平面和松弛向量,因为此时的未标记样本不准确,所有Cu<Cl,使得已标记样本所占比重更大;

之后找出两个标记指派为异类的且很可能发生错误的未标记样本,交换它们的标记,继续训练SVM得到超平面和松弛向量;

再继续重复上个过程直到标记调整完成;逐渐增大Cu的值,直到Cu=Cl。

此时可以得到未标记样本的标记,

Dl为已知标记的样本,Du是未知标记的样本。

存在的问题:计算开销很大;若存在多个低密度划分,则效果很差。

针对高效优化求解问题,有基于图核(graph kernel)函数梯度下降的LDS、基于标记均值估计的meanS3VM等。

或许可以这样理解,其实就是使用SVM演算法进行预测,只是加入的调整SVM模型的步骤(反复试错),不断迭代调整,找到使得所有样本(包括已标记和未标记)的良好的分割面。

图半监督学习

即标签传播演算法,基于高斯核来定义两样本的相似度/边的权重(每个样本就是一个节点,相连的边的强度就是权重大小)。

每个节点的标签按相似度传播给相邻节点,在节点传播的每一步,每个节点都根据相邻节点的标签来更新自己的标签,与该节点相似度越大,则相邻节点对其标注的影响权值越大,节点的标签更趋于一致。传播过程中,已标记数据的标签不变,最终迭代结束时,相似节点的概率分布也趋于相似。

关键:图的质量很重要,常用高斯距离图、k近邻图、ε近邻图。

存在的问题:1.存储开销大,难以处理大规模数据;2.接收到新样本时,需要对图进行重构并重新进行标记传播;当然,可以引入预测机制,将更新的未标记样本作为训练集的一部分,单独训练一个模型对新样本进行预测。

或许可以这样理解:就是近邻与基于距离的聚类思想,相似的样本具有相似的标记。

基于分歧的方法

协同训练(co-training),协同训练能够很好的利用不同特征之间,不同模型之间,不同数据采样,甚至不同参数产生的不同学习器,利用它们之间的相容性与互补性,提高弱分类器的泛化能力。

原本是针对多视图数据设计的,多视图就是样本对象有多个属性集,每个属性集就是一个视图。比如电影中的画面类和声音类就是两个视图。

相容性:即视图最终的输出空间(输出结果范围)是一致的:{好,坏},{+1,-1}。

互补性:各自提供了不同的视角看待问题,相互补充,集成的思想。

关键:使得分类器之间存在显著的差异。

可以通过不同的特征、不同的演算法、不同的数据采样、不同参数设置来得到这些差异。

具体过程:

前提:数据拥有两个充分且条件独立的视图。充分是每个视图都包含足以产生最优学习器的信息,条件独立是指非定类别标记条件下两个视图独立。(即将数据分成两部分,每个部分都能得到较好的分类器)

首先,使用每个视图基于有标记样本分别训练出一个分类器;

之后,利用这两个分类器,均对所有未标记样本进行预测,并挑选出各自分类器中置信度最高的那些交给另一个分类器重新训练模型;

重复这样的操作,直到终止。

选择合适的基学习器很重要!不同特征、不同演算法、不同数据采用、不同参数设置等仅是产生差异的方法。

或许可以这样理解:就是利用两个分类器(有显著不同的两个)进行预测,并结合了迭代调整的过程(分别取出单个分类器预测较准确的值交给另一个作为已标记样本,训练模型),还拥有一个特点是集成的思想(不同分类器从不同的角度学习样本,综合起来效果更好),最终得到两个分类器相互调整建模预测的结果。

半监督聚类

先将已知类别聚类得到各类别的聚类中心,再根据已知类别样本聚类结果,扩展到未标记样本继续聚类,已知类别的标记始终不变。

本质:k均值聚类的距离相似性来判断标签。

流形假设

假设数据分布在一个流形结构上,邻近的样本拥有相似的输出值。邻近程度用相似程度来刻画,可以说是聚类的假设的推广。本质与聚类假设是相同的:相似的样本具有相似的输出!

上述这些方法的思想或许可以分为两种:

近邻与聚类的思想,直接或间接的衡量样本的空间分布信息,根据空间分布情况来进行预测;分类器集成预测的思想,利用的是不同分类器从不同角度学习数据,并进行预测。

实际使用效果

注意,仅供参考,不具有普适性,仅仅是在一个特定数据上的尝试!

前段时间,用python尝试了标签传播演算法与协同训练,使用的数据是某公司金融风控方面的特征和对应的真实金融标签(正常还款、违约);用这两种方法对比建模,查看各种方法对应的打标签的质量情况。

标签传播演算法,尝试的方法:

  1. xgb建模预测未标记标签的情况;
  2. 直接使用标签传播演算法打标签;标准化数据后,同样方法打标签;
  3. 对数据进行特征提取:PCA/KPCA/LDA,之后标签传播演算法打标签;
  4. 用xgb特征重要性选择特征/特征方差大小选择特征,对比不同特征时演算法的效果;
  5. 使用sklearn中LabelPropagation/LabelSpreading,对比区别;
  6. 不同的未标记样本比例时进行打标签的效果

结果:

  1. 实际效果

对坏样本的标记的准确度稍微过半0.6左右,好样本准确度高些0.8多些,或许是因为样本中好坏比例有关(大概4:1左右);随著未知标记的样本增加,效果略有下降,但仅是百分位的下降。

直接使用的话,这样的准确度打标签是不够的,不够如果必须做的话,可以尝试下不同好坏样本比例,或者进行过采样后进行等等,需要进一步尝试。

  1. Sklearn中的两个标签传播演算法区别:

对杂讯的鲁棒性不同

1.labelspreading中含有alpha=0.2,alpha称为夹紧系数,指的是采用其邻居的信息而不是其初始标签的相对量,若为0,表示保留初始标签信息,若为1,表示替换所有初始信息;设置alpha=0.2,意味著始终保留80%的原始标签信息;

2.labelpropagation使用从数据中构造的原始相似矩阵,不做修改;labelspreading最小化具有正则化特性的损失函数,对杂讯更加稳健,迭代了原始图的修改版,并通过计算归一化拉普拉斯矩阵来标准化边权重。

消耗内存与CPU不同

LabelSpreading非常占用CPU,物理内存占用率还好;LabelPropagation 的CPU占用率还好,非常占用物理内存。因此,高纬度数据还是难以使用的。

三.特征提取与选择

PCA/KPCA没什么效果,LDA效果还是很好的(相比其他方法得出的结果而言);

因为这种演算法本身是基于距离或近邻的类似聚类的方法,反应的是空间分布的情况,那么如何才能选出能在空间中实现较好分类的特征呢?还需要继续探索。

协同训练方法,尝试的工作:

  1. 将特征分为两份,交给两个相同的分类器(LR/SVM/XGB)进行协同训练;对比相应的分类器直接建模进行预测;
  2. 不划分数据(此处不太好,还是应该将数据分为两部分进行),交给不同的两个分类器进行协同训练;
  3. 不同的未知标签样本比例时,尝试上述这些方法。

结果:

  1. 两个相同分类器协同训练时,不同的分类器效果是不同的;或许对应的就是实际建模的效果,这就是前面西瓜书上说的分类器的选择很重要。
  2. 随著未标记样本比例的增加,效果同样略有下降;相比标签传播演算法,效果略好一点点,但是这样的准确度(关键是对坏样本打标签的效果比较差,精度0.6左右,召回率0.25-0.4左右),同样是难以使用的.
  3. 用建模的方法直接进行预测,效果是最稳定的,也达到同样甚至略高些的效果。

关于协同训练,其实就是两个模型在进行共同学习与预测;或许通过建立多个较好的模型投票决定标签会有不错的效果。

总的来讲,单一使用某种方法应该是不够的,因为原本并非所有样本都能进行很好的分类;如果分类都比较困难,还如何进行半监督下的分类呢。如果想要靠谱些,还是需要引入主动学习吧。

参考资料:西瓜书,邹博老师的课程,其他课程(来源众多,各方学习,当然其中也有记录些自己对演算法的理解,无意侵权,仅做为笔记总结与知识交流用,在此也谢过大牛与前辈的分享)等等。


推荐阅读:
相关文章