首页 > 分享 > 【机器学习】利用KNN对Iris鸢尾花数据集进行分类

【机器学习】利用KNN对Iris鸢尾花数据集进行分类

环境配置

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)

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

plt.rcParams['font.sans-serif'] = ['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)

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_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算法实现鸢尾花分类
KNN算法实现鸢尾花数据集分类
【机器学习】鸢尾花分类
实验一:鸢尾花数据集分类
Python原生代码实现KNN算法(鸢尾花数据集)
【机器学习】鸢尾花分类:机器学习领域经典入门项目实战
[机器学习基础][笔记] 一、鸢尾花分类
原生python实现knn分类算法(鸢尾花数据集)
利用KNN对150个实例对花卉进行机器培训
利用KNN算法对鸢尾花数据进行分类

网址: 【机器学习】利用KNN对Iris鸢尾花数据集进行分类 https://m.huajiangbk.com/newsview562674.html

所属分类:花卉
上一篇: 利用 VGG(实战) 实现花的分
下一篇: 花园里有很多什么样的鲜花