提交 0c29a569 编写于 作者: W wizardforcel

6.20

上级 797777b0
......@@ -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
```
这个算法之后的原理是,数据点将它们的标签传递给未标记的数据点。这个传递部分由边的权重决定。
边上的权重可以放在转移概率矩阵中。我们可以迭代来估计实际的标签。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册