Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
sklearn-cookbook-zh
提交
03d21db5
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 搜索 >>
提交
03d21db5
编写于
5月 25, 2017
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
3.9
上级
6f2541ad
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
98 addition
and
0 deletion
+98
-0
3.md
3.md
+98
-0
未找到文件。
3.md
浏览文件 @
03d21db5
...
...
@@ -904,3 +904,101 @@ array([0, 0, 0, 0, 0])
>>>
lowest_prob_idx
=
np
.
argsort
(
emp_dist
.
pdf
(
X
))[:
5
]
>>>
np
.
all
(
X
[
sorted_idx
]
==
X
[
lowest_prob_idx
])
True
```
## 3.9 将 KNN 用于回归
回归在这本书的其它地方有所设计,但是我们可能打算在特征空间的“口袋”中运行回归。我们可以认为,我们的数据集要经过多道数据处理工序。如果是这样,只训练相似数据点是个不错的想法。
### 准备
我们的老朋友,回归,可以用于聚类的上下文中。回归显然是个监督学习技巧,所以我们使用 KNN 而不是 KMeans。
对于 KNN 回归来说,我们使用特征空间中的 K 个最近点,来构建回归,而不像常规回归那样使用整个特征空间。
### 操作步骤
对于这个秘籍,我们使用
`iris`
数据集。如果我们打算预测一些东西,例如每朵花的花瓣宽度,根据
`iris`
物种来聚类可能会给我们更好的结果。KNN 回归不会根据物种来聚类,但我们的假设是,相同物种的 X 会接近,或者这个案例中,是花瓣长度。
对于这个秘籍,我们使用
`iris`
数据集:
```
py
>>>
from
sklearn
import
datasets
>>>
iris
=
datasets
.
load_iris
()
>>>
iris
.
feature_names
[
'sepal length (cm)'
,
'sepal width (cm)'
,
'petal length (cm)'
,
'petal width (cm)'
]
```
我们尝试基于萼片长度和宽度来预测花瓣长度。我们同时训练一个线性回归,来对比观察 KNN 回归有多好。
```
py
>>>
from
sklearn.linear_model
import
LinearRegression
>>>
lr
=
LinearRegression
()
>>>
lr
.
fit
(
X
,
y
)
>>>
print
"The MSE is: {:.2}"
.
format
(
np
.
power
(
y
-
lr
.
predict
(
X
),
2
).
mean
())
The
MSE
is
:
0.15
```
现在,对于 KNN 回归,使用下列代码:
```
py
>>>
from
sklearn.neighbors
import
KNeighborsRegressor
>>>
knnr
=
KNeighborsRegressor
(
n_neighbors
=
10
)
>>>
knnr
.
fit
(
X
,
y
)
>>>
print
"The MSE is: {:.2}"
.
format
(
np
.
power
(
y
-
knnr
.
predict
(
X
),
2
).
mean
())
The
MSE
is
:
0.069
```
让我们看看,当我们让它使用最接近的 10 个点用于回归时,KNN 回归会做什么?
```
py
>>>
f
,
ax
=
plt
.
subplots
(
nrows
=
2
,
figsize
=
(
7
,
10
))
>>>
ax
[
0
].
set_title
(
"Predictions"
)
>>>
ax
[
0
].
scatter
(
X
[:,
0
],
X
[:,
1
],
s
=
lr
.
predict
(
X
)
*
80
,
label
=
'LR
Predictions'
,
color
=
'c'
,
edgecolors
=
'black'
)
>>>
ax
[
1
].
scatter
(
X
[:,
0
],
X
[:,
1
],
s
=
knnr
.
predict
(
X
)
*
80
,
label
=
'k-NN
Predictions'
,
color
=
'm'
,
edgecolors
=
'black'
)
>>>
ax
[
0
].
legend
()
>>>
ax
[
1
].
legend
()
```
输出如下:
![](
img/3-9-1.jpg
)
很显然,预测大部分都是接近的。但是让我们与实际情况相比,看看 Setosa 物种的预测:
```
py
>>>
setosa_idx
=
np
.
where
(
iris
.
target_names
==
'setosa'
)
>>>
setosa_mask
=
iris
.
target
==
setosa_idx
[
0
]
>>>
y
[
setosa_mask
][:
5
]
array
([
0.2
,
0.2
,
0.2
,
0.2
,
0.2
])
>>>
knnr
.
predict
(
X
)[
setosa_mask
][:
5
]
array
([
0.28
,
0.17
,
0.21
,
0.2
,
0.31
])
>>>
lr
.
predict
(
X
)[
setosa_mask
][:
5
]
array
([
0.44636645
,
0.53893889
,
0.29846368
,
0.27338255
,
0.32612885
])
```
再次观察绘图,Setosa 物种(左上方的簇)被线性回归估计过高,但是 KNN 非常接近真实值。
### 工作原理
KNN 回归非常简单,它计算被测试点的 K 个最接近点的均值。
让我们手动预测单个点:
```
py
>>>
example_point
=
X
[
0
```
现在,我们需要获取离我们的
`our_example_point`
最近的 10 个点:
```
py
>>>
from
sklearn.metrics
import
pairwise
>>>
distances_to_example
=
pairwise
.
pairwise_distances
(
X
)[
0
]
>>>
ten_closest_points
=
X
[
np
.
argsort
(
distances_to_example
)][:
10
]
>>>
ten_closest_y
=
y
[
np
.
argsort
(
distances_to_example
)][:
10
]
>>>
ten_closest_y
.
mean
()
0.28000
```
我们可以看到它非常接近预期。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录