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值过小会发生过拟合)
相关推荐
金銀銅鐵8 小时前
[Python] 扩展欧几里得算法
python·数学·算法
To_OC10 小时前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC1 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
05Kevin2 天前
lk每日冒险题--数据结构6.27
算法
To_OC2 天前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安2 天前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者2 天前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent