使用Python实现基于KNN算法的鸢尾花分类

03-13 7阅读

机器学习是人工智能的一个重要分支,它旨在让计算机系统能够通过数据进行自我学习并作出预测或决策。在众多的机器学习算法中,K近邻(K-Nearest Neighbors, KNN)算法是一种简单而有效的监督学习方法。本文将详细介绍如何使用Python中的scikit-learn库来实现一个基于KNN算法的鸢尾花分类模型,并对整个过程进行详细的解释。

数据集介绍

鸢尾花数据集(Iris dataset)是一个经典的数据集,由Ronald Fisher于1936年收集整理。该数据集包含150个样本,分为三个类别:Setosa、Versicolor和Virginica。每个样本有四个特征:萼片长度(Sepal Length)、萼片宽度(Sepal Width)、花瓣长度(Petal Length)和花瓣宽度(Petal Width)。我们将使用这个数据集来训练和评估我们的KNN分类器。

环境搭建

在开始编写代码之前,确保已经安装了以下Python库:

numpy:用于数值计算。pandas:用于数据处理和分析。matplotlib:用于绘图和可视化。scikit-learn:用于机器学习算法的实现。

可以通过以下命令安装这些库:

pip install numpy pandas matplotlib scikit-learn

加载数据集

Scikit-learn自带了鸢尾花数据集,我们可以直接从库中加载:

from sklearn.datasets import load_irisimport pandas as pd# 加载鸢尾花数据集iris = load_iris()data = pd.DataFrame(data=iris.data, columns=iris.feature_names)data['target'] = iris.target# 查看前几行数据print(data.head())

输出结果如下:

   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  target0               5.1              3.5               1.4              0.2       01               4.9              3.0               1.4              0.2       02               4.7              3.2               1.3              0.2       03               4.6              3.1               1.5              0.2       04               5.0              3.6               1.4              0.2       0

可以看到,数据集中包含了五个列:四个特征列和一个目标列(target),其中target列的值为0、1、2,分别对应三种不同的鸢尾花种类。

数据预处理

在构建模型之前,我们需要对数据进行一些预处理。首先,我们将数据集分为训练集和测试集,以便后续评估模型的性能。通常情况下,我们会将80%的数据用于训练,20%的数据用于测试。

from sklearn.model_selection import train_test_split# 将特征和标签分开X = data.drop('target', axis=1)y = data['target']# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)print(f"训练集大小: {X_train.shape[0]}")print(f"测试集大小: {X_test.shape[0]}")

输出结果如下:

训练集大小: 120测试集大小: 30

接下来,我们还可以对数据进行标准化处理,使得各个特征具有相同的尺度,从而提高模型的训练效果。这里我们使用StandardScaler来进行标准化:

from sklearn.preprocessing import StandardScaler# 创建标准化对象scaler = StandardScaler()# 对训练集进行标准化X_train_scaled = scaler.fit_transform(X_train)# 对测试集进行标准化X_test_scaled = scaler.transform(X_test)

构建KNN模型

KNN算法的核心思想是:对于一个新的样本点,找到训练集中与它最近的K个邻居,并根据这K个邻居的类别来决定新样本的类别。在scikit-learn中,我们可以很方便地使用KNeighborsClassifier类来实现KNN分类器。

from sklearn.neighbors import KNeighborsClassifier# 创建KNN分类器,设置K值为3knn = KNeighborsClassifier(n_neighbors=3)# 训练模型knn.fit(X_train_scaled, y_train)# 在测试集上进行预测y_pred = knn.predict(X_test_scaled)print("预测结果:", y_pred)

模型评估

为了评估模型的性能,我们可以使用准确率(accuracy)作为评价指标。准确率是指预测正确的样本数占总样本数的比例。此外,我们还可以生成混淆矩阵(confusion matrix)来更直观地查看模型的分类效果。

from sklearn.metrics import accuracy_score, confusion_matrix, classification_report# 计算准确率accuracy = accuracy_score(y_test, y_pred)print(f"准确率: {accuracy:.4f}")# 打印混淆矩阵conf_matrix = confusion_matrix(y_test, y_pred)print("混淆矩阵:")print(conf_matrix)# 打印分类报告class_report = classification_report(y_test, y_pred, target_names=iris.target_names)print("分类报告:")print(class_report)

假设输出结果如下:

准确率: 0.9667混淆矩阵:[[10  0  0] [ 0  9  1] [ 0  0 10]]分类报告:              precision    recall  f1-score   support     setosa       1.00      1.00      1.00        10 versicolor       0.90      0.90      0.90         9  virginica       1.00      1.00      1.00        10    accuracy                           0.97        30   macro avg       0.97      0.97      0.97        30weighted avg       0.97      0.97      0.97        30

从上面的结果可以看出,我们的KNN模型在测试集上的准确率达到了96.67%,并且对于每个类别的分类效果也较好。

可视化分析

为了更好地理解模型的工作原理,我们可以绘制出部分样本点及其对应的K个最近邻居。这里我们以两个特征为例,即“花瓣长度”和“花瓣宽度”,并在二维平面上展示它们之间的关系。

import matplotlib.pyplot as pltimport numpy as np# 获取训练集中的花瓣长度和花瓣宽度X_train_petal = X_train[['petal length (cm)', 'petal width (cm)']].values# 随机选择一个测试样本test_sample_index = 5test_sample = X_test_scaled[test_sample_index]# 计算所有训练样本到该测试样本的距离distances = np.linalg.norm(X_train_scaled - test_sample, axis=1)# 找到距离最近的K个邻居k_neighbors_indices = distances.argsort()[:3]k_neighbors = X_train_petal[k_neighbors_indices]# 绘制散点图plt.figure(figsize=(8, 6))plt.scatter(X_train_petal[:, 0], X_train_petal[:, 1], c=y_train, cmap='viridis', label='训练集')plt.scatter(test_sample[2], test_sample[3], color='red', marker='x', s=100, label='测试样本')plt.scatter(k_neighbors[:, 0], k_neighbors[:, 1], color='orange', marker='s', s=100, label='K个邻居')plt.xlabel('花瓣长度 (cm)')plt.ylabel('花瓣宽度 (cm)')plt.legend()plt.title('KNN分类示意图')plt.show()

通过上述步骤,我们成功地实现了一个基于KNN算法的鸢尾花分类模型。在整个过程中,我们不仅了解了如何使用Python和scikit-learn库来处理数据、构建模型和评估模型性能,还掌握了如何通过可视化手段来增强对模型的理解。当然,在实际应用中,还需要根据具体问题的特点进一步优化模型参数、调整特征选择等,以获得更好的分类效果。

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第17053名访客 今日有24篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!