Step1:导入库函数
import numpy as np#莺尾花数据集fromsklearnimportdatasets#KNN分类器froms klearn.neighborsimportkneighborsclassifierfromsklearn.mom
导入#莺尾花数据集iris=datasets.load _ iris (x=iris.datay=iris.target )获得训练集合和验证集合,8: 2x _ 83360
在此设定参数k(n_neighbors )=5,并使用欧式距离(metric=喜欢的歌曲p=2)
#训练模型clf=kneighborsclassifier (n _ neighbors=5,p=2,metric=“随心所欲的歌曲”) ) clf.fit(x_train,y_train )
Step4:模型预测可视化
#预测x_pred=clf.predict(x_test ) ACC=sum ) x_pred==y_test )/X_pred.shape[0]print '预测的准确度ACC
让我们通过表格来看看KNN的训练和预测过程。 在这里用表格可视化:
1 .训练数据[表对应于list]
2.KNN.fit(x,y )的进程可以简单地认为是表存储器
3.KNN.Predict(x )预测过程计算x和所有训练数据的距离。 这里使用欧式距离进行计算。 预测过程如下
计算step1:和所有训练数据的距离
step2:按距离排序编号
设定step:k=5,选择最接近的k个样本进行投票
step4: k附近等级投票
nn _ labels=[ 0,0,0,0,1 ]--得到最后的结果0。
2.4.3模拟数据集KNN回归
Step1:导入库函数
#Demo来自sklearn官方网站importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.neighborsimportkneighboregressorstep 23360的数据
随机生成NP.random.seed(0) #40个(0,1 )的数,乘以5,升序x=NP.sort )5*NP.random.rand ) 40,1 ),axis=0 NP.new axis ]使用# sin函数获得y值,并延伸至一维y=NP.sin(x ).ravel(#addnoisetotargets(y值增加噪声) 336033605 )
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # kinenumerate(n_neighbors ) : # metric='想要的歌曲' (#clf.fit(x, 训练y ) (预测的y_=clf.predict(T ) t ) PLT.subplot (6,1,i 1 ) plt.scatter(X,x,y,catter ) )
Step4:模型分析
k=1时,预测结果只与最近的训练样本相关,根据预测曲线可知k小时容易发生拟合。
k=40时,预测结果与最近的40个样本相关。 因为我们只有40个样本
,此时是所有样本的平均值,此时所有预测值都是均值,很容易发生欠拟合。一般情况下,使用knn的时候,根据数据规模我们会从[3, 20]之间进行尝试,选择最好的k,例如上图中的[3, 10]相对1和40都是还不错的选择。
2.4.4 马绞痛数据–kNN数据预处理+kNN分类pipeline
# 下载需要用到的数据集!wget https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/3K/horse-colic.csv # 下载数据集介绍!wget https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/3K/horse-colic.namesStep1: 库函数导入
import numpy as npimport pandas as pd# kNN分类器from sklearn.neighbors import KNeighborsClassifier# kNN数据空值填充from sklearn.impute import KNNImputer# 计算带有空值的欧式距离from sklearn.metrics.pairwise import nan_euclidean_distances# 交叉验证from sklearn.model_selection import cross_val_score# KFlod的函数from sklearn.model_selection import RepeatedStratifiedKFoldfrom sklearn.pipeline import Pipelineimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_split数据集介绍:horse-colic.names
数据中的’?‘表示空值,如果我们使用KNN分类器,’?'不能数值,不能进行计算,因此我们需要进行数据预处理对空值进行填充。
这里我们使用KNNImputer进行空值填充,KNNImputer填充的原来很简单,计算每个样本最近的k个样本,进行空值填充。
我们先来看下KNNImputer的运行原理:
Step3: KNNImputer空值填充–使用和原理介绍
X = [[1, 2, np.nan], [3, 4, 3], [np.nan, 6, 5], [8, 8, 7]]imputer = KNNImputer(n_neighbors=2, metric='nan_euclidean')imputer.fit_transform(X) nan_euclidean_distances([[np.nan, 6, 5], [3, 4, 3]], [[3, 4, 3], [1, 2, np.nan], [8, 8, 7]])
Step4: KNNImputer空值填充–欧式距离的计算
Step5: 基于pipeline模型训练&可视化
什么是Pipeline, 我这里直接翻译成数据管道。任何有序的操作有可以看做pipeline,例如工厂流水线,对于机器学习模型来说,这就是数据流水线。 是指数据通过管道中的每一个节点,结果除了之后,继续流向下游。对于我们这个例子,数据是有空值,我们会有一个KNNImputer节点用来填充空值, 之后继续流向下一个kNN分类节点,最后输出模型。
Step 6: 结果分析
我们的实验是每个k值下,随机切分20次数据, 从上述的图片中, 根据k值的增加,我们的测试准确率会有先上升再下降再上升的过程。 [3, 5]之间是一个很好的取值,上文我们提到,k很小的时候会发生过拟合,k很大时候会发生欠拟合,当遇到第一下降节点,此时我们可以 简单认为不在发生过拟合,取当前的k值即可。