2. KNN算法之 分类&回归API实现

简述:
1. KNN算法介绍:(K Nearest Neighbor-K近邻算法)

2. 原理

1️⃣ 基于欧氏距离(欧氏距离=对应维度差值平方和,开平方根,简单理解:勾股定理) (或其他距离计算方式)计算 测试集和每个调试集之间的距离 ,再根据距离排序,找到最近的K个样本

2️⃣ 基于K个样本投票,票组多的就作为最终预测结果 ==》分类问题;

3️⃣ 基于K个样本计算均值,作为最终预测结果 ==》回归问题;

3. 实现思路:

1️⃣ 分类问题:适用于:适用于有特征、有标签且标签是不连续的(离散的);

2️⃣ 回归问题:适用于:适用于有特征、有标签且标签是连续的;

4. KNN算法分类问题思路

1️⃣ 计算测试集和每个训练的样本之间的距离;

2️⃣基于距离进行升序排序;

3️⃣找到最近的K个样本;

4️⃣①分类问题:K个样本进行投票;|| ②回归问题:基于K个样本的标签计算均值;

5️⃣①分类问题:票数多的结果,作为最终预测结果;|| ②回归问题:将计算出的均值,作为最终的预测结果;

5. 代码实现思路:

1️⃣ 导包;

2️⃣准备数据集(测试集 和 训练集);

3️⃣ 创建模型对象(KNN模型对象/ KNN回归对象);

4️⃣ 模型训练;

5️⃣ 模型预测;

6. 总结:

K值过小,容易受到异常值的影响且会导致模型学到大量"脏的特征",导致出现:过拟合;

K值过大,模型会变得简单,容易发生:欠拟合;

1. KNN算法分类API

Scikit-learn中平票处理:默认选择数值较小的标签,可以通过设置weights='distance',让距离近的样本有更大权重、选择距离最近的标签;

python 复制代码
# 1.导包;
from sklearn.neighbors import KNeighborsClassifier#KNN算法的 分类模型

# 2.准备数据集(测试集 和 训练集);
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_pred=estimator.predict(x_test)
# 6.打印预测结果
print(f'预测值为:{y_pred}')
# 求谁离5最近?:根据欧氏距离(对应维度差值平方和,开平方根,简单理解:勾股定理) 即上述平方和/开根号做升序:1  1   0   0
# n_neighbors=2求的是距离x_test=5最近的2个即3,2,对3,2对应的y_train进行投票,投票结果:都是1,所以最终预测结果是1
# n_neighbors=3求的是距离x_test=5最近的3个即3,2,1,对3,2,1对应的y_train进行投票,投票结果:1个0、2个1,所以最终预测结果是1
# n_neighbors=4求的是距离x_test=5最近的4个即4,3,2,1,对4,3,2,1对应的y_train进行投票,投票结果:2个0、2个1,
#   但是0<1,两个预测值哪个结果小就认为哪个模型更简单,根据奥卡姆剃刀原则(给定两个具有相同泛化误差的模型,较简单的模型 比 较复杂的模型更可取),所以最终预测结果是0;
#             或者说:当票数相同时,优先选择在训练集中最早出现的类别,在y_train=[0,0,1,1],0比1更早出现,所以最终预测结果是0;
#             或者说:当票数相同时,会比较Unicode,0更小,所以预测结果是0;
#             或者说:Scikit-learn中平票处理:默认选择数值较小的标签,可以通过设置weights='distance',让距离近的样本有更大权重、选择距离最近的标签;

2. KNN算法回归API

python 复制代码
# 1.导包;
from sklearn.neighbors import KNeighborsRegressor #KNN算法的 回归模型

# 2.准备数据集(测试集 和 训练集);
# 差值:(3,11,9)   (2,10,10)   (0,1,0)     (1,0,2)
# 平方和:211           204         1       5
# 开根号:14.53        14.28        1       2.24
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.创建模型对
estimator=KNeighborsRegressor(n_neighbors=4)
# 4.模型训练
estimator.fit(x_train,y_train)
# 5.模型预测
y_pre=estimator.predict(x_test)
# 6.打印预测结果:
print("预测结果:",y_pre)
# n_neighbors=3:3邻距,求距离最近(平方和/开根号 最小)的3个值分别对应的y_train的值,即 0.2, 0.3, 0.4,三者平均值是0.3,所以预测结果为0.3;
# n_neighbors=2:2邻距,求距离最近(平方和/开根号 最小)的2个值分别对应的y_train的值,即 0.3, 0.4,两者平均值是0.35,所以预测结果为0.35;
# n_neighbors=4:4邻距,求距离最近(平方和/开根号 最小)的4个值(即跟样本数一致)分别对应的y_train的值,即 0.1, 0.2, 0.3, 0.4,求平均数,所以预测结果为0.25;
#     (因为找的数是所有的全算,即k=n,当k=n时永远取全部数字的平均值,即k值过大会发生欠拟合,k值过小会发生过拟合)
相关推荐
X journey2 小时前
机器学习进阶(23):K-means聚类
人工智能·算法·机器学习
mjhcsp2 小时前
根号快速计算牛顿迭代法
开发语言·c++·算法·迭代法
菜鸟丁小真2 小时前
LeetCode hot100-79.单词搜索
数据结构·算法·leetcode·深度优先·知识总结
WL_Aurora2 小时前
排序算法(二)
java·算法·排序算法
Tisfy2 小时前
LeetCode 2833.距离原点最远的点:计数
算法·leetcode·字符串·题解·模拟·计数
浅念-2 小时前
LeetCode 模拟算法:用「还原过程」搞定编程题的入门钥匙
开发语言·c++·学习·算法·leetcode·职场和发展·模拟
t-think2 小时前
操作符详解-C语言(下)
c语言·算法
阿Y加油吧2 小时前
算法二刷复盘|旋转排序数组二分双杀(LeetCode 33 & 153)
算法·leetcode·职场和发展
skywalker_112 小时前
力扣hot100(9-找到字符串中所有字母异位词;10-和为K的子数组)
算法·leetcode·职场和发展