第十三章
- 13 半监督学习
- 13.1 未标记样本
- 13.3.1 小结
- 13.2 生成式方法
- 13.2.1 小结
- 13.3 半监督SVM
- 13.3.1 小结
- 13.4 图半监督学习
- 13.4.1 小结
- 13.5 基于分歧的方法
- 13.5.1 小结
- 13.6 半监督聚类
- 13.6.1 小结
- 13.7 代码:手写数据集上的标签传播-性能展示
- 章末小结
13 半监督学习
13.1 未标记样本
13.3.1 小结
未标记样本在机器学习中指的是缺乏标签信息的数据,尽管它们不如标记样本直接有助于模型训练,但它们在数量上往往更为丰富,包含了关于数据分布的重要信息。为了利用这些未标记样本,研究者们开发了多种方法,包括主动学习、半监督学习、直推学习、生成式方法、半监督支持向量机、基于分歧的方法以及半监督聚类等。这些方法通过不同的策略来挖掘未标记数据的潜力,如主动学习通过选择性地获取样本标签来优化模型,半监督学习则直接结合少量标记样本和大量未标记样本进行训练,而基于分歧的方法则利用多个学习器之间的差异来提升性能。通过这些技术,我们能够在有限的标记数据条件下训练出性能更强的模型。
13.2 生成式方法
13.2.1 小结
生成式方法是一种半监督学习方法,它基于一个核心假设:所有数据(无论标记与否)都是由同一个潜在模型生成的。这意味着模型可以通过学习有标记数据来推测出未标记数据的标签。生成式方法通常先对联合概率分布P(x, c)进行建模,然后使用这个模型来推断条件概率P(c | x)。这些方法依赖于对潜在数据分布的准确假设,因此需要有较强的领域知识来确保假设的分布与真实分布相吻合。如果假设不准确,使用未标记样本可能会降低学习器的泛化性能。
在实践中,生成式方法可以通过极大似然估计和EM算法等技术来实现。例如,如果假设数据由高斯混合模型生成,那么可以通过EM算法来估计模型参数,包括未标记数据的标签。这种方法在参数迭代更新收敛后,可以计算出待预测样本属于每个类簇的后验概率,并选择概率最大的类簇作为预测结果 。
然而,生成式方法的性能很大程度上取决于潜在模型选择的准确性。如果选择的模型不能很好地反映数据的真实分布,那么包含未标记样本的学习过程可能会受到负面影响。因此,这类方法在实际应用中需要谨慎选择模型,并可能需要大量的领域知识来指导这一过程。
13.3 半监督SVM
13.3.1 小结
半监督支持向量机(S3VM)是一种在支持向量机基础上发展起来的算法,它结合了少量的标记样本和大量的未标记样本来提升分类性能。S3VM的目标是在数据的低密度区域寻找决策边界,以此同时优化有标签和未标记样本的分类效果。相比于传统的SVM,S3VM能够更有效地利用未标记数据来提高模型的泛化能力,尤其适用于标记数据稀缺的场景。尽管这种方法可能会增加过拟合的风险,但适当的参数调整可以确保模型具有良好的预测性能。S3VM及其变体在自然语言处理、计算机视觉和生物信息学等多个领域都有广泛的应用。
13.4 图半监督学习
13.4.1 小结
图半监督学习是一种利用数据点间关系构建图结构,并通过标签传播来预测未标记样本标签的机器学习方法。在这种框架下,每个数据点成为图中的一个节点,节点间的边反映了数据点间的相似性。该方法能够有效地利用少量标记样本的信息来指导大量未标记样本的学习过程,从而提高学习性能,特别适用于标记数据稀缺的实际应用场景,如社交网络分析和生物信息学。通过图结构,算法能够捕捉数据的内在结构,实现更准确的标签预测,并提升模型的泛化能力。
13.5 基于分歧的方法
与生成式方法、半监督SVM、图半监督学习等基于单学习器利用未标记数据不同,基于分歧的方法使用多学习器,而学习器之间的"分歧"对未标记数据的利用至关重要。
"协同训练"是此类方法的重要代表,它最初是针对"多视图"数据设计的,因此也被看作"多视图学习"的代表。在介绍协同训练之前,先看看什么是多视图数据。
在不少现实应用中,一个数据对象往往同时拥有多个"属性集",每个属性集就构成了一个"视图"。例如对一部电影来说,它拥有多个属性集:图像画面信息所对应的属性集、声音信息所对应的属性集、字幕信息所对应的属性集、甚至网上的宣传讨论所对应的属性集等。每个属性集都可看作一个视图。为简化讨论,暂且仅考虑图像画面属性集所构成的视图和声音属性集所构成的视图。于是,一个电影片段可表示为样本 ( < x 1 , x 2 > , y ) (<x^1,x^2>,y) (<x1,x2>,y),其中 x i x^i xi是样本在视图i中的示例,即基于该视图属性描述而得的属性向量,不妨假定 x 1 x^1 x1为图像视图中的属性向量, x 2 x^2 x2为声音视图中的属性向量;y是标记,假定是电影的类型例如"动作片"、"爱情片"等。 ( < x 1 , x 2 > , y ) (<x^1,x^2>,y) (<x1,x2>,y)这样的数据就是多视图数据。
假设不同视图具有"相容性",即其所包含的关于输出空间y的信息是一致的:令 y 1 y^1 y1表示从图像画面信息判别的标记空间, y 2 y^2 y2表示从声音信息判别的标记空间,则有 y = y 1 = y 2 y=y^1=y^2 y=y1=y2,例如两者都是{爱情片,动作片},而不能是 y 1 y^1 y1={爱情片,动作片},而$y^2={文艺片,惊悚片}。在此假设下,显式地考虑多视图有很多好处。仍以电影为例,某个片段上有两人对视,仅凭图像画面信息难以分辨其类型。但此时若从声音信息听到"我爱你",则可判断出该片段很可能属于"爱情片";另一方面,若仅凭图像画面信息认为"可能是动作片",仅凭声音信息也认为"可能是动作片",则当两者一起考虑时就有很大的把握判别为"动作片"。显然,在"相容性"基础上,不同视图信息的"互补性"会给学习器的构建带来很多便利。
协同训练正是很好地利用了多视图的"相容互补性"。假设数据拥有两个充分且条件独立视图,"充分"是指每个视图都包含足以产生最优学习器的信息,"条件独立"则是指在给定类别标记条件下两个视图独立。在此情形下,可用一个简单的办法来利用未标记数据:首先在每个视图上基于有标记样本分别训练出一个分类器,然后让每个分类器分别去挑选自己"最有把握的"未标记样本赋予伪标记,并将伪标记样本提供给另一个分类器作为新增的有标记样本用于训练更新……这个"互相学习、共同进步"的过程不断迭代进行,直到两个分类器都不再发生变化,或达到预先设定的迭代轮数为止。算法描述如图所示。若在每轮学习中都考察分类器在所有未标记样本上的分类置信度,会有很大的计算开销,因此在算法中使用了未标记样本缓冲池。分类置信度的估计则因基学习算法而异例如若使用朴素贝叶斯分类器,则可将后验概率转化为分类置信度;若使用支持向量机,则可将间隔大小转化为分类置信度。
协同训练过程虽简单,但令人惊讶的是,理论证明显示出,若两个视图充分且条件独立,则可利用未标记样本通过协同训练将弱分类器的泛化性能提升到任意高。不过,视图的条件独立性在现实任务中通常很难满足,因此性能提升幅度不会那么大,但研究表明,即便在更弱的条件下,协同训练仍可有效地提升弱分类器的性能。协同训练算法本身是为多视图数据而设计的,但此后出现了一些能在单视图数据上使用的变体算法,它们或是使用不同的学习算法,或使用不同的数据采样,甚至使用不同的参数设置来产生不同的学习器,也能有效地利用未标记数据来提升性能。后续理论研究发现,此类算法事实上无需数据拥有多视图仅需弱学习器之间具有显著的分歧(或差异),即可通过相互提供伪标记样本的方式来提升泛化性能;不同视图、不同算法、不同数据采样、不同参数设置等,都仅是产生差异的渠道面非必备条件。
基于分歧的方法只需采用合适的基学习器,就能较少受到模型假设、损失函数非凸性和数据规模问题的影响,学习方法简单有效、理论基础相对坚实、适用范围较为广泛。为了使用此类方法,而能生成具有显著分歧、性能尚可的多个学习器,但当有标记样本很少,尤其是数据不具有多视图时,要做到这一点并不容易,需有巧妙的设计。
13.5.1 小结
基于分歧的方法是半监督学习中的一种重要技术,它通过构建多个分类器(或称为学习器)并利用它们之间的分歧来利用未标记数据。这种方法的核心思想是,不同分类器对未标记样本的预测结果如果有较大分歧,那么这些样本很可能是进行进一步学习的关键。例如,在协同训练(Co-training)中,两个分类器各自在不同的视图上进行训练,并且相互利用对方的预测结果来提升自身的学习性能。此外,三体训练(Tri-training)是另一种基于分歧的方法,它使用三个分类器来处理单视图数据,通过“少数服从多数”的原则来决定如何利用未标记样本。这些方法在有标记样本较少时特别有用,因为它们能够有效地利用大量未标记的数据来提升模型的泛化能力。
13.6 半监督聚类
13.6.1 小结
半监督聚类是一种机器学习方法,通过结合少量的标记数据和大量的未标记数据来提升聚类任务的性能。它利用已知的标记信息,如类别标签或成对约束,来引导和优化聚类过程,从而使得聚类结果更加精确。这种方法在处理标记数据不足的实际问题时特别有用,已经广泛应用于生物信息学、图像处理、文本挖掘等多个领域。常见的半监督聚类算法包括基于约束的方法、基于距离的方法、基于图的方法和基于模型的方法等,它们通过不同的技术手段整合监督信息,以提高聚类的准确性和效率。随着研究的不断深入,半监督聚类算法在理论和实践上都在持续进步,展现出在大数据时代处理复杂聚类任务的重要价值。
13.7 代码:手写数据集上的标签传播-性能展示
本示例通过训练标签扩展模型来用很少的标签集对手写数字进行分类,展示了半监督学习的能力。
手写数字数据集共有1797个点。 该模型将使用所有点进行训练,但仅会标记30个点。 以混淆矩阵和一系列关于每个类的度量的形式的结果将是非常好的。
最后,将显示前10个最不确定的预测。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
from sklearn import datasets
from sklearn.semi_supervised import LabelSpreading
from sklearn.metrics import confusion_matrix, classification_reportdigits = datasets.load_digits()
rng = np.random.RandomState(2)
indices = np.arange(len(digits.data))
rng.shuffle(indices)X = digits.data[indices[:340]]
y = digits.target[indices[:340]]
images = digits.images[indices[:340]]n_total_samples = len(y)
n_labeled_points = 40indices = np.arange(n_total_samples)unlabeled_set = indices[n_labeled_points:]#############################################################################
每一轮都打乱顺序
y_train = np.copy(y)
y_train[unlabeled_set] = -1#############################################################################
通过LabelSpreading进行学习
lp_model = LabelSpreading(gamma=.25, max_iter=20)
lp_model.fit(X, y_train)
predicted_labels = lp_model.transduction_[unlabeled_set]
true_labels = y[unlabeled_set]cm = confusion_matrix(true_labels, predicted_labels, labels=lp_model.classes_)print("Label Spreading model: %d labeled & %d unlabeled points (%d total)" %(n_labeled_points, n_total_samples - n_labeled_points, n_total_samples))print(classification_report(true_labels, predicted_labels))print("Confusion matrix")
print(cm)#############################################################################
计算每个转换分布的不确定性值
pred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)#############################################################################
选择十大最不确定的标签
uncertainty_index = np.argsort(pred_entropies)[-10:]#############################################################################
绘图
f = plt.figure(figsize=(7, 5))
for index, image_index in enumerate(uncertainty_index):image = images[image_index]sub = f.add_subplot(2, 5, index + 1)sub.imshow(image, cmap=plt.cm.gray_r)plt.xticks([])plt.yticks([])sub.set_title('predict: %i\ntrue: %i' % (lp_model.transduction_[image_index], y[image_index]))f.suptitle('Learning with small amount of labeled data')
章末小结
这段文本提供了半监督学习领域的一个全面概述,包括未标记样本的重要性、生成式方法、半监督支持向量机(S3VM)、图半监督学习、基于分歧的方法以及半监督聚类等不同的半监督学习方法。此外,还提供了一个使用标签传播算法对手写数字数据集进行分类的Python代码示例。
-
未标记样本:介绍了未标记样本在机器学习中的作用和利用方法,如主动学习、半监督学习等。
-
生成式方法:讨论了基于数据由同一潜在模型生成的假设,通过极大似然估计和EM算法等技术实现。
-
半监督SVM:介绍了S3VM如何结合少量标记样本和大量未标记样本来提升分类性能。
-
图半监督学习:利用数据点间关系构建图结构,并通过标签传播来预测未标记样本标签。
-
基于分歧的方法:使用多个学习器之间的分歧来利用未标记数据,如协同训练和三体训练。
-
半监督聚类:通过结合少量的标记数据和大量的未标记数据来提升聚类任务的性能。
-
代码示例:提供了一个使用标签传播算法对手写数字数据集进行分类的Python代码示例,展示了半监督学习的能力。
代码解析:
- 数据集:使用
sklearn.datasets.load_digits()
加载手写数字数据集。 - 数据预处理:随机打乱数据顺序,将部分数据标记为未标记(-1)。
- 模型训练:使用
LabelSpreading
模型进行训练。 - 性能评估:通过混淆矩阵和分类报告评估模型性能。
- 不确定性计算:计算每个样本的预测不确定性。
- 结果展示:展示预测不确定性最高的前10个样本。