文章目录
- 一、机器学习种类
- 1.1 有监督学习 与 无监督学习
- 1.2 监督学习 与 强化学习
- 二、K近邻(KNN)K Nearest Neighbors
- 2.1 什么是K近邻
- 2.2 K近邻的距离度量公式
- 2.3 K值选择--近似误差(训练集误差)与 估计误差(测试集误差)
- 2.4 kd-tree (k-dimensional树)
- 2.5 构造方法
- 2.6 K近邻算法代码
- 2.7 K近邻模型优化-- K值
一、机器学习种类
1.1 有监督学习 与 无监督学习
有监督学习 | 无监督学习 | |
样本 | 必须要有训练集与测试样本。在训练集中找规律,而对测试样本使用这种规律。 | 没有训练集,只有一组数据,在该组数据集内寻找规律。 |
目标 | 方法是识别事物,识别的结果表现在给待识别数据加上了标签。因此训练样本集必须由带标签的样本组成。 | 方法只有要分析的数据集的本身,预先没有什么标签。 如果发现数据集呈现某种聚集性,则可按自然的聚集性分类,但不予以某种预先分类标签对上号为目的。 |
- (1)无监督学习是在寻找数据集中的规律性,这种规律性并不一定要达到划分数据集的目的,也就是说不一定要“分类”。
这一点是比有监督学习方法的用途要广。譬如分析一堆数据的主分量,或分析数据集有什么特点都可以归于
非监督学习方法的范畴。 - (2)用非监督学习方法分析数据集的主分量与用K-L变换计算数据集的主分量又有区别。后者从方法上讲不是学习方法。
因此用K-L变换找主分量不属于无监督学习方法,即方法上不是。而通过学习逐渐找到规律性这体现了学习方法这一点。
在人工神经元网络中寻找主分量的方法属于无监督学习方法。
1.2 监督学习 与 强化学习
监督学习 | 强化学习 | |
反馈映射 | 都会学习出输入到输出的一个映射,监 督式学习出的是之间的关系,可以告诉 算法什么样的输入对应着什么样的输出。 | 强化学习出的是给机器的反馈 reward function,即用来判断这个行为是好是坏。 |
反馈时间 | 做了比较坏的选择会立刻反馈给算法。 | 结果反馈有延时,有时候可能需 要走了很多步以后才知道以前的 某一步的选择是好还是坏。 |
输入特征 | 输入是独立同分布的。 | 面对的输入总是在变化,每当算 法做出一个行为,它影响下一次 决策的输入。 |
行为模式 | 不考虑行为间的平衡,只是 exploitative。 | 一个 agent 可以在探索和开发(exploration and exploitation)之间做权衡,并且选择一个最大的 回报。 exploration 会尝试很多不同的事情,看它们是否 比以前尝试过的更好。 exploitation 会尝试过去经验中最有效的行为。 |
二、K近邻(KNN)K Nearest Neighbors
2.1 什么是K近邻
思想:只要知道你朋友(邻居)是什么人,就能知道你是什么人
K近邻是一种 懒惰的学习方法:(基于实例学习)
Lazy learners(懒惰学习): instance-based learning
新数据来时,才开始学习给出分类
2.2 K近邻的距离度量公式
距离(distance)–衡量样本之间的相相识度
- 欧式距离(平面几何之间的距离)
- 曼哈顿距离(两点之间X的距离+Y的距离:类似楼梯铺红毯,红毯的长度)
通用距离公式 ( 闵可夫斯基距离 )
当 为曼哈顿距离:
当 为欧式距离:
2.3 K值选择–近似误差(训练集误差)与 估计误差(测试集误差)
对现有训练集的训练误差,关注训练集,如果近似误差过小可能会出现过拟合的现象,
对现有的训练集能有很好的预测,但是对未知的测试样本将会出现较大偏差的预测。
模型本身不是最接近最佳模型
估计误差
可以理解为对测试集的测试误差,关注测试集,估计误差小说明对未知数据的预测能力好,模型本身最接近最佳模型。
K值确定标准:
K值过小:特征空间被划分为更多子空间(模型的项越多),整体模型变复杂,容易过拟合,
选择的范围就比较小,训练的时候命中率较高,近似误差小,
用 test_dataset 测试时的时候就容易出错,估计误差大,容易过拟合。
K值=N: 无论输入实例是什么,都将简单的预测他属于训练实例中最多的类
k值较大,就相当于用较大领域中的训练实例进行预测,泛化误差小(方差小),但缺点是近似误差大(偏差大),换句话说,K值较大就意味着整体模型变得简单,容易发生欠拟合;一个极端是k等于样本数m,则完全没有分类,此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单。
开始
指定K值
计算输入样本与训练样本之间的距离
按距离排序
筛选K个最近邻居
投票判断分类
结束
2.4 kd-tree (k-dimensional树)
原理:一种分割k维数据空间的数据结构。应用于多维空间关键数据搜索(如:范围和最近邻搜索)。
kd树是是一种二叉树,表示对k维空间的一个划分,构造kd树相当于不断地用垂直于坐标轴的超平面
将K维空间切分,构成一系列的K维超矩形区域。kd树的每个结点对应于一个k维超矩形区域。利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。
2.5 构造方法
- 构造根结点,使根结点对应于K维空间中包含所有实例点的超矩形区域;
- 通过递归的方法,不断地对k维空间进行切分,生成子结点。在超矩形区域上选择一个坐标轴和
在此坐标轴上的一个切分点,确定一个超平面,这个超平面通过选定的切分点并垂直于选定的坐标轴,
将当前超矩形区域切分为左右两个子区域(子结点);这时,实例被分到两个子区域 - 上述过程直到子区域内没有实例时终止(终止时的结点为叶结点)。在此过程中,将实例保存在相应的结点上。
- 通常,循环的选择坐标轴对空间切分,选择训练实例点在坐标轴上的中位数为切分点,
这样得到的kd树是平衡的(平衡二叉树:它是一棵空树,或其左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是平衡二叉树)。
注意:平衡的kd树搜索时的效率未必是最低的。特殊情况有时在稀疏点切
2.6 K近邻算法代码
在scikit-learn 中,K近邻类库sklearn.neighbors: 【代码演示】
- KNN 分类树 的类 KNeighborsClassifier
KNN 回归树 的类 KNeighborsRegressor - KNN的扩展类
限定半径最近邻分类树的类RadiusNeighborsClassifier
限定半径最近邻回归树的类RadiusNeighborsRegressor
最近质心分类算法NearestCentroid。
在这些算法中,KNN分类和回归的类参数完全一样。具体参数如下:
sklearn.neighbors.KNeighborsClassifier(
n_neighbors=5,
weights=’uniform’,
algorithm=’auto’,
leaf_size=30,
p=2,
metric=’minkowski’,
metric_params=None,
n_jobs=None,
**kwargs
)
- n_neighbors:KNN中的k值,默认为5(对于k值的选择,前面已经给出解释);
- weights:用于标识每个样本的近邻样本的权重,可选择"uniform",“distance” 或自定义权重。默认 “uniform”,所有最近邻样本权重都一样。如果是 “distance”,则权重和距离成反比例;如果样本的分布是比较成簇的,即各类样本都在相对分开的簇中时,我们用默认的"uniform"就可以了,如果样本的分布比较乱,规律不好寻找,选择"distance"是一个比较好的选择;
- algorithm:限定半径最近邻法使用的算法,可选‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’。
- ‘brute’对应第一种线性扫描;
- ‘kd_tree’对应第二种kd树实现;
- ‘ball_tree’对应第三种的球树实现;
- ‘auto’则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。
- leaf_size:这个值控制了使用kd树或者球树时, 停止建子树的叶子节点数量的阈值。这个值越小,则生成的kc树或者球树就越大,层数越深,建树时间越长,反之,则生成的kd树或者球树会小,层数较浅,建树时间较短。默认是30。
这个值一般依赖于样本的数量,随着样本数量的增加,这个值必须要增加,否则不光建树预测的时间长,还容易过拟合。可以通过交叉验证来选择一个适中的值。当然,如果使用的算法是蛮力实现,则这个参数可以忽略; - metric,p:距离度量(前面介绍过),默认闵可夫斯基距离 “minkowski”(p=1为曼哈顿距离, p=2为欧式距离);
- metric_params:距离度量其他附属参数(具体我也不知道,一般用得少);
- n_jobs:并行处理任务数,主要用于多核CPU时的并行处理,加快建立KNN树和预测搜索的速度。n_jobs= -1,即所有的CPU核都参与计算。
限定半径最近邻法分类和回归的类的主要参数也和KNN基本一样。具体参数如下:
sklearn.neighbors.RadiusNeighborsClassifier(
radius=1.0,
weights=’uniform’,
algorithm=’auto’,
leaf_size=30,
p=2,
metric=’minkowski’,
outlier_label=None,
metric_params=None,
n_jobs=None,
**kwargs
)
- radius:限定半径,默认为1。半径的选择与样本分布有关,可以通过交叉验证来选择一个较小的半径,尽量保证每类训练样本其他类别样本的距离较远;
- outlier_labe:int类型,主要用于预测时,如果目标点半径内没有任何训练集的样本点时,应该标记的类别,不建议选择默认值 None,因为这样遇到异常点会报错。一般设置为训练集里最多样本的类别。
2.7 K近邻模型优化-- K值
K过小(理论最小=1)也就是邻居数为1,会受到噪声数据影响,降低分类精度
K过大(理论=训练样本数)会受到不相关数据影响,降低分类精度
使用交叉验证寻找最好的K值
经验值 k = sqr(n)/2, n时训练样本数
用强大的 Gridsearch(网格搜索)寻找最优参数