Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
ml-for-humans-zh
提交
2f2f2da3
M
ml-for-humans-zh
项目概览
OpenDocCN
/
ml-for-humans-zh
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
ml-for-humans-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
2f2f2da3
编写于
10月 16, 2017
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2.3:knn
上级
47a8fd0e
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
113 addition
and
0 deletion
+113
-0
2.3.md
2.3.md
+113
-0
未找到文件。
2.3.md
0 → 100644
浏览文件 @
2f2f2da3
# 2.3 监督学习 III
> 原文:[Machine Learning for Humans, Part 2.3: Supervised Learning III](https://medium.com/machine-learning-for-humans/supervised-learning-3-b1551b9c4930)
> 作者:[Vishal Maini](mailto:ml4humans@gmail.com)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 非参数化模型:KNN、决策树和随机森林。包含交叉验证、超参数调优和集成模型。
## 非参数学习器
> 事情变得有点...奇怪了。
我们目前为止涉及的方法,线性回归,对率回归和 SVM ,它们的模型形式是预定义的。与之相反,非参数学习器事先没有特定的模型结构。在训练模型之前,我们不会推测我们尝试习得的函数
`f`
的形式,就像之前的线性回归那样。反之,模型结构纯粹由数据定义。
这些模型对于训练数据的形状更加灵活,但是有时会有可解释性的代价。不久你就会更理解它。让我们继续吧。
## K 最近邻(KNN)
> 你是你的最亲密的 K 个朋友的均值。
KNN 看起来图样图森破,不像是机器学习算法。它的思路是,通过寻找 K 个最近的数据点的标签,来标记测试数据点
`x`
。
看一看下面的图像。让我们假设,你想知道,迷之绿色圆圈是红色三角还是蓝色方块。你怎么做呢?
你可以尝试提出一个迷之方程,它查看绿色圆圈在坐标平面的哪里,并作出相应的预测。或者,你可以仅仅查看三个最近的邻居,并猜测绿色圆圈可能是个红色三角。你也可以进一步扩展圆圈,并查看五个最近邻,并这样作出预测(五个最近邻里面,有三个蓝色方块,所以我们猜测,
`k=5`
时迷之绿色圆圈是蓝色方块。
![](
img/2-3-1.png
)
> KNN 的演示,其中`k=1, 3, 5`。为了划分上面的迷之绿色圆圈(`x`),查看它的单个最近邻,是个“红色三角”。所以我们猜测`ŷ`为“红色三角”。`k=3`时,查看三个最近邻:这里的众数仍然是“红色三角”,所以`ŷ`为“红色三角”。`k=5`时,我们选取五个最近邻的众数,要注意`ŷ`变为了“蓝色三角”。图片来自维基百科。
就是这样。这就是 KNN。你查看了 K 个最近的数据点,如果变量是连续的(例如房价),取它们的均值;如果变量是离散的(例如猫或者狗),取它们的众数。
如果你打算猜测未知房价,你可以选取一些地理上邻近的房子,然后取平均,你就会得到一些很棒的猜测。这可能甚至优于参数化回归模型,一些经济学家构建了它们来估计卧室/浴室、邻近的学校、公共交通的距离,以及其它的数量的参数。
> 如何使用 KNN 来预测房价:
> 1) 储存训练集。`X`是特征,例如邮政编码、邻居、卧室数量、面积、公共交通的距离,以及其它。`Y`是对应的售价。
> 2) 将你的训练集排序,按照与测试集中的房子的相似性,基于`X`中的特征。我们下面会定义“相似性”。
> 3) 计算 K 个最邻近的房子的均值。这就是你对售价(也就是`ŷ`)的猜测。
KNN 不需要预定义的参数化函数
`f(X)`
,它用于将
`Y`
与
`X`
相关联。这使得它更适合关系过于复杂,不能用简单的线性模型表示的情况。
### 距离度量:定义和计算“邻近性”
在寻找“最近邻”的时候,你如何计算问题中的数据点的距离呢?你如何在数学上判断,示例中的哪个蓝色方块和红色三角更接近绿色圆圈?尤其是,如果你无法画出一幅漂亮的二维图像,用眼睛观测它?
最直接的度量是欧氏(几何)距离(“像乌鸦飞过”的一条直线)。另一个是曼哈顿(街区)距离,就像在城市块中行走。你可以想象,在涉及到 Uber 司机的费用计算的模型中,曼哈顿距离更加实用。
![](
img/2-3-2.png
)
> 绿色直线为欧氏距离。蓝色直线为曼哈顿距离。来源:维基百科
还记得用于寻找直角三角形斜边长度的毕达哥拉斯(勾股)定理嘛?
![](
img/2-3-3.png
)
> `c`为斜边(上面的绿色直线),`a`和`b`是两个直角边(上面的红色直线)。
通过计算
`a`
和
`b`
长度的平方和的平方根,我们就解出了
`c`
,求出了斜边长度。这里
`a`
和
`b`
是三角形的直角(正交)边(也就是,它们互为 90 度角,在空间中垂直)。
![](
img/2-3-4.png
)
给定两个正交方向的向量的情况下,求解斜边长度的思路,可以推广到多维。这就是 N 维空间的点
`p`
和
`q`
的欧氏距离
`d(p,q)`
的推导方式:
![](
img/2-3-5.png
)
> 欧氏距离的公式,由勾股定理推出。
使用这个公式,你可以计算所有训练数据点,到你尝试标注的数据点的邻近度,并选取 K 个最近邻的均值或众数,来做出你的预测。
通常你不需要手动计算任何距离,用搜索引擎简单搜索一下,你就能在 NumPy 或者 SciPy 找到预构建的函数,会为你做这个事情,例如,
`euclidean_dist = numpy.linalg.norm(p-q)`
。但是看到八年级的集合概念如何有助于构建当今的 ML 模型,这很有趣。
### 选取`k`:使用交叉验证调优超参数
为了决定我们使用哪个
`k`
,你可以测试不同的 KNN 模型,使用交叉验证以及
`k`
的不同值。
+
将你的训练集分成两部分,在一部分上训练模型,将保留的部分用作测试集。
+
通过将模型的预测(
`ŷ`
),与测试数据的真实值(
`y`
)相比,看看你的模型表现如何。
+
在所有迭代中,通常选取误差最小的模型。
![](
img/2-3-6.png
)
> 交叉验证的演示。分块和迭代的数量可以修改。
### K 的较高值防止过拟合
K 的较高值能防止过拟合,但是如果 K 太高的话,你的模型会有很大偏差,并且不灵活。选取一个极端的示例:如果
`k=N`
(数据点的总数),模型就失效了,将所有测试数据分类为训练数据的均值或者众数。
如果动物数据集中的单个最常见的动物是苏格兰折耳猫,
`k=N`
(训练观测值数量)的 KNN 会将实际上的每个其它动物预测成它。在 Vishal 看来,这个很棒,但 Samer 不同意。
![](
img/2-3-7.png
)
> 完全没有来由的苏格兰折耳猫`.gif`。我们可以休息一下。
### 真实世界中使用 KNN 的地方
一些你可以使用 KNN 的地方:
+
分类:诈骗检测。模型可以使用新的训练样本马上更新,因为你仅仅是存储新的数据点,这允许你快速适应新的诈骗方法。
+
回归:预测房价。在房价预测中,字面上的“最近邻”实际上很好暗示了价格上的相似。KNN 在物理相似性很重要的领域很实用。
+
填充缺失的训练数据。如果你的
`.csv`
中的一列有大量缺失值,你可以通过选取均值或者众数填充数据。KNN 可能会给你每个缺失值的更加准确的猜测。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录