使用半监督学习技术标记数据
这个例子展示了如何使用基于图和自我训练的半监督学习技术来标记数据。
半监督学习结合了监督学习的两个方面,其中所有的训练数据都被标记,而非监督学习的真实标签是未知的。也就是说,一些训练观察被标记,但绝大多数是未标记的。半监督学习方法试图利用数据的底层结构将标签贴合到未标记的数据中。
统计和机器学习工具箱™为分类提供了这些半监督学习函数:
fitsemigraph
构造以标记观测值和未标记观测值为节点的相似度图,将标记信息从标记观测值分配到未标记观测值。fitsemiself
在数据上迭代地训练分类器。首先,该函数单独在标记数据上训练分类器,然后使用该分类器对未标记的数据进行标签预测。fitsemiself
为预测提供分数,如果分数高于某个阈值,则将预测视为分类器下一个训练周期的真实标签。这个过程不断重复,直到标签预测收敛。
生成数据
从两个半月形状生成数据。通过使用基于图形和自我训练半监督技术来确定哪些月球新点属于。
创建自定义函数twomoons
(如本例末尾所示)。这个函数接受一个输入参数n
并创建n
两个交错的半月中的点:顶部的月亮向下凹,底部的月亮向上凹。
属性生成一组40个带标记的数据点twomoons
函数。每一点X
是在两个卫星之一,对应的卫星标签存储在向量中标签
.
rng (“默认”)%用于再现性[X,label] = twomons (20);
用散点图将这些点可视化。同一个月亮上的点有相同的颜色。
散射(X (: 1) X(:, 2),[],标签,“填充”)标题(“带安全标签的数据”)
属性生成一组400个未标记的数据点twomoons
函数。每一点newX
属于两个卫星之一,但对应的月球标签是未知的。
newX = two moonons (200);
使用基于图的方法标注数据
将未标记的数据标记在newX
通过使用基于半监督图的方法。默认情况下,fitsemigraph
中的数据构造一个相似图X
而且newX
,并使用标签传播技术将标签拟合到newX
.
graphMdl = fitsemigraph(X,label,newX)
graphMdl = SemiSupervisedGraphModel with properties: FittedLabels: [400x1 double] LabelScores: [400x2 double] ClassNames: [1 2] ResponseName: 'Y' CategoricalPredictors: [] Method: 'labelpropagation' properties, Methods
函数返回一个SemiSupervisedGraphModel
的对象FittedLabels
属性包含未标记数据的拟合标签LabelScores
属性包含关联的标签分数。
通过使用散点图来可视化拟合的标签结果。使用贴合的标签来设置点的颜色,并使用最大标签分数来设置点的透明度。透明度较低的点被标记为更有信心的点。
maxGraphScores = max(graphmll . labelscores,[],2);rescaledGraphScores = rescale(maxGraphScores,0.05,0.95);散射(newX (: 1) newX (:, 2), [], graphMdl。FittedLabels,“填充”,...“MarkerFaceAlpha”,“平”,“AlphaData”, rescaledGraphScores);标题([“未标记数据的拟合标签”,“(基于)”])
这种方法似乎标记newX
准确点。这两个卫星在视觉上是截然不同的,被标记为最不确定的点位于两个形状之间的边界上。
使用自我训练方法标注数据
将未标记的数据标记在newX
采用半监督自我训练方法。默认情况下,fitsemiself
采用高斯核支持金宝app向量机模型对数据进行迭代标注。
selfSVMMdl = fitsemi (X,label,newX)
selfSVMMdl = SemiSupervisedSelfTrainingModel with properties: FittedLabels: [400x1 double] LabelScores: [400x2 double] ClassNames: [1 2] ResponseName: 'Y' CategoricalPredictors: [] Learner: [1x1 classreg.learning.classif. classif. class]CompactClassificationSVM]属性,方法
函数返回一个SemiSupervisedSelfTrainingModel
的对象FittedLabels
属性包含未标记数据的拟合标签LabelScores
属性包含关联的标签分数。
通过使用散点图来可视化拟合的标签结果。和以前一样,使用贴合的标签来设置点的颜色,并使用最大标签分数来设置点的透明度。
maxSVMScores = max(selfsvmdl . labelscores,[],2);rescaledSVMScores = rescale(maxSVMScores,0.05,0.95);散射(newX (: 1) newX (:, 2), [], selfSVMMdl。FittedLabels,“填充”,...“MarkerFaceAlpha”,“平”,“AlphaData”, rescaledSVMScores);标题([“未标记数据的拟合标签”,”(自我训练SVM):“])
这种带有SVM学习器的方法似乎也标记了newX
准确点。这两个卫星在视觉上是截然不同的,被标记为最不确定的点位于两个形状之间的边界上。
然而,一些学习者可能不能有效地标记未标记的数据。例如,使用树模型而不是默认的SVM模型来标记数据newX
.
selfTreeMdl = fitsemi (X,label,newX,“学习者”,“树”);
可视化拟合的标签结果。
maxTreeScores = max(selfTreeMdl.LabelScores,[],2);rescaledTreeScores = rescale(maxTreeScores,0.05,0.95);散射(newX (: 1) newX (:, 2), [], selfTreeMdl。FittedLabels,“填充”,...“MarkerFaceAlpha”,“平”,“AlphaData”, rescaledTreeScores);标题([“未标记数据的拟合标签”,”(自我训练:树)”])
这种方法使用树学习器,错误地标记了月亮顶部的许多点。使用半监督式自我训练方法时,请确保使用适合数据结构的底层学习器。
这段代码创建了函数twomoons
.
函数[X,label] = twomons (n)生成两个月亮,每个月亮有n个点。指定两个卫星的半径和相关角度。噪声= (1/6).*randn(n,1);半径= 1 +噪声;Angle1 = PI + PI /10;Angle2 = pi/10;创建底部以(1,0)为中心的月亮。bottomTheta = linspace(-angle1,angle2,n)';*cos(bottomTheta) + 1;bottomX2 =半径。*sin(bottomTheta);创建顶部月亮的中心在(0,0)。topTheta = linspace(angle1,-angle2,n)';topX1 =半径。*cos(topTheta);topX2 =半径。*sin(topTheta);返回月亮点及其标签。X = [bottomX1 bottomX2;topX1 topX2];Label = [ones(n,1);2 * 1 (n, 1)];结束