KNN机器学习算法详解说明
树图思维导图提供 KNN算法说明脑图 在线思维导图免费制作,点击“编辑”按钮,可对 KNN算法说明脑图 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:57620be2877456d2522be51c54669e86
KNN算法-06思维导图模板大纲
定义
如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别
计算距离
使用欧式距离, 每一个维度差值的平方和开根号
判断所属类别
k个邻居中大多数属于那个类别, 你就属于那个类别
安装scikit-learn
pip3 install scikit-learn==0.19.1
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
n_neighbors: 最近的邻居数量
注意: 邻居的数量不能大于样本数量
方法
fit(x, y ) 模型训练, x特征值, y目标值
predict(x): 使用模型对数据进行预测, x特征, 返回值预测的目标值
1. 欧式距离:
各个维度差值的平方和再开根号
2. 曼哈顿距离(城市街区距离)
各个维度差值的绝对值的和
3. 切比雪夫距离(国王最少移动的步数):
各个维度差值的绝对值的最大值
4. 闵可夫斯基距离:
是多个距离的综合表现形式
当p=1的时候, 是曼哈顿距离
当p=2的时候, 是欧式式距离
当p->♾的时候, 是切比雪夫距离
总结: 上面四种距离, 都没有进行无量纲化处理.
缺点:
1. 把所有维度数据同单位看待了
2. 没有考虑各个维度数据的分布情况(均值, 方差)
5. 标准化欧氏距离【了解】
就是对欧式距离进行了无量纲化处理, 相当于把每一个维度压缩到了均值0, 方差为1的范围了.
1. 各个维度的差值除以这个维度标准差再平方求和开根号
6. 余弦距离【了解】
就是两个向量的夹角的余弦值. 范围是[-1, 1]之间, 用于衡量两个样本相关性.绝对值越接近与1就越相关, 越接近与0 就越不相关.
7. 汉明距离(Hamming Distance)【了解】
两个等长的字符串, 一个变为另外一个最少需要替换次数
8. 杰卡德距离(Jaccard Distance)【了解】
杰卡德相似系数: A与B交集的数量 / A与B并集的数量
杰卡德距离 = 1 - 杰卡德相似系数
9. 马氏距离(Mahalanobis Distance)【了解】
是一种基于样本分布的度量方式.
K值过小:
容易受到异常值的影响
就是模型变复杂了, 容易产生过拟合
k值过大:
容易受到样本均衡的影响
就是模型变简单了, 容易产生欠拟合
实际中: 选择一个较小K值, 然后使用交叉验证与网格搜索选一个最优的K值
扩展
近似误差: 模型在训练集上的误差, 这个误差小, 但是估计误差可能会比较大, 此时模型也不是一个最佳模型.
估计误差: 模型在测试集上误差, 这个误差小, 说明模型就接近最佳模型
总结: 估计误差小, 才是真的好
作用
提高K近邻搜索的速度
树的建立
选择向量的哪一维进行划分
最开始选择方差最大的维度划分
- 如何划分数据?
- 选择中位数进行划分; 如果是偶数随机从中间的两个数中随机选择一个
- KD树的建立过程
- 把所有样本放入到一个区域中
- 计算各个维度方差, 选择方差较大的维度进行划分
- 根据中位数进行划分, 大于中位数的为右子树, 小于中位数为左子树
- 接下来在剩余维度中选择一个方差比较大的维度进行划分
- 直到所有的点都挂在树上了为止.
- KD树的搜索过程
- 根据查找点, 从根节点开始查找, 如果小于分割点就去左子树查找, 如果大于分割点就去右子树查找, 直到遇到叶子节点
- 在查找的过程中把经过的点都会添加到栈中.
- 回溯从栈中取出一个点, 计算查找点到这个点的距离, 把这个点记为最近的点, 距离为最近距离.
- 以查找点为圆心, 一个这个最近的距离为半径画圆, 如果这个圆与分割线相交, 就把另一边的点添加到栈中. 计算查找的点距离当前点距离, 如果这个距离小于最近距离, 更新最近点和最小的距离, 如果不相交就不动了, 继续出栈
- 直到栈空了为止
数据集模块: sklearn.datasets
数据集获取
获取小数据集
load_*() , 在本地加载
获取大数据集
fetch_*(subset='train') 从网络上下载数据
subset: train(训练集), test(测试集), all(测试集+训练集)
返回值都是Bunch, 字典格式
*特征数据: data
* 目标数据: target
* 特征的名称: feature_names
* 目标的名称: target_names
* 数据集描述: DESCR
数据可视化
绘制散点图API
sns.lmplot(x=col1, y=col2, data=data, hue='target', fit_reg=False)
* x: x轴的列名
* y: y轴的列名
* data: 数据的DataFrame
* hue: 类别的列名
* fit_reg: 是否需要进行线性拟合, 默认为True.
API
train_test_split(*arrays, **options)
参数
- x: 数据集的特征值
- y: 数据集的目标值
- test_size: 测试占用于的比例, 是一个浮点数
- random_state: 随机数种子, 如果种子相同分割数据集就相同, 如果不同分割数据集也不同
返回值
- x_train, x_test, y_train, y_test
- 训练集特征值, 测试值的特征值, 训练集的目标值, 测试集的目标值
定义
通过一些转换函数把特征数据转换为更加适合算法模型特征数据的过程.
归一化
定义
通过最大值和最小值, 把数据变换到[0,1]之间 ; 容易受到异常值的影响, 鲁棒性差, 一般不用
API
sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1))
feature_range: 映射区间, 默认[0, 1]
方法
fit(x) 计算最大值和最小值
transform(x) 对数据进行转换(带入公式进行计算)
fit_transform(x) 计算最大值和最小值, 然后对数据进行转换
标准化
定义
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
特点
受异常值的响应小, 鲁棒性好, 一般都是使用它
API
sklearn.preprocessing.StandardScaler( )
方法
- fit() 计算均值和标准差
- transform() 对数据进行标准化转换
- fit_transform()
- 处理之后每列来说所有数据都聚集在均值0附近标准差差为1
注意
一般情况下我们使用都是标准化
API
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto', metric='minkowski', p=2)
n_neighbors: 邻居数量, k值
algorithm: 搜索算法 auto
metric: 距离公式. 默认是欧式距离
- 训练模型
- fit(x_train, y_train)
- 使用模型进行预测
- predict(x_test), 返回预测的目标值
- 模型评估(准确率)
- score(x_test, y_test) 返回就准确率
优点:
简单有效
重新训练的代价低
适合类域交叉样本
适合大样本自动分类
缺点:
惰性学习
类别评分不是规格化
输出可解释性不强
对不均衡的样本不擅长
计算量较大
交叉验证
目的: 为了提高模型训练结果可信度.
数据划分
- 把数据集划分为 训练集 和 测试集
- 把训练集划分为 训练集 和 验证集
n折交叉验证
把训练集划分为n等份, 选择一份作为为验证集, 其他的作为训练, 训练n轮, 这就是n折交叉验证
网格搜索
- 作用: 用于参数调优; 选择出好的超参数.
- 超参数: 在进行模型训练的时候, 需要手动指定的参数.
- 过程: 每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型
API
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
- estimator: 原始的评估器
- param_grid: 超参数的字典,格式: {'参数名称': [ 3, 5, 7, 9 ]}
- cv: 几折交叉验证
方法
- fit(x_train, y_train)
- predict(x_test)
- score(x_test, y_test)
- best_score_ : 交叉验证最好分数
- best_estimator_ : 交叉验证最好的模型
- cv_results_ : 交叉验证的结果
- 加载数据集
- 数据的基本处理
- 缩小数据规模
- 选择有效的时间特征
- 去掉签到位置少的地方
- 确定特征值和目标值
- 分割数据集
- 特征工程(特征预处理-标准化)
- 机器学习(模型训练) KNN + GridSearchCV
- 模型评估
留出法
交叉验证法
自助法