Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
sklearn-cookbook-zh
提交
0c29a569
S
sklearn-cookbook-zh
项目概览
OpenDocCN
/
sklearn-cookbook-zh
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
sklearn-cookbook-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
0c29a569
编写于
6月 20, 2017
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6.20
上级
797777b0
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
100 addition
and
0 deletion
+100
-0
4.md
4.md
+100
-0
未找到文件。
4.md
浏览文件 @
0c29a569
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录