From 0c29a569353a3188b506c5f2dff28d1827318b88 Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Tue, 20 Jun 2017 17:12:15 +0800 Subject: [PATCH] 6.20 --- 4.md | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/4.md b/4.md index 0a3ae3d..c6247c5 100644 --- a/4.md +++ b/4.md @@ -1147,3 +1147,103 @@ True ``` 我们做的很好,完全不会惊讶。我们在两个分类的情况下表现不错,由于`talk.politics.guns`分类和其它两个正交,我们应该也表现不错。 + +## 4.11 标签传递,半监督学习 + +标签传递是个半监督学习技巧,它利用带标签和不带标签的数据,来了解不带标签的数据。通常,受益于分类算法的数据是难以标注的。例如,标注数据的开销可能非常大,所以手动标注一个子集边角高效。也就是说,对于公司雇佣分类学家来说,存在可能较慢,但是在发展的支持。 + +### 准备 + +另一个问题范围就是截尾数据。你可以想象一种情况,其中时间的边界会影响你收集数据的能力。也就是说,例如,你将试验药物给病人,并测量它们。有些时候,你能够测量药物的结果。如果碰巧足够快,但是你可能打算预测药物的结果,它们的反应时间较慢。这些药物可能对一些病人有致命的反应,并且需要采取救生措施。 + +### 操作步骤 + +为了表示半监督或者截尾数据,我们需要做一些简单的数据处理。首先,我们会浏览一个简单的示例,之后转向一些更加困难的情况。 + +```py +>>> from sklearn import datasets +>>> d = datasets.load_iris() +``` + +由于我们会将数据搞乱,我们做一个备份,并向标签名称数组的副本添加一个`unlabeled`成员。它会使数据的识别变得容易。 + +```py +>>> X = d.data.copy() +>>> y = d.target.copy() +>>> names = d.target_names.copy() +>>> names = np.append(names, ['unlabeled']) +>>> names +array(['setosa', 'versicolor', 'virginica', 'unlabeled'], + dtype='|S10') +``` + +现在使用`-1`更新`y`,这就是未标注情况的记号。这也是我们将`unlabeled`添加到末尾的原因。 + +```py +>>> y[np.random.choice([True, False], len(y))] = -1 +``` + +我们的数据现在拥有一系列负值(`-1`),散布在真正数据当中: + +```py +>>> y[:10] +array([-1, -1, -1, -1, 0, 0, -1, -1, 0, -1]) +``` + +```py +>>> names[y[:10]] +array(['unlabeled', 'unlabeled', 'unlabeled', 'unlabeled', 'setosa', + 'setosa', 'unlabeled', 'unlabeled', 'setosa', 'unlabeled'], + dtype='|S10') +``` + +我们显然拥有一大堆未标注的数据,现在的目标是使用`LabelPropagation `来预测标签: + + +```py +>>> from sklearn import semi_supervised +>>> lp = semi_supervised.LabelPropagation() + +>>> lp.fit(X, y) + +LabelPropagation(alpha=1, gamma=20, kernel='rbf', max_iter=30, + n_neighbors=7, tol=0.001) + +>>> preds = lp.predict(X) +>>> (preds == d.target).mean() +0.98666666666666669 +``` + +并不是太坏。我们使用了所有数据,所以这是一种作弊。并且,`iris`数据集是个良好分隔的数据集。 + +虽然我们完成了,让我们看看`LabelSpreading`,它是`LabelPropagation`的姐妹类。我们会在“工作原理”一节给出`LabelSpreading`和`LabelPropagation`的技术差异,但是很容易看出它们及其相似。 + +```py +>>> ls = semi_supervised.LabelSpreading() +``` + +观察它的工作原理,`LabelSpreading `更加健壮和嘈杂。 + +```py +>>> ls.fit(X, y) +LabelSpreading(alpha=0.2, gamma=20, kernel='rbf', max_iter=30, + n_neighbors=7, tol=0.001) + +>>> (ls.predict(X) == d.target).mean() +0.96666666666666667 +``` + +不要认为标签传播算法丢失了几个指标,它就表现得更差了。关键是,我们可能提供一些预测训练集的能力,并且适用于更广泛的环境。 + +### 工作原理 + + +标签传递的原理是,创建数据点的图,每条边上的权重为: + +``` +wij(θ) = dij / θ^2 +``` + +这个算法之后的原理是,数据点将它们的标签传递给未标记的数据点。这个传递部分由边的权重决定。 + +边上的权重可以放在转移概率矩阵中。我们可以迭代来估计实际的标签。 -- GitLab