简述:
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
# 1.导包;fromsklearn.neighborsimportKNeighborsClassifier#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最近?3(因为5-3=2,2平方=4,4开根号=2即为根号4)# 5和2之间的距离:5-2=3,3的平方=9,9开根号=3# 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
# 1.导包;fromsklearn.neighborsimportKNeighborsRegressor#KNN算法的 回归模型# 2.准备数据集(测试集 和 训练集);# 差值:(3,11,9) (2,10,10) (0,1,0) (1,0,2)# 平方和:211 204 1 5# 开根号:14.53 14.28 1 2.24x_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值过小会发生过拟合)