kNN的主要思想:根据某个对象的属性值找到相似的对象们,让对象们一起投票决定这个对象属于哪一类。
这里银行的信息是,根据属性值找到的对象们,并不是来源于一个类,如果是一个类的话,直接将这个待分类对象归类为此类就完成了。
既然是投票,就意味着可能是平票,如果平了的话,就随便选择一个类作为此类的分类即可。
《数据科学实战》这本书里举的例子很贴近我们的生活,引用过来,作为参考:
假设一个人会对自己看过的每部电影都打上“好看”或者“不好看”的标签,现在根据这些历史标签信息,如果给定一部新的电影叫作《狂野的数据》, 我们可以用 k 近邻的方法预测此人是否会觉得这部电影好看。方法首先是要确定电影的属性值,包括电影的长度、风格、性爱场景数、奥斯卡最佳演员的个数以及电影的拍摄预算等。根据这些属性,我们可以找到与《狂野的数据》最相似的 k 部电影,并记录下这 k 部电影的标签信息。如果这些电影总体来看包括更多的是“好看”的标签(这个过程,叫作“投票” ) ,那么我们也自然会预测《狂野的数据》这部电影会得到此人的青睐。
这个例子里,引出了kNN
的k
的含义,根据属性找到最相似的k
个。
其实这个比较好理解,有投票过程,就意味着要确定投票人数,这个数字就是k
啦。
而现在的问题是,如何根据多种标签寻找到最相似的k
部电影。
实际上,kNN需要解决两个核心问题:
- 如何根据属性来定义个体之间的相似性
- 如何确定k的值
kNN的详细步骤
- 确定相似性定义:距离
- 将数据分割为训练数据 + 测试数据
- 选择模型评价标准
- 选择不同的k值,应用kNN模型,看模型效果(这是选择k的过程)
- 基于模型评价标准,选出最优的k值
- 确定k后,测试模型表现(用测试数据)
针对kNN的两个核心问题,第一,相似性衡量的距离是开始就选定好的,k的值是根据多个k值进行对比得出的。
但是,我们并不能穷尽k的选择,只是在有限次的选择中找到最优的。
另外,kNN模型,是无需训练的,只有一个k值是参数,模型本身不包含参数,只有规则。
相似性度量:距离
距离的测量方法选择,有点具体问题具体分析的味道。
另外,还要注意到数据的量纲计算导致的差别,尽量让不同特征的数值在同一水平上,不然,一个特征数值在十万级别,一个在百级别,那距离的度量,就会被这个大万级别的带偏了。比如:
- 250000
- 500
为了使其大致进入同一个量级,可以用250千代替250000,250和500就在一个量级了。
距离的度量选择很多,常见的有:
- 欧式距离
- 余弦相似度
- Jaccard距离:衡量两个集合的相似度
- Mahalanobis 距离
- Hamming距离
- Manhattan距离
这里我都没有放公式,且距离还有很多其他选择,比较好的实际操作方式是,根据问题定义,去查别人是怎么选择的距离。
上面这些距离度量是很整洁的,但是现实数据是多样的,如果需要判别的特征值取值类型都不同,比如有连续值,有分类值,上面这些距离衡量就不能直接用,我们就得变通,甚至是定义自己的距离衡量指标。
一些名词辨析
敏感度 && 特异性:上帝的归上帝,凯撒的归凯撒。
举例子:
敏感度(sensitivity):所有患病的人被诊断为患病,也叫真阳性率(true positive rate),也叫召回率(recall)
特异性(specificity):所有未患病的人被诊断为未患病,也叫真阴性率。
END.