[总结] 半监督学习方法: 协同训练&类协同训练(Co-training)

Co-training 最早在 1998 年提出, 是基于分歧的方法, 其假设每个数据可以由不同的视图(View)表示, 不同视图可以训练出不同的分类器, 利用这些分类器对无标签样本进行分类, 再挑选最自信的无标签样本加入训练集中. 这种多视图的方法需要满足两个假设:

  • 每个视图都包含足够产生最优学习器的信息, 此时对其中任一视图来说, 另一个视图则是冗余的, 即冗余性.
  • 两个数据 x 1 x_1 x1 x 2 x_2 x2 在给定标签的情况下是条件独立的. 即给定标记时每个属性集都条件独立于另一个属性集.

不过该假设非常强, 大多现实数据无法满足此假设, 或很难划分出冗余的视图. 于是便有了其他协同训练的变种: 由多视图转变为多学习器. 例如 Co-forest 等, 核心思想为在一个视图上训练多个不同的学习器, 这些学习器之间存在一定的差异. 另外也有方法通过去构建多个充分独立的视图模型来近似 Co-training 假设, 如 Deep Co-training 等.

blog 文章传送门:

1. Co-training

定义一个实例空间 X = X 1 × X 2 X=X_1 \times X_2 X=X1×X2, 其中 X 1 X_1 X1, X 2 X_2 X2 对应于同一实例的两个不同"视图". Co-training 算法流程如下:
在这里插入图片描述

  • 步骤1: 定义带标签的训练集 L \mathbf{L} L 和无标签数据集 U \mathbf{U} U.
  • 步骤2: 从 U \mathbf{U} U 中随机选择 u u u 个实例来创建样本缓冲池 U ′ \mathbf{U}' U. U = U \ U ′ \mathbf{U}=\mathbf{U} \backslash \mathbf{U}' U=U\U.
  • 步骤3: 分别考虑两个视图 x 1 x_1 x1 x 2 x_2 x2, 使用 L \mathbf{L} L 训练出分类器 h 1 h_1 h1 h 2 h_2 h2.
  • 步骤4: 用 h 1 h_1 h1 U ′ \mathbf{U}' U 中所有元素进行标记, 从中选出置信度高的 p p p 个正标记和 n n n 个负标记, h 2 h_2 h2 同理. U ′ = U ′ \ { U p ′ ∪ U n ′ } \mathbf{U}'=\mathbf{U}' \backslash \{\mathbf{U_p}' \cup \mathbf{U_n}'\} U=U\{UpUn}.
  • 步骤5: 将这些标记实例加入到 L L L 中, 即 h 1 h_1 h1 选出的 p + n p+n p+n 个标记实例加入到 x 2 x_2 x2 中, h 2 h_2 h2 选出的 p + n p+n p+n 个标记实例加入到 x 1 x_1 x1 中. 再随机从 U \mathbf{U} U 中选择 2 p + 2 n 2p+2n 2p+2n 个样本到 U ′ \mathbf{U}' U 中.
  • 步骤3到步骤5迭代 k k k 次.

2. COREG

COREG 既不假设有两个视图, 也不假设使用不同的学习算法. 在这里, 回归器 h 1 h_1 h1 h 2 h_2 h2 都采用 k k k-NN 算法. 不过这两个 k k k-NN 回归器通过用不同的距离度量或不同的 k k k 值来实例化, 借此来实现多样性. 在学习过程中, 每个回归器都为另一个回归器标记未标记示例.

选择 k k k-NN 回归器理由如下:

  • k k k-NN 算法是一种惰性学习方法, 不需要单独的训练阶段.
  • 为了选择合适的未标记示例进行标记, 应估计标记置信度, 在 COREG 中, 置信度估计使用了训练示例的邻近属性, 可以很容易地与 k k k-NN 回归器耦合.

COREG 算法流程如下:
在这里插入图片描述

  • 首先通过不同的参数设置初始化两个 k k k-NN 回归器 h 1 h_1 h1, h 2 h_2 h2, 两个回归器的训练集分别为 L 1 L_1 L1, L 2 L_2 L2. 注意这两个初始训练集为原始训练集 L L L 的副本.
  • 对于每个未标记数据集 U ′ U' U 中的 x u \mathbf{x}_u xu, 计算其邻居示例得到集合 Ω u \Omega_u Ωu.
  • 利用回归器 h j h_j hj, j ∈ { 1 , 2 } j \in \{1,2\} j{1,2} x u \mathbf{x}_u xu 进行预测, 得到预测结果 y ^ u \hat{\mathbf{y}}_u y^u. 并将其添加到训练集 L j L_j Lj 中, 然后重新训练一个 k k k-NN 回归器 h j ′ h_j' hj.
  • 接着计算 MSE: δ x u = ∑ x i ∈ Ω u ( ( y i − h ( x i ) ) 2 − ( y i − h ′ ( x i ) ) 2 ) \delta_{x_u} = \sum_{x_i \in \Omega_u}((y_i-h(\mathbf{x}_i))^2-(y_i-h'(\mathbf{x}_i))^2) δxu=xiΩu((yih(xi))2(yih(xi))2).
  • 完成上述工作后, 如果存在 δ x u > 0 \delta_{\mathbf{x}_u} > 0 δxu>0, 则最大化 δ x u \delta_{\mathbf{x}_u} δxu 得到 x ~ j \tilde{\mathbf{x}}_j x~j, 利用 h j h_j hj 对其预测得到 y ~ j \tilde{\mathbf{y}}_j y~j, 将 { ( x ~ j , y ~ j ) } \{(\tilde{\mathbf{x}}_j,\tilde{\mathbf{y}}_j)\} {(x~j,y~j)} 添加到 π j \pi_j πj 中, 并将 x ~ j \tilde{\mathbf{x}}_j x~j U ′ U' U 中去除.
  • 经过一些列迭代, 最终得到 π 1 \pi_1 π1, π 2 \pi_2 π2, 并将 π 1 \pi_1 π1 添加到 L 2 L_2 L2 中, π 2 \pi_2 π2 添加到 L 1 L_1 L1 中. 利用最新的数据集 L 1 L_1 L1, L 2 L_2 L2 重新训练回归器得到 f 1 f_1 f1, f 2 f_2 f2. 最终的预测结果为两个回归器和的平均值.

3. Democratic Co-Learning

Democratic Co-Learning 也是采用单视图多学习器的策略, 像是民主投票, 以多数票的形式进行数据挑选.

定义 L \mathbf{L} L 为标记数据集, U \mathbf{U} U 为无标记数据集, A 1 , … , A n A_1,\dots,A_n A1,,An 为分类器, 每个分类器对 U \mathbf{U} U 中的未标记数据 x x x 预测一个类别 c i ∈ C = { c 1 , … , c r } c_i \in \mathcal{C}=\{c_1,\dots,c_r\} ciC={c1,,cr}, 并令 c k c_k ck 表示多数分类器预测一致的结果(将这些分类器的集合称为多数团体(Majoritty Group)). 将这些结果加入到 L \mathbf{L} L 中, 然后继续进行训练, 直到满足没有可挑选的未标记数据为止. Democratic Co-Learning 算法如下图所示:
在这里插入图片描述
初始阶段, 初始化模型:

  • 使用不同学习算法 A i A_i Ai L i \mathbf{L_i} Li 上训练分类器 H i H_i Hi.
  • 使用 H i H_i Hi U \mathbf{U} U 上的每个示例 x x x 预测一个标签值 c j c_j cj, 令 c k c_k ckmajority prediction.

民主优先采样阶段, 选择未标记示例给专家标记, 并加入对应训练集:

  • 计算 H i H_i Hi L \mathbf{L} L 上的 95% 置信区间 [ l i , h i ] [l_i,h_i] [li,hi] 和平均置信度 ( l i + h i ) / 2 (l_i+h_i)/2 (li+hi)/2.
  • 初始化 n n n L ′ \mathbf{L}' L, 如果多数团体的平均置信值之和大于少数团体的平均置信值之和, 则将 ( x , c k ) (x,c_k) (x,ck) 加入到 L i ′ \mathbf{L_i}' Li 中.

评估阶段, 评估将 L i ′ \mathbf{L_i}' Li 添加到 L i \mathbf{L_i} Li 中是否提升准确率:

  • 计算 H i H_i Hi L i \mathbf{L}_i Li 上的 95% 置信区间 [ l i , h i ] [l_i,h_i] [li,hi], 然后分别计算在 L i \mathbf{L}_i Li, L i ′ \mathbf{L}'_i Li L i ∪ L i ′ \mathbf{L}_i \cup \mathbf{L}'_i LiLi 上的错误率 q i q_i qi, e i ′ e'_i ei q i ′ q'_i qi.
  • 如果 q i ′ > q i q'_i>q_i qi>qi 则将 L i ′ \mathbf{L_i}' Li 添加到 L i \mathbf{L_i} Li

重复以上操作直到 L 1 , ⋯ L n \mathbf{L}_1,\dotsm\mathbf{L}_n L1,Ln 不再变化为止. 最终通过 Combine 函数返回一组分类器.

4. CoBCReg

CoBCReg 的思想与 Democratic Co-Learning 非常类似, CoBCReg 中使用了一个预测器委员会来预测未标记的示例.

CoBCReg 算法如下所示:
在这里插入图片描述

  • 步骤1. 遍历委员会中的每一个回归器, 对标记数据集使用随机采样获得 { L i , V i } \{L_i,V_i\} {Li,Vi}, 其中 L i L_i Li 为包内数据, 即选择的用于训练的数据, V i V_i Vi 为包外数据(用于测试集). 利用 RBFNN 训练得到回归器 h i h_i hi.
  • 步骤2. 对于每次迭代 i i i, 从 U U U 中随机抽取 u u u 个示例到缓冲池 U ′ U' U. 应用 SelectRelevantExamples 方法使同伴委员会 H i H_i Hi (除 h i h_i hi 之外的所有成员组成)估计 U ′ U' U 中每个未标记示例的输出, 并返回最有意义的未标记示例 π i \pi_i πi.
  • 步骤3. 对于每次迭代 i i i, 如果 π i \pi_i πi 不为空, 则将其加入到 L i L_i Li, 然后利用更新后的 L i L_i Li 通过 RBFNN 重新训练回归器 h i h_i hi.
  • 重复步骤2, 3, 直到达 t t t 到最大迭代次数 T T T U U U 变为空.
  • 最终返回回归器 H ( x ) H(x) H(x), 即委员会所有回归器的加权和.

其中 SelectRelevantExamples 算法如下:
在这里插入图片描述

  • 首先计算 h j h_j hj 在验证集 V j V_j Vj 上的 RMSE ϵ j \epsilon_j ϵj.
  • 对于 U ′ U' U 中每个未标记示例 x u x_u xu, 对委员会中的所有回归器(除去 h j h_j hj)的预测结果取均值, 得到 { x u , H j ( x u ) } \{x_u,H_j(x_u)\} {xu,Hj(xu)}, 并将其加入到 L j L_j Lj 中.
  • 利用更新后的 L j L_j Lj 通过 RBFNN 重新训练回归器 h j ′ h_j' hj. 然后 h j ′ h'_j hj 计算在验证集 V j V_j Vj 上的 RMSE ϵ j ′ \epsilon'_j ϵj.
  • 接着计算 Δ x u ← ( ϵ j − ϵ j ′ ) / ϵ j \Delta_{x_u} \leftarrow (\epsilon_j-\epsilon'_j)/ \epsilon_j Δxu(ϵjϵj)/ϵj.
  • U ′ U' U 迭代完成后, 定义空集合 π \pi π.
  • 通过 g r gr gr 次迭代, 选择 g r gr gr 个使 Δ x u \Delta_{x_u} Δxu 最大的结果对应的未标记示例 x u x_u xu, 将其加入到 π j \pi_j πj 中.
  • 最后返回 π j \pi_j πj.

5. Deep Co-training

Co-Training 假设 D = S ∪ U \mathcal{D}=\mathcal{S} \cup \mathcal{U} D=SU 中的每个数据 x x x 有两个视图, 即 x = ( v 1 , v 2 ) x = (v_1, v_2) x=(v1,v2), 每个视图 v i v_i vi 都足以学习一个有效的模型. 其中 S \mathcal{S} S, U \mathcal{U} U 分别表示标记数据集和未标记数据集. 给定 D \mathcal{D} D 的分布 X \mathcal{X} X, Co-Training 假设表示如下:
f ( x ) = f 1 ( v 1 ) = f 2 ( v 2 ) , ∀ x = ( v 1 , v 2 ) ∼ X f(x)=f_1(v_1)=f_2(v_2),\forall x=(v_1,v_2) \sim\mathcal{X} f(x)=f1(v1)=f2(v2),x=(v1,v2)X

  • 在 Deep Co-training 中, v 1 ( x ) v_1(x) v1(x) v 2 ( x ) v_2(x) v2(x) x x x 在最终全连接层 f i ( ⋅ ) f_i(·) fi() 之前的卷积表示. 在标记数据集 S \mathcal{S} S 上的标准交叉熵损失函数定义为:
    L s u p ( x , y ) = H ( y , f 1 ( v 1 ( x ) ) ) + H ( y , f 2 ( v 2 ( x ) ) ) \mathcal{L}_{\mathrm{sup}}(x,y)=H(y,f_1(v_1(x)))+H(y,f_2(v_2(x))) Lsup(x,y)=H(y,f1(v1(x)))+H(y,f2(v2(x)))
    其中 H ( p , q ) H(p,q) H(p,q) 表示交叉熵. 而对于未标记数据集 U \mathcal{U} U, 基于 Co-Training 假设, 期望 f 1 ( v 1 ( x ) ) f_1(v_1(x)) f1(v1(x)) f 2 ( v 2 ( x ) ) f_2(v_2(x)) f2(v2(x)) 有相似的预测, 使用 JS 散度来进行 f 1 ( v 1 ( x ) ) f_1(v_1(x)) f1(v1(x)) f 2 ( v 2 ( x ) ) f_2(v_2(x)) f2(v2(x)) 之间的相似性度量, 损失函数定义如下:
    L c o t ( x ) = H ( 1 2 ( f 1 ( v 1 ( x ) ) + f 2 ( v 2 ( x ) ) ) ) − 1 2 ( H ( f 1 ( v 1 ( x ) ) ) + H ( f 2 ( v 2 ( x ) ) ) ) \mathcal{L}_{\mathrm{cot}}(x)=H(\frac{1}{2}(f_1(v_1(x))+f_2(v_2(x))))-\frac{1}{2}(H(f_1(v_1(x)))+H(f_2(v_2(x)))) Lcot(x)=H(21(f1(v1(x))+f2(v2(x))))21(H(f1(v1(x)))+H(f2(v2(x))))
    其中 H ( p ) H(p) H(p) 表示 p p p 的熵.

  • 利用 g ( x ) g(x) g(x) D \mathcal{D} D 中生成对抗样本数据集 D ′ \mathcal{D}' D, 在 D ′ \mathcal{D}' D f 1 ( v 1 ( g ( x ) ) ) ≠ f 2 ( v 2 ( g ( x ) ) ) f_1(v_1(g(x))) \neq f_2(v_2(g(x))) f1(v1(g(x)))=f2(v2(g(x))). 希望 g ( x ) g(x) g(x) x x x 之间足够小, 以便于对抗样本还能保持自然的图像特征. 不过当 g ( x ) − x g(x)-x g(x)x 很小时, 有很大概率会出现 f 1 ( v 1 ( g ( x ) ) = f 1 ( v 1 ( x ) ) f_1(v_1(g(x))=f_1(v_1(x)) f1(v1(g(x))=f1(v1(x)) f 2 ( v 2 ( g ( x ) ) = f 2 ( v 2 ( x ) ) f_2(v_2(g(x))=f_2(v_2(x)) f2(v2(g(x))=f2(v2(x)), 这就与我们的想法违背. 即希望当 f 1 ( v 1 ( g ( x ) ) = f 1 ( v 1 ( x ) ) f_1(v_1(g(x))=f_1(v_1(x)) f1(v1(g(x))=f1(v1(x)) 出现时, 需满足 f 2 ( v 2 ( g ( x ) ) ≠ f 2 ( v 2 ( x ) ) f_2(v_2(g(x))\neq f_2(v_2(x)) f2(v2(g(x))=f2(v2(x)). 通过交叉熵来训练网络 f 1 f_1 f1, f 2 f_2 f2, 使得可以抵抗相互的对抗示例:
    L d i f ( x ) = H ( f 1 ( v 1 ( x ) ) , f 2 ( v 2 ( g 1 ( x ) ) ) ) + H ( f 1 ( v 1 ( g 2 ( x ) ) ) , f 2 ( v 2 ( x ) ) ) \mathcal{L}_{\mathrm{dif}}(x)=H(f_1(v_1(x)), f_2(v_2(g_1(x))))+H(f_1(v_1(g_2(x))), f_2(v_2(x))) Ldif(x)=H(f1(v1(x)),f2(v2(g1(x))))+H(f1(v1(g2(x))),f2(v2(x)))
    最终的损失函数定义为:
    L = E ( x , y ) ∈ S L s u p ( x , y ) + λ c o t E x ∈ U L c o t ( x ) + λ d i f E x ∈ D L d i f ( x ) \mathcal{L}=\mathbb{E}_{(x,y)\in\mathcal{S}}\mathcal{L}_{\mathrm{sup}}(x,y)+\lambda_{\mathrm{cot}}\mathbb{E}_{x\in\mathcal{U}}\mathcal{L}_{\mathrm{cot}}(x)+\lambda_{\mathrm{dif}}\mathbb{E}_{x\in\mathcal{D}}\mathcal{L}_{\mathrm{dif}}(x) L=E(x,y)SLsup(x,y)+λcotExULcot(x)+λdifExDLdif(x)

6. Tri-training

Tri-training 核心思想简述如下: 假设除了分类器 h 1 h_1 h1 h 2 h_2 h2 之外, 利用标记数据再训练了一个分类器 h 3 h_3 h3. 那么, 对于任何分类器, 只要其他两个分类器同意这个示例的标签, 则可以将其标记起来, 而分类器标记的置信度不需要明确测量. 例如, 如果 h 2 h_2 h2 h 3 h_3 h3 同意示例 x x x 的标记结果, 则可以将标记 x x x 加入到 h 1 h_1 h1 中. 其具体算法如下:
在这里插入图片描述
首先利用 Bootstrap 重采样, 从有标签数据集 L L L 里采样三个子数据集 S i S_i Si, S j S_j Sj, S k S_k Sk. 利用三个子数据集训练三个基分类器 h i h_i hi, h j h_j hj, h k h_k hk. 并初始化 e i ′ = 0.5 e_i'=0.5 ei=0.5, l i ′ = 0 l_i'=0 li=0. 这里 e i ′ e_i' ei 表示 h j & h k h_j \& h_k hj&hk 的分类错误率的上界, 即 h j h_j hj h k h_k hk 组合得出的假设的错误率. l i ′ l_i' li 用作与挑选的未标记示例集 L i L_i Li 的大小做比较.

接着迭代每个分类器, 首先, 初始化挑选数据集 L i = ∅ L_i=\empty Li=; 使用 MeasureError 函数计算 e i e_i ei; 初始化分类器 h i h_i hi 的更新标志 u p d a t e i = F A L S E update_i=FALSE updatei=FALSE.

当满足 e i < e i ′ e_i < e_i' ei<ei 时, 对于分类器 h i h_i hi, 使用另外两个分类器预测所有未标注数据集, 挑选出其中预测结果相同的样本, 作为新的有标签数据 ( x , h j ( x ) ) (x,h_j(x)) (x,hj(x)), 并加入到分类器 h i h_i hi 的训练集 L i L_i Li 中. 当 l i ′ = 0 l_i'=0 li=0 时(即刚初始化, h i h_i hi 还没经过训练进行更新), 通过下式计算 l i ′ l_i' li:
l i ′ = ⌊ e i e i ′ − e i + 1 ⌋ l_i'=\lfloor\frac{e_i}{e_i'-e_i}+1\rfloor li=eieiei+1
l i ′ < ∣ L i ∣ l_i' < \vert L_i\vert li<Li 时, 如果 e i ∣ L i ∣ < e i ′ l i ′ e_i\vert L_i\vert < e_i'l_i' eiLi<eili, 则表示分类器 h i h_i hi 已更新: u p d a t e i = T r u e update_i=True updatei=True, 如果 l i ′ > e i e i ′ − e i l_i'>\frac{e_i}{e_i'-e_i} li>eieiei, 则通过函数 Subsample 从 L i L_i Li 中随机选择 ∣ L i ∣ − ⌈ e i e i ′ − e i + 1 ⌉ \vert L_i\vert-\lceil \frac{e_i}{e_i'-e_i}+1\rceil Lieieiei+1 个示例删除, 同时更新 u p d a t e i = T r u e update_i=True updatei=True.

迭代完成后, 检查每个分类器的更新状态, 如果分类器 i i i 已更新, 则将与之对应的 L i L_i Li 加入到 L L L 中, 利用扩增的数据集 L L L 更新分类器 i i i, 同时用 e i e_i ei 更新 e i ′ e_i' ei, ∣ L ∣ \vert L\vert L 更新 l i ′ l_i' li.

重复上述分类器迭代过程, 直到每个分类器不在变化为止. 最终得到三个训练完成的分类器, 通过 arg max ⁡ y ∈ l a b e l ∑ h i ( x ) = y 1 \argmax_{y\in label} \sum_{h_i(x)=y}1 ylabelargmaxhi(x)=y1 来预测结果, 即投票原则.

7. Disagreement Tri-training

带分歧的 Tri-training 只对 Tri-training 进行简单改动, 如下所示:
在这里插入图片描述
非常容易理解, 如果分类器 c j c_j cj c k c_k ck 都同意对数据 x x x 的预测, 但 c i c_i ci 不同意, 就可以自然的认为 x x x c i c_i ci 的弱点. 并希望通过 x x x 来加强 c i c_i ci.

8. Tri-net

Tri-net 的训练过程如下图:
在这里插入图片描述

阶段1: 初始化

Tri-net 的第一步是生成三个多样的模型. Tri-net 由一个共享模型 M S M_S MS 和另外三个不同的模型 M 1 M_1 M1, M 2 M_2 M2 M 3 M_3 M3 组成. 为了得到三个准确多样的模型, 使用 Output Smearing 来生成三个不同的标记数据集: L o s 1 \mathcal{L}^1_{os} Los1, L o s 2 \mathcal{L}^2_{os} Los2 L o s 3 \mathcal{L}^3_{os} Los3. 在三个数据集上同时训练 M S M_S MS, M 1 M_1 M1, M 2 M_2 M2 M 3 M_3 M3. 网络结构如下:
在这里插入图片描述

阶段2: 训练

和 tri-training 思想一样, 如果两个模型对未标记示例的预测达成一致, 并且预测可靠且稳定, 则将这个具有伪标签示例加入到第三个模型的训练集中. 然后用增强的训练集细化第三个模型. 由于模型之间相互挑选增加了训练集, 所以三个模型会越来越相似. 为了解决这个问题, 对标记数据上的模型进行微调, 以在某些特定轮次中增加它们之间的多样性. 整个训练过程如下所示:
在这里插入图片描述

  • 步骤1. 在 L \mathcal{L} L 上使用 Output Smearing 生成三个不同的标记数据集: L o s 1 \mathcal{L}^1_{os} Los1, L o s 2 \mathcal{L}^2_{os} Los2 L o s 3 \mathcal{L}^3_{os} Los3.
  • 步骤2. 在 L o s 1 \mathcal{L}^1_{os} Los1, L o s 2 \mathcal{L}^2_{os} Los2 L o s 3 \mathcal{L}^3_{os} Los3 上训练 M S M_S MS, M 1 M_1 M1, M 2 M_2 M2, M 3 M_3 M3.
  • 步骤3. 训练 M v , v = 1 , 2 , 3 M_v, v=1,2,3 Mv,v=1,2,3. 初始化挑选样本集 P L v \mathcal{PL}_v PLv, 首先通过 Labeling 函数让另外两个模型挑选出置信示例, 并添加到 P L v \mathcal{PL}_v PLv 中, 接着, 利用 DES 方法对 P L v \mathcal{PL}_v PLv 进行更新, 最后得到 M v M_v Mv 的训练样本 L ^ v = L ∪ P L v \hat{\mathcal{L}}_v=\mathcal{L} \cup \mathcal{PL}_v L^v=LPLv. 注意, 如果刚开始训练 M 1 M_1 M1 时, 模型 M S M_S MS M 1 M_1 M1 一同通过 L ^ v \hat{\mathcal{L}}_v L^v 训练, 其他两个模型进行训练时则不需要再对 M S M_S MS 进行训练.
  • 重复步骤3 T T T 次, 最终返回训练完成的 M S M_S MS, M 1 M_1 M1, M 2 M_2 M2, M 3 M_3 M3.

9. Tri-TS

同 Tri-Training, 首先从标记数据集 L L L 中用 bootstrap 采样获得三个不同的数据集 S i S_i Si, S j S_j Sj, S k S_k Sk, 这样做的目的是增加多样性, 然后分别训练三个分类器 m i m_i mi, m j m_j mj, m k m_k mk. 对于未标记数据集 U U U 中的示例 x x x, 每个分类器对其的预测结果分别为 c i c_i ci, c j c_j cj, c k c_k ck, 以及对应的概率 p i ( c i ∣ x ) p_i(c_i\vert x) pi(cix), p j ( c j ∣ x ) p_j(c_j\vert x) pj(cjx), p k ( c k ∣ x ) p_k(c_k\vert x) pk(ckx).

与原始 Tri-Training 中为 x x x 分配多数投票标签的策略不同, 在 Teacher-Student 中, 从师生的角度对学习任务进行建模. 在迭代过程中, 如果 p j ( c j ∣ x ) p_j(c_j\vert x) pj(cjx), p k ( c k ∣ x ) p_k(c_k\vert x) pk(ckx) 同时大于 teacher 的阈值 τ t \tau_t τt, 则将 m j m_j mj, m k m_k mk 视作 teacher, 如果另一个分类器 m i m_i mi 的预测概率小于 student 的阈值 τ s \tau_s τs, 则将其视为 student. 未标记样本 x x x 只有在被判别为可被教导(Teachable)后才会被分配一个标签. 选择 Teachable 样本的算法如下所示:
在这里插入图片描述
其标准如下:

  • 分类器 m j m_j mj, m k m_k mk 互相认同对方的分类结果 c k c_k ck, c j c_j cj.
  • 两个 teacher 的预测置信度 p j p_j pj, p k p_k pk 必须同时大于 τ t \tau_t τt, 同时 student 的预测置信度 p i p_i pi 必须小于 τ s \tau_s τs.

完整的 Teacher Student Tri-training 算法如下所示:
在这里插入图片描述

  • 9
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SVM-KNN协同训练是一种结合支持向量机和k最近邻分类器的分类方法,并且可以使用协同训练来提高模型的性能。以下是一个简单的使用Python和scikit-learn库实现SVM-KNN协同训练的代码示例: ```python from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 生成一个二分类问题数据集 X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_classes=2, random_state=1) # 将数据集划分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1) # 定义支持向量机模型和k最近邻分类器模型 svm_model = SVC(kernel=&#39;linear&#39;, probability=True) knn_model = KNeighborsClassifier(n_neighbors=3) # 训练两个模型,并使用测试集进行评估 svm_model.fit(X_train, y_train) knn_model.fit(X_train, y_train) svm_pred = svm_model.predict(X_test) knn_pred = knn_model.predict(X_test) svm_acc = accuracy_score(y_test, svm_pred) knn_acc = accuracy_score(y_test, knn_pred) print(&quot;SVM accuracy: {:.2f}%&quot;.format(svm_acc * 100)) print(&quot;KNN accuracy: {:.2f}%&quot;.format(knn_acc * 100)) # 使用协同训练提高模型性能 svm_pred_train = svm_model.predict(X_train) knn_pred_train = knn_model.predict(X_train) X_train_new = np.hstack((X_train, svm_pred_train.reshape(-1, 1), knn_pred_train.reshape(-1, 1))) svm_model_new = SVC(kernel=&#39;linear&#39;, probability=True) knn_model_new = KNeighborsClassifier(n_neighbors=3) svm_model_new.fit(X_train_new, y_train) knn_model_new.fit(X_train_new, y_train) svm_pred_new = svm_model_new.predict(X_test) knn_pred_new = knn_model_new.predict(X_test) svm_acc_new = accuracy_score(y_test, svm_pred_new) knn_acc_new = accuracy_score(y_test, knn_pred_new) print(&quot;SVM-KNN accuracy: {:.2f}%&quot;.format(svm_acc_new * 100)) print(&quot;KNN-SVM accuracy: {:.2f}%&quot;.format(knn_acc_new * 100)) ``` 在上面的代码中,我们首先生成了一个二分类问题的数据集,并将其划分为训练集和测试集。然后,我们定义了两个分类器模型:支持向量机和k最近邻分类器,并对它们进行了训练和评估。接下来,我们使用两个模型对训练集进行预测,并将预测结果作为新特征与原特征合并,然后再使用这些新特征训练新的分类器模型。最后,我们使用测试集对新的模型进行评估,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值