第一章_机器学习概述_08.KNN算法
一、KNN
K-近邻算法(K Nearest Neighbor,简称KNN)。比如:根据你的“邻居”来推断出你的类别
KNN算法思想:如果一个样本在特征空间中的 k 个最相似(通过距离判断)的样本中的大多数属于某一个类别,则该样本也属于这个类别



二、K值的选择

1、K值过小:用较小邻域中的训练实例进行预测
(1)容易受到异常点的影响。
(2)K值的减小就意味着整体模型变得复杂,容易发生过拟合。(只分析1个人容易过度分析)
2、K值过大:用较大邻域中的训练实例进行预测
(1)受到样本均衡的问题。
(2)且K值的增大就意味着整体的模型变得简单,欠拟合。(同时分析很多人容易分析不到位)
3、举例:K=N(N为训练样本个数)
无论输入实例是什么,只会按训练集中最多的类别进行预测, 受到样本均衡的影响
4、如何对K超参数进行调优?
需要一些方法来寻找这个最合适的K值:交叉验证、网格搜索
三、解决的问题
1、 解决问题:分类问题(标签不连续)、回归问题(标签连续)
2、算法思想:若一个样本在特征空间中的 k 个最相似的样本大多数属于某一个类别,则该样本也属于这个类别
3、相似性:欧氏距离

四、KNN算法API使用 - 分类问题
1、 KNN分类API
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
"""
KNN算法介绍(K Nearest Neighbors), K近邻算法
原理:
基于 欧式距离(或者其它距离计算方式)计算 测试集 和 每个训练集之间的距离, 然后根据距离升序排列, 找到最近的K个样本.
基于K个样本投票, 票数多的就作为最终预测结果 -> 分类问题.
基于K个样本计算平均值, 作为最终预测结果 -> 回归问题.
实现思路:
1. 分类问题
适用于: 有特征, 有标签, 且标签是不连续的(离散的)
2. 回归问题.
适用于: 有特征, 有标签, 且标签是连续的.
KNN算法, 分类问题思路如下:
1. 计算测试集和每个训练的样本之间的 距离.
2. 基于距离进行升序排列.
3. 找到最近的K个样本.
4. K个样本进行投票.
5. 票数多的结果, 作为最终的预测结果.
代码实现思路:
1. 导包.
2. 准备数据集(测试集 和 训练集)
3. 创建(KNN 分类模型)模型对象.
4. 模型训练.
5. 模型预测.
"""
# 1. 导包.
from sklearn.neighbors import KNeighborsClassifier # 分类
# from sklearn.neighbors import KNeighborsRegressor # 回归
# 2. 准备数据集(测试集 和 训练集)
# train: 训练集
# test: 测试集
# neighbors: 最近邻的邻居数
x_train = [[0], [1], [2], [3]] # 训练集的特征数据, 因为特征可以有多个特征, 所以是一个二维数组。
y_train = [0, 0, 1, 1] # 训练集的标签数据, 因为标签是离散的, 所以是一个一维数组
x_test = [[5]] # 测试集的特征数据
# 3. 创建(KNN 分类模型)模型对象.
# estimator: 估计器, 模型对象, 也可以用变量名 model做接收.
estimator = KNeighborsClassifier(n_neighbors=3)
# 4. 模型训练
# 传入: 训练集的特征数据, 训练集的标签数据
estimator.fit(x_train, y_train)
# 5. 模型预测.
# 传入: 测试集的特征数据, 获取到: 预测结果(测试集的标签, y_test)
y_pre = estimator.predict(x_test)
# 6. 打印预测结果.
print(f'预测值为: {y_pre}')
2、KNN回归API:
sklearn.neighbors.KNeighborsRegressor(n_neighbors=5)
"""
KNN算法介绍(K Nearest Neighbors), K近邻算法
原理:
基于 欧式距离(或者其它距离计算方式)计算 测试集 和 每个训练集之间的距离, 然后根据距离升序排列, 找到最近的K个样本.
基于K个样本投票, 票数多的就作为最终预测结果 -> 分类问题.
基于K个样本计算平均值, 作为最终预测结果 -> 回归问题.
实现思路:
1. 分类问题
适用于: 有特征, 有标签, 且标签是不连续的(离散的)
2. 回归问题.
适用于: 有特征, 有标签, 且标签是连续的.
KNN算法, 回归问题思路如下:
1. 计算测试集和每个训练的样本之间的 距离.
2. 基于距离进行升序排列.
3. 找到最近的K个样本.
4. 基于K个样本的标签值, 计算平均值.
5. 将上述计算出来的平均值, 作为最终的预测结果.
代码实现思路:
1. 导包.
2. 准备数据集(测试集 和 训练集)
3. 创建(KNN 回归模型)模型对象.
4. 模型训练.
5. 模型预测.
总结:
K值过小, 容易受到异常值的影响, 且会导致模型学到大量的"脏的特征", 导致出现: 过拟合.
K值过大, 模型会变得简单, 容易发生: 欠拟合.
"""
# 1. 导包.
from sklearn.neighbors import KNeighborsRegressor # KNN算法的 回归模型
# 2. 准备数据集(测试集 和 训练集)
# 开根号: 14.53 14.28 1 2.24
# 平方和: 211 204 1 5
# 差值: (3,11,9) (2,10,10) (0,1,0) (1,0,2)
x_train = [[0, 0, 1], [1, 1, 0], [3, 10, 10], [4, 11, 12]] # 训练集的特征数据, 因为特征可以有多个特征, 所以是一个二维数组
y_train = [0.1, 0.2, 0.3, 0.4] # 训练集的标签数据, 因为标签是连续的, 所以是一个一维数组
x_test = [[3, 11, 10]] # 测试集的特征数据
# 3. 创建(KNN 回归模型)模型对象.
estimator = KNeighborsRegressor(n_neighbors=2)
# 4. 模型训练.
estimator.fit(x_train, y_train)
# 5. 模型预测.
y_pre = estimator.predict(x_test)
# 6. 打印预测结果.
print(f'预测值为: {y_pre}')
更多推荐


所有评论(0)