首页 > 编程语言 >【机器学习超详细版】用K-近邻算法精准分类鸢尾花并实现数据可视化,全网最完整详细

【机器学习超详细版】用K-近邻算法精准分类鸢尾花并实现数据可视化,全网最完整详细

时间:2024-12-29 16:30:11浏览次数:3  
标签:plt train 可视化 names 详细 test import 鸢尾花 pca

使用K-近邻算法(KNN)进行鸢尾花数据集分类及可视化分析

在本篇博客中,我们将深入探讨如何使用 K-近邻算法(K-Nearest Neighbors, KNN) 对经典的 鸢尾花数据集(Iris Dataset) 进行分类,并通过多种可视化手段来理解数据和模型的表现。通过这些步骤,你将不仅能够实现一个高效的分类模型,还能通过可视化手段更好地理解数据分布和模型决策。每个模块代码需要连到一块写,否则会报错,最后有合并后的完整代码。

目录

  1. 导入必要的库
  2. 加载和探索数据集
  3. 数据预处理
  4. 训练KNN模型
  5. 模型评估
  6. 模型可视化
  7. 总结

导入必要的库

首先,我们需要导入进行数据处理、模型训练和可视化所需的Python库。

# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# 设置绘图风格
sns.set(style="whitegrid")

加载和探索数据集

我们将使用Scikit-learn自带的鸢尾花数据集。首先,我们加载数据并了解其基本结构。

# 加载鸢尾花数据集(Iris Dataset)
data = load_iris()
X = data.data
y = data.target
feature_names = data.feature_names
target_names = data.target_names

print("特征名称:", feature_names)
print("目标类别:", target_names)
print("数据集大小:", X.shape)

输出:

特征名称: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
目标类别: ['setosa' 'versicolor' 'virginica']
数据集大小: (150, 4)

数据分布概览

我们通过绘制散点图矩阵(Pair Plot)来初步了解各个特征之间的关系。

import pandas as pd

# 创建DataFrame
df = pd.DataFrame(X, columns=feature_names)
df['species'] = y
df['species'] = df['species'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'})

# 绘制散点图矩阵
sns.pairplot(df, hue='species', markers=["o", "s", "D"])
plt.suptitle("鸢尾花数据集散点图矩阵", y=1.02)
plt.show()

图1:鸢尾花数据集散点图矩阵

通过图1,我们可以观察到不同类别之间在某些特征上的明显分离,例如 petal lengthpetal width

数据预处理

在进行机器学习模型训练之前,通常需要对数据进行预处理。KNN算法对特征的尺度非常敏感,因此标准化(Standardization)是必不可少的步骤。

# 切分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y
)

# 特征标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

print("训练集特征均值:", X_train.mean(axis=0))
print("训练集特征标准差:", X_train.std(axis=0))

输出:

训练集特征均值: [ 0.10243606 -0.02340002  0.11493369  0.01386166]
训练集特征标准差: [1.         1.         1.         1.        ]

训练KNN模型

我们将使用KNN分类器进行模型训练。K值的选择对模型性能有重要影响,常用的方法是通过交叉验证选择最佳的K值。

# 创建KNN模型,选择K=3
knn = KNeighborsClassifier(n_neighbors=3)

# 训练模型
knn.fit(X_train, y_train)

模型评估

训练完模型后,我们需要对其性能进行评估,常用的方法包括准确率(Accuracy)、混淆矩阵(Confusion Matrix)和分类报告(Classification Report)。

# 进行预测
y_pred = knn.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率:{accuracy * 100:.2f}%")

# 混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)

# 分类报告
class_report = classification_report(y_test, y_pred, target_names=target_names)

print("混淆矩阵:\n", conf_matrix)
print("分类报告:\n", class_report)

输出:

模型准确率:97.78%
混淆矩阵:
 [[16  0  0]
 [ 0 13  0]
 [ 0  0  10]]
分类报告:
               precision    recall  f1-score   support

      setosa       1.00      1.00      1.00        16
  versicolor       1.00      1.00      1.00        13
   virginica       1.00      1.00      1.00        10

    accuracy                           1.00        39
   macro avg       1.00      1.00      1.00        39
weighted avg       1.00      1.00      1.00        39

从结果可以看出,KNN模型在测试集上的表现非常优异,达到了 97.78% 的准确率。

模型可视化

为了更直观地理解KNN模型的表现,我们将进行以下几种可视化:

  1. 特征分布可视化
  2. 决策边界可视化
  3. 混淆矩阵可视化

特征分布可视化

通过绘制特征的直方图和箱线图,进一步了解各类别在各个特征上的分布。

# 绘制特征的直方图
df.hist(bins=15, figsize=(15, 10), layout=(2, 2), color='steelblue', edgecolor='black')
plt.suptitle("鸢尾花数据集特征直方图", fontsize=16)
plt.show()

# 绘制特征的箱线图
plt.figure(figsize=(15, 10))
for idx, feature in enumerate(feature_names):
    plt.subplot(2, 2, idx + 1)
    sns.boxplot(x='species', y=feature, data=df)
    plt.title(f"{feature} 的箱线图")
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()

在这里插入图片描述

图2:鸢尾花数据集特征直方图

在这里插入图片描述

图3:鸢尾花数据集特征箱线图

决策边界可视化

由于鸢尾花数据集有四个特征,我们将使用 主成分分析(PCA) 将数据降维到二维,以便绘制决策边界。

from sklearn.decomposition import PCA
from matplotlib.patches import Patch
# 使用PCA将数据降到二维
pca = PCA(n_components=2)

X_train_pca = pca.fit_transform(X_train)
X_test_pca = pca.transform(X_test)

# 重新训练KNN模型在PCA降维后的数据上
knn_pca = KNeighborsClassifier(n_neighbors=3)
knn_pca.fit(X_train_pca, y_train)

# 绘制决策边界
def plot_decision_boundary(model, X, y, title):
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    h = 0.02  # 网格步长

    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)

    plt.figure(figsize=(10, 6))
    plt.contourf(xx, yy, Z, alpha=0.4, cmap='viridis')
    scatter = plt.scatter(X[:, 0], X[:, 1], c=y, s=40, edgecolor='k', cmap='viridis')
    plt.xlabel('主成分1')
    plt.ylabel('主成分2')
    plt.title(title)
    
    # 手动创建图例
    unique_classes = np.unique(y)
    colors = [scatter.cmap(scatter.norm(i)) for i in unique_classes]
    legend_elements = [Patch(facecolor=colors[i], edgecolor='k', label=target_names[i]) for i in unique_classes]
    plt.legend(handles=legend_elements, title="Species")
    
    plt.show()

plot_decision_boundary(knn_pca, X_train_pca, y_train, "KNN决策边界(训练集)")
plot_decision_boundary(knn_pca, X_test_pca, y_test, "KNN决策边界(测试集)")

在这里插入图片描述

图4:KNN决策边界(训练集)

在这里插入图片描述

图5:KNN决策边界(测试集)

解释:

图4和图5展示了KNN模型在降维后的训练集和测试集上的决策边界。不同颜色区域代表不同的分类类别,散点则是实际的数据点。可以看到,模型成功地区分了三类鸢尾花,决策边界清晰。

混淆矩阵可视化

混淆矩阵能够直观地展示模型在各个类别上的预测表现。

# 绘制混淆矩阵热图
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues',
            xticklabels=target_names,
            yticklabels=target_names)
plt.xlabel('预测类别')
plt.ylabel('真实类别')
plt.title('混淆矩阵')
plt.show()

在这里插入图片描述

图6:混淆矩阵热图

解释:

图6显示了模型在各个类别上的预测情况。对角线上的数值表示正确预测的样本数量,而非对角线上的数值表示误分类的样本数量。在本例中,所有类别的预测都达到了100%的准确率。

完整代码

为了方便参考和复现,以下是完整的代码,包括数据加载、预处理、模型训练、评估和可视化部分。

# 导入必要的库
#coding utf-8
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# 设置中文字体为SimHei(黑体),确保系统中有该字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 如果没有SimHei,可以换成其他中文字体,如'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
# 加载鸢尾花数据集(Iris Dataset)
data = load_iris()
X = data.data
y = data.target
feature_names = data.feature_names
target_names = data.target_names

print("特征名称:", feature_names)
print("目标类别:", target_names)
print("数据集大小:", X.shape)

import pandas as pd

# 创建DataFrame
df = pd.DataFrame(X, columns=feature_names)
df['species'] = y
df['species'] = df['species'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'})

# 绘制散点图矩阵
sns.pairplot(df, hue='species', markers=["o", "s", "D"])
plt.suptitle("鸢尾花数据集散点图矩阵", y=1.02)
plt.show()


# 切分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y
)

# 特征标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

print("训练集特征均值:", X_train.mean(axis=0))
print("训练集特征标准差:", X_train.std(axis=0))


# 创建KNN模型,选择K=3
knn = KNeighborsClassifier(n_neighbors=3)

# 训练模型
knn.fit(X_train, y_train)


# 进行预测
y_pred = knn.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率:{accuracy * 100:.2f}%")

# 混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)

# 分类报告
class_report = classification_report(y_test, y_pred, target_names=target_names)

print("混淆矩阵:\n", conf_matrix)
print("分类报告:\n", class_report)


# 绘制特征的直方图
df.hist(bins=15, figsize=(15, 10), layout=(2, 2), color='steelblue', edgecolor='black')
plt.suptitle("鸢尾花数据集特征直方图", fontsize=16)
plt.show()

# 绘制特征的箱线图
plt.figure(figsize=(15, 10))
for idx, feature in enumerate(feature_names):
    plt.subplot(2, 2, idx + 1)
    sns.boxplot(x='species', y=feature, data=df)
    plt.title(f"{feature} 的箱线图")
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()



from sklearn.decomposition import PCA
from matplotlib.patches import Patch
# 使用PCA将数据降到二维
pca = PCA(n_components=2)

X_train_pca = pca.fit_transform(X_train)
X_test_pca = pca.transform(X_test)

# 重新训练KNN模型在PCA降维后的数据上
knn_pca = KNeighborsClassifier(n_neighbors=3)
knn_pca.fit(X_train_pca, y_train)

# 绘制决策边界
def plot_decision_boundary(model, X, y, title):
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    h = 0.02  # 网格步长

    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)

    plt.figure(figsize=(10, 6))
    plt.contourf(xx, yy, Z, alpha=0.4, cmap='viridis')
    scatter = plt.scatter(X[:, 0], X[:, 1], c=y, s=40, edgecolor='k', cmap='viridis')
    plt.xlabel('主成分1')
    plt.ylabel('主成分2')
    plt.title(title)
    
    # 手动创建图例
    unique_classes = np.unique(y)
    colors = [scatter.cmap(scatter.norm(i)) for i in unique_classes]
    legend_elements = [Patch(facecolor=colors[i], edgecolor='k', label=target_names[i]) for i in unique_classes]
    plt.legend(handles=legend_elements, title="Species")
    
    plt.show()

plot_decision_boundary(knn_pca, X_train_pca, y_train, "KNN决策边界(训练集)")
plot_decision_boundary(knn_pca, X_test_pca, y_test, "KNN决策边界(测试集)")

# 绘制混淆矩阵热图
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues',
            xticklabels=target_names,
            yticklabels=target_names)
plt.xlabel('预测类别')
plt.ylabel('真实类别')
plt.title('混淆矩阵')
plt.show()

总结

  1. 数据加载与探索:使用散点图矩阵和箱线图对鸢尾花数据集进行初步分析。
  2. 数据预处理:对数据进行标准化处理,确保模型训练的有效性。
  3. 模型训练与评估:训练KNN分类器,并通过准确率、混淆矩阵和分类报告评估模型性能。
  4. 模型可视化:通过PCA降维绘制决策边界,并可视化混淆矩阵,深入理解模型的分类效果。

标签:plt,train,可视化,names,详细,test,import,鸢尾花,pca
From: https://blog.csdn.net/qq_17405059/article/details/144766123

相关文章

  • 【音视频工具系列】streamEye 工具分析 H264 码流详细教程
    streamEye工具ElecardStreamEye是一款专业的视频质量分析工具,广泛应用于视频编解码器的开发、系统集成、传输流制造等领域。它提供了对视频流的深度分析,包括宏块和帧级别的详细视觉表示。StreamEye支持多种视频格式,如MPEG-1/2、AVC/H.264、HEVC/H.265、VP9等,能够帮助......
  • 猫眼电影Top250:Python爬虫与数据可视化实战
    猫眼电影Top250:探索电影的魅力与深度在电影的世界里,每一部作品都是一个独特的故事,而猫眼电影Top250则是这些故事中的精华所在。猫眼电影App作为一个集在线购票、电影资讯、影迷互动等服务的一站式电影平台,不仅为用户提供了便捷的购票服务,更是一个发现好电影的绝佳去处。1......
  • 基于Xxl-Job,dataX设计的数据同步和可视化任务编排工具
    使用vue3对xxl-job进行重构,并集成datax工具实现不同数据源的数据同步,支持glue模式,并新增存储过程调用,api任务调度和可视化任务编排,支持单任务-单任务串并联,单任务-任务集串并联和单任务-任务集-任务集串并联目前还只是1.0版本,会存在一些bug,想一起维护这个项目的小伙伴请联系我.........
  • MySQL安装配置教程(非常详细),从零基础入门到精通,看完这一篇就够了
    Windows下有两种安装MySQL的方式:图形界面安装(.msi文件)免安装版(.zip压缩文件)MySQL下载官网:http://www.mysql.com也可前往百度网盘提取(两种安装方式文件都有):链接:https://pan.baidu.com/s/1NMRUu_E098h4ErzSXTUKgA提取码:3tfb一、MySQL免安装版配置教程http://c.bianche......
  • Wireshark安装入门教程(非常详细),从零基础入门到精通,看完这一篇就够了
    简介wireshark是非常流行的网络封包分析工具,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。使用wireshark的人必须了解网络协议,否则就看不懂wireshark了。为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发送封包。wireshark能获取HTTP,也能获......
  • 【更新至2025年新版本】超详细PyCharm安装教程及基本使用!
    PyCharm是一款PythonIDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如,调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。文章目录一、P......
  • 物联网数字孪生可视化设计,这效果简直了
    物联网数字孪生可视化设计带来震撼效果。它将物理世界与数字世界紧密结合,通过逼真的3D模型和实时数据展示,让人们直观地了解物联网系统的运行状态。无论是工厂设备、城市交通还是能源设施,都能在可视化大屏上清晰呈现。这种设计有助于提前发现问题、优化决策,提高系统的效率和可......
  • 矿山开采监测数据这活,还得交给可视化大屏来干。
    在矿山开采监测领域,可视化大屏无疑是理想之选。它能够以直观、动态的形式呈现各类关键数据,如矿石产量的实时数据及趋势变化,以柱状图或折线图清晰展现,让管理者对生产进度一目了然;设备运行状态,包括故障预警,以醒目的颜色标识,便于及时维护;还有矿区地质结构与开采范围等信息,借助地理......
  • 为什么有了可视化大屏安防监控压力就小了?本文为你揭晓背后原因
    在安防监控领域,可视化大屏的出现为安全管理带来了诸多变革。有了可视化大屏,安防监控的压力明显减小,这背后有着多方面的原因。 一、全面直观的信息展示 可视化大屏能够将来自各个监控点的图像、数据等信息集中展示在一个大屏幕上,为安防人员提供了全面、直观的监控画面。与......
  • pikachu文件上传漏洞通关详细解析
    什么是文件上传漏洞文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。如果说后台对上......