首页 > 编程知识 正文

使用knn算法对鸢尾花数据集进行分类,鸢尾花knn算法

时间:2023-05-03 18:34:48 阅读:177822 作者:2703

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.names

Step1: 库函数导入

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空值填充–欧式距离的计算

# load dataset, 将?变成空值input_file = './horse-colic.csv'df_data = pd.read_csv(input_file, header=None, na_values='?')# 得到训练数据和label, 第23列表示是否发生病变, 1: 表示Yes; 2: 表示No. data = df_data.valuesix = [i for i in range(data.shape[1]) if i != 23]X, y = data[:, ix], data[:, 23]# 查看所有特征的缺失值个数和缺失率for i in range(df_data.shape[1]): n_miss = df_data[[i]].isnull().sum() perc = n_miss / df_data.shape[0] * 100 if n_miss.values[0] > 0: print('>Feat: %d, Missing: %d, Missing ratio: (%.2f%%)' % (i, n_miss, perc))# 查看总的空值个数print('KNNImputer before Missing: %d' % sum(np.isnan(X).flatten()))# 定义 knnimputerimputer = KNNImputer()# 填充数据集中的空值imputer.fit(X)# 转换数据集Xtrans = imputer.transform(X)# 打印转化后的数据集的空值print('KNNImputer after Missing: %d' % sum(np.isnan(Xtrans).flatten()))


Step5: 基于pipeline模型训练&可视化
什么是Pipeline, 我这里直接翻译成数据管道。任何有序的操作有可以看做pipeline,例如工厂流水线,对于机器学习模型来说,这就是数据流水线。 是指数据通过管道中的每一个节点,结果除了之后,继续流向下游。对于我们这个例子,数据是有空值,我们会有一个KNNImputer节点用来填充空值, 之后继续流向下一个kNN分类节点,最后输出模型。

results = list()strategies = [str(i) for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 18, 20, 21]]for s in strategies: # create the modeling pipeline pipe = Pipeline(steps=[('imputer', KNNImputer(n_neighbors=int(s))), ('model', KNeighborsClassifier())]) # 数据多次随机划分取平均得分 scores = [] for k in range(20): # 得到训练集合和验证集合, 8: 2 X_train, X_test, y_train, y_test = train_test_split(Xtrans, y, test_size=0.2) pipe.fit(X_train, y_train) # 验证model score = pipe.score(X_test, y_test) scores.append(score) # 保存results results.append(np.array(scores)) print('>k: %s, Acc Mean: %.3f, Std: %.3f' % (s, np.mean(scores), np.std(scores)))# print(results)# plot model performance for comparisonplt.boxplot(results, labels=strategies, showmeans=True)plt.show()


Step 6: 结果分析
我们的实验是每个k值下,随机切分20次数据, 从上述的图片中, 根据k值的增加,我们的测试准确率会有先上升再下降再上升的过程。 [3, 5]之间是一个很好的取值,上文我们提到,k很小的时候会发生过拟合,k很大时候会发生欠拟合,当遇到第一下降节点,此时我们可以 简单认为不在发生过拟合,取当前的k值即可。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。