首页 > 其他分享 >利用KNN对Iris鸢尾花数据集进行分类

利用KNN对Iris鸢尾花数据集进行分类

时间:2024-11-13 17:14:56浏览次数:3  
标签:KNN Iris iris 验证 print train test 鸢尾花 数据

环境配置

Python 3.x

Scikit-learn库、Numpy库、Matplotlib库

Jupyter Notebook或类似IDE(用于代码编写和结果展示)

数据集

使用Scikit-learn自带的Iris数据集。该数据集包含150条记录,每条记录有4个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度),属于3个类别之一(Setosa、Versicolor、Virginica)。这是一个典型的多分类数据集,适合进行KNN分类实验。。

步骤

1. 导入必要的库

导入Numpy、Matplotlib和Scikit-learn中的KNN、数据分割和标准化工具。

2. 加载数据集

使用Scikit-Learn的datasets模块加载Iris数据集。显示数据集的基本信息,如样本数量、特征数量和类别标签。

3. 数据预处理

数据标准化:在KNN中,特征尺度差异会影响距离计算,因此需要对特征数据进行标准化。

使用train_test_split函数将数据集分成训练集和测试集(通常比例为80%训练,20%测试)

4. 构建KNN模型

使用KNN算法创建模型,尝试设置不同的K值(例如K=3, 5, 7)。

将训练数据输入模型,使用训练集数据进行模型训练

5. 选择最佳K值,重新训练模型并评估

绘制出不同K值下模型的准确率,以找到最佳的K值。

根据图表找到的最佳K值,重新训练模型并评估其性能。

鸢尾花数据集介绍

       Iris数据集是常⽤的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是⼀类多重变量分析的数据集。

获取鸢尾花数据集

iris = load_iris()

print("鸢尾花数据集的返回值:\n", iris)

# 返回值是⼀个继承⾃字典的Bench

print("鸢尾花的特征值:\n", iris["data"])

print("鸢尾花的⽬标值:\n", iris.target)

print("鸢尾花特征的名字:\n", iris.feature_names)

print("鸢尾花⽬标值的名字:\n", iris.target_names)

print("鸢尾花的描述:\n", iris.DESCR)

图片1

查看数据分布:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from sklearn.datasets import load_iris

# 加载数据

iris = load_iris()
iris_d = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris_d['Species'] = iris.target

# 设置 matplotlib 使用中文字体

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定字体为 SimHei(黑体)
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号
def plot_iris(iris, col1, col2):
    sns.lmplot(x = col1, y = col2, data = iris, hue = "Species", fit_reg = False)
    plt.xlabel(col1)
    plt.ylabel(col2)
    plt.title('鸢尾花种类分布图')
    plt.show()

plot_iris(iris_d, 'Petal_Width', 'Sepal_Length')

图片2

分类代码参考

以下是一个利用Scikit-learn实现KNN分类的代码示例(以Iris数据集为例):

导入必要的库

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt

图片3

加载划分数据集

测试集占20%

数据集划分api

sklearn.model_selection.train_test_split(arrays, *options)

参数:

x 数据集的特征值

y 数据集的标签值

test_size 测试集的⼤⼩,⼀般为float

random_state 随机数种⼦,不同的种⼦会造成不同的随机采样结果。相同的种⼦采样结果相同。

Return:

x_train, x_test, y_train, y_test

iris=load_iris()
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)

图片4

数据标准化

transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)

图片5

设置不同的K值创建KNN模型

求出每个K值下模型的准确率

k_values = range(5, 31)
accuracies = []


for k in k_values:
    knn = KNeighborsClassifier(n_neighbors=k)
    knn.fit(x_train, y_train)
    y_pred = knn.predict(x_test)
    accuracy = accuracy_score(y_test, y_pred)
    accuracies.append(accuracy)


# 绘制出不同K值下模型的准确率,从而找出最佳K值
plt.plot(k_values, accuracies)
plt.xlabel('Number of Neighbors (K)')
plt.ylabel('Accuracy')
plt.title('KNN Accuracy for different K values')
plt.show()

图片6

根据上面找出的最佳K值,重新训练模型并评估

# 假设最佳K值为k_optimal

k_optimal = k_values[accuracies.index(max(accuracies))]
knn_best = KNeighborsClassifier(n_neighbors=k_optimal)
knn_best.fit(x_train, y_train)
y_pred_best = knn_best.predict(x_test)
accuracy_best = accuracy_score(y_test, y_pred_best)
print("得到的最好的k结果是:",k_optimal)
print("最好k值的准确率为:",accuracy_best)

图片7

交叉验证,⽹格搜索(模型选择与调优)

什么是交叉验证(cross validation)

交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中⼀份作为验证集。然后经过4次

(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。⼜称4折交叉验证。

分析

我们之前知道数据分为训练集和测试集,但是为了让从训练得到模型结果更加准确。做以下处理

训练集:训练集+验证集

测试集:测试集

图片8

为什么需要交叉验证

交叉验证⽬的:为了让被评估的模型更加准确可信

问题:这个只是让被评估的模型更加准确可信,那么怎么选择或者调优参数呢?

什么是⽹格搜索(Grid Search)

通常情况下,有很多参数是需要⼿动指定的(如k-近邻算法中的K值),这种叫超参数。但是⼿动过程繁杂,所以需要

对模型预设⼏种超参数组合。每组超参数都采⽤交叉验证来进⾏评估。最后选出最优参数组合建⽴模型。

交叉验证,⽹格搜索(模型选择与调优)API:

sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)

对估计器的指定参数值进⾏详尽搜索

estimator:估计器对象

param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}

cv:指定⼏折交叉验证

fit:输⼊训练数据

score:准确率

结果分析:

bestscore__:在交叉验证中验证的最好结果

bestestimator:最好的参数模型

cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果

代码参考

使⽤GridSearchCV构建估计器

estimator=KNeighborsClassifier()
param_grid={"n_neighbors":[11,12,13,14]}
estimator=GridSearchCV(estimator,param_grid=param_grid,cv=5)
estimator.fit(x_train,y_train)

图片9

预测值与真实值的对比

y_pre=estimator.predict(x_test)
print("预测值是:\n",y_pre)
print("预测值与真实值的对比是:\n",y_pre==y_test)

图片10

计算准确率:

score=estimator.score(x_test,y_test)
print("准确率为:\n",score)

图片11

得到结果:

该题中最好的模型k=11

print("在交叉验证中,得到的最好结果是:\n",estimator.best_score_)
print("在交叉验证中,得到的最好的模型是:\n",estimator.best_estimator_)
print("在交叉验证中,得到的模型结果是:\n",estimator.cv_results_)

图片12

标签:KNN,Iris,iris,验证,print,train,test,鸢尾花,数据
From: https://blog.csdn.net/fukase_mio/article/details/143747700

相关文章

  • 【每天学点AI】KNN算法:简单有效的机器学习分类器
    想象一下,你正在计划一个周末的户外活动,你可能会问自己几个问题来决定去哪里:"今天天气怎么样?"如果天气晴朗,你可能会选择去公园野餐;如果天气阴沉,你可能会选择去博物馆。这个决策过程,其实就是一个简单的分类问题,而KNN(K-NearestNeighbors)算法正是模仿这种人类决策过程的机器学习算法。......
  • 【保姆级教程】从Yolov8训练模型到转化Onnx再转换为Rknn以及板端部署全记录
    目录一、文件准备二、Yolov8训练自己的数据集1.准备数据集2.处理数据3.环境配置4.下载权重文件5.开始训练三、.PT转换为.ONNX四、.ONNX转换为.RKNN1.虚拟机配置2.rknn转换环境配置安装转换环境RKNN转换五、板端部署1.烧录系统2.环境配置3.进行识别六、踩坑笔记Imp......
  • 香橙派部署RKNN模型出现重复框选和置信度大于1(真解决办法)
    在香橙派部署yolov5模型时,需要转化两次模型,一次在PC端转为onnx文件,一次在UbuntuPC上转为rknn文件,详情请看这篇博客:香橙派Pi5Plus(RK3588)部署yolov5模型(不讲环境搭建,只讲步骤)_rk3588yolov-CSDN博客https://blog.csdn.net/Z0603013xxx/article/details/1427372661.出现置信度......
  • K-近邻算法(KNN)
    """K-近邻算法用于分类和回归问题。比如,判断一款游戏是否受欢迎。KNN算法的基本思想是:如果一个样本在特征空间中的k个最邻近的样本中的大多数属于某个类别,则该样本也属于这个类别。KNN算法的实现方法有两种:1.基于欧氏距离的KNN算法2.基于余弦相似度的KNN算法KNN算法的优点:1.简......
  • 二、KNN算法详解
    KNN算法详解前言一、KNN算法思想二、实现步骤2.1收集数据2.2准备数据2.3选择K值2.4计算距离2.5找到最近的邻居2.6决策三、关键要素(细节)3.1K值的选择3.2距离的计算3.2.1欧氏距离3.2.2曼哈顿距离3.2.3切比雪夫距离3.2.4闵氏距离3.3决策规则四、API介绍4.......
  • KNN算法
    这是内容这是内容###这是内容这是内容###这是内容这是内容###这是内容这是内容###这是内容这是内容###这是内容这是内容###这是内容这是内容###这是内容这是内容###这是内容这是内容###这是内容这是内容###这是内容这是内容###这是内容这是内容###这是内......
  • K近邻算法(KNN)的概述与实现
    K近邻算法(K-NearestNeighbors,简称KNN)是一种简单而有效的机器学习算法,广泛应用于分类和回归问题中。KNN的主要特点是不需要对数据进行显式的模型训练,它是一种基于实例的学习方法。当给定一个未标记的数据点时,KNN算法会寻找其在训练集中最接近的K个邻居,并根据这些邻居的标签来决......
  • 【机器学习(七)】分类和回归任务-K-近邻 (KNN)算法-Sentosa_DSML社区版
    @目录一、算法概念二、算法原理(一)K值选择(二)距离度量1、欧式距离2、曼哈顿距离3、闵可夫斯基距离(三)决策规则1、分类决策规则2、回归决策规则三、算法优缺点优点缺点四、KNN分类任务实现对比(一)数据加载和样本分区1、Python代码2、Sentosa_DSML社区版(二)训练模型1、Python代码2、Sento......
  • K-means 算法、层次聚类、密度聚类对鸢尾花(Iris)数据进行聚类
    目录1.基础知识1.1 K-Means算法1.2 层次聚类(HierarchicalClustering)1.3 密度聚类(DBSCAN)1.4 距离和相似度度量方法1.5总结:2.K-means算法对鸢尾花(Iris)数据进行聚类2.1导入所需的模块2.1.1代码片段:2.1.2实现目的:2.1.3代码解释:2.2加载并标准化鸢尾花数据......
  • 鸢尾花数据-朴素贝叶斯、PCA,高斯混合聚类
    目录1.导入相关模块2.导入数据和画图3.分割数据有监督学习示例:鸢尾花数据分类4.高斯朴素贝叶斯无监督学习示例:鸢尾花数据降维5.PCA数据降维无监督学习示例:鸢尾花数据聚类6.高斯混合模型1.导入相关模块importnumpyasnpimprortpandasaspdimportmatplotlib.pyplotasplt......