机器学习有监督学习sklearn实战二:六种算法对鸢尾花(Iris)数据集进行分类和特征可视化

article/2025/8/4 12:47:11

本项目代码在个人github链接:https://github.com/KLWU07/Machine-learning-Project-practice

  六种分类算法分别为逻辑回归LR、线性判别分析LDA、K近邻KNN、决策树CART、朴素贝叶斯NB、支持向量机SVM。

一、项目代码描述

1.数据准备和分析可视化

  加载鸢尾花数据集,并指定列名。数据集包含4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和1个类别标签。数据维度: 行 150,列 5。
  (1)统计描述:样本数量分布、可视化。

sepal-lengthsepal-widthpetal-lengthpetal-width
count150.000000150.000000150.000000150.000000
mean5.8433333.0540003.7586671.198667
std0.8280660.4335941.7644200.763161
min4.3000002.0000001.0000000.100000
25%5.1000002.8000001.6000000.300000
50%5.8000003.0000004.3500001.300000
75%6.4000003.3000005.1000001.800000
max7.9000004.4000006.9000002.500000

  (2)箱线图:展示各特征的分布和离群值。
在这里插入图片描述
  (3)直方图:展示各特征的分布情况。
在这里插入图片描述

  (4)散点矩阵图:展示特征间两两关系。
在这里插入图片描述

2.数据预处理和模型比较

  (1)数据预处理
  这里清理数据后,不用处理缺失值和异常值检测。接下来特征和目标变量选择X、Y;数据集划分训练集、测试集;数据标准化;固定随机种子确保结果可重复。
  (2)算法比较
  初始化6种分类算法:逻辑回归、线性判别分析、K近邻、决策树、朴素贝叶斯、支持向量机。
使用10折交叉验证评估每个算法(这里对比了选用5折和8折结果没10折好);
打印各算法的平均准确率和标准差、箱线图比较各算法性能、包含训练时间记录和特征重要性分析。

在这里插入图片描述

模型训练及交叉验证结果:
LR: 准确率 0.9667 (±0.0167) | 训练时间: 0.0640s
LDA: 准确率 0.9750 (±0.0204) | 训练时间: 0.0399s
KNN: 准确率 0.9750 (±0.0204) | 训练时间: 0.0239s
CART: 准确率 0.9750 (±0.0204) | 训练时间: 0.0190s
NB: 准确率 0.9750 (±0.0204) | 训练时间: 0.0190s
SVM: 准确率 0.9750 (±0.0204) | 训练时间: 0.0408s

3.模型评估

  在验证集上预测输出准确率、混淆矩阵、分类报告(精确率、召回率、F1值等)。最佳模型 线性判别分析LDA
(1)混淆矩阵:行表示真实类别(Actual Class),列表示预测类别(Predicted Class)。
(2)分类报告:
  Precision (精确率):模型预测为该类的样本中,真实是该类的比例。
  Recall (召回率)真实是该类的样本中,被模型正确找出的比例。
  F1-Score:精确率和召回率的调和平均数,综合衡量模型性能。

测试集性能:
LR 准确率: 0.8667   ############################################ 1LR 模型详细评估:
混淆矩阵:[[ 7  0  0][ 0 10  2][ 0  2  9]]
分类报告:precision    recall  f1-score   supportIris-setosa       1.00      1.00      1.00         7
Iris-versicolor       0.83      0.83      0.83        12Iris-virginica       0.82      0.82      0.82        11accuracy                           0.87        30macro avg       0.88      0.88      0.88        30weighted avg       0.87      0.87      0.87        30LDA 准确率: 0.9667   ############################################ 2LDA 模型详细评估:
混淆矩阵:[[ 7  0  0][ 0 11  1][ 0  0 11]]
分类报告:precision    recall  f1-score   supportIris-setosa       1.00      1.00      1.00         7
Iris-versicolor       1.00      0.92      0.96        12Iris-virginica       0.92      1.00      0.96        11accuracy                           0.97        30macro avg       0.97      0.97      0.97        30weighted avg       0.97      0.97      0.97        30KNN 准确率: 0.8667   ############################################ 3
CART 准确率: 0.9000   ############################################ 4
NB 准确率: 0.8333   ############################################ 5
SVM 准确率: 0.8667   ############################################ 6SVM 模型详细评估:
混淆矩阵:[[ 7  0  0][ 0 10  2][ 0  2  9]]
分类报告:precision    recall  f1-score   supportIris-setosa       1.00      1.00      1.00         7
Iris-versicolor       0.83      0.83      0.83        12Iris-virginica       0.82      0.82      0.82        11accuracy                           0.87        30macro avg       0.88      0.88      0.88        30weighted avg       0.87      0.87      0.87        30

4.两种特征重要性分析

(1)决策树的Gini重要性

(2)LDA的系数绝对值
在这里插入图片描述
最好模型
在这里插入图片描述

二、完整代码(每行注释)

# 导入必要的库
import numpy as np  # 数值计算库
import matplotlib.pyplot as plt  # 绘图库
from pandas import read_csv  # 数据读取
from pandas.plotting import scatter_matrix  # 散点矩阵图
from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold  # 数据分割和交叉验证
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score  # 评估指标
from sklearn.linear_model import LogisticRegression  # 逻辑回归
from sklearn.tree import DecisionTreeClassifier  # 决策树
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis  # 线性判别分析
from sklearn.neighbors import KNeighborsClassifier  # K近邻
from sklearn.naive_bayes import GaussianNB  # 高斯朴素贝叶斯
from sklearn.svm import SVC  # 支持向量机
from sklearn.preprocessing import StandardScaler  # 数据标准化
from sklearn.inspection import permutation_importance  # 特征重要性评估
from time import time  # 计时功能
from matplotlib import rcParams  # matplotlib配置# 设置中文字体和负号显示
rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']  # 使用黑体和微软雅黑
rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 数据加载部分
filename = 'iris.data.csv'  # 数据集文件名
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']  # 定义列名
dataset = read_csv(filename, names=names)  # 读取CSV文件# 数据探索
print('数据维度: 行 %s,列 %s' % dataset.shape)  # 打印数据形状
print(dataset.head(10))  # 查看前10行数据
print(dataset.describe())  # 统计描述信息
print(dataset.groupby('class').size())  # 查看类别分布# 数据可视化
# 箱线图:展示数据分布和离群值
dataset.plot(kind='box', subplots=True, layout=(2, 2), sharex=False, sharey=False)
plt.suptitle('各特征箱线图')  # 设置主标题
plt.show()# 直方图:展示数据分布
dataset.hist()
plt.suptitle('各特征分布直方图')
plt.show()# 散点矩阵图:展示特征间关系
scatter_matrix(dataset)
plt.suptitle('特征间散点矩阵图')
plt.show()# 数据预处理
array = dataset.values  # 转换为numpy数组
X = array[:, 0:4]  # 特征矩阵(前4列)
Y = array[:, 4]  # 目标变量(第5列)
validation_size = 0.2  # 测试集比例
seed = 7  # 随机种子# 分割训练集和测试集(80%训练,20%测试)
X_train, X_validation, Y_train, Y_validation = train_test_split(X, Y, test_size=validation_size, random_state=seed)# 数据标准化(Z-score标准化)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)  # 拟合训练集并转换
X_validation = scaler.transform(X_validation)  # 用训练集的参数转换测试集# 模型配置
models = {'LR': LogisticRegression(max_iter=1000, multi_class='multinomial', solver='lbfgs', random_state=seed),'LDA': LinearDiscriminantAnalysis(),  # 线性判别分析'KNN': KNeighborsClassifier(),  # K近邻'CART': DecisionTreeClassifier(random_state=seed),  # 决策树'NB': GaussianNB(),  # 朴素贝叶斯'SVM': SVC(C=1.0, kernel='rbf', gamma='scale', probability=True, random_state=seed)  # 支持向量机
}# 模型训练与评估
print("\n模型训练及交叉验证结果:")
results = []  # 存储各模型结果
for key in models:start = time()  # 开始计时# 10折分层交叉验证(保持类别比例)kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)cv_results = cross_val_score(models[key], X_train, Y_train, cv=kfold, scoring='accuracy')# 训练模型models[key].fit(X_train, Y_train)train_time = time() - start  # 计算训练时间results.append(cv_results)  # 保存交叉验证结果# 打印模型性能print(f'{key}: 准确率 {cv_results.mean():.4f}{cv_results.std():.4f}) | 训练时间: {train_time:.4f}s')# 算法比较箱线图
plt.figure(figsize=(10, 6))
plt.boxplot(results, labels=models.keys())  # 绘制箱线图
plt.title('算法性能比较 (10折交叉验证)')
plt.ylabel('准确率')
plt.grid(True, linestyle='--', alpha=0.7)  # 添加网格线
plt.show()# 测试集评估
print("\n测试集性能:")
best_model = None  # 记录最佳模型
best_acc = 0  # 记录最高准确率
for name, model in models.items():y_pred = model.predict(X_validation)  # 预测测试集acc = accuracy_score(Y_validation, y_pred)  # 计算准确率print(f"{name} 准确率: {acc:.4f}")# 更新最佳模型if acc > best_acc:best_acc = accbest_model = name# 打印最佳模型或SVM的详细评估if name == best_model or name == 'SVM':print(f"\n{name} 模型详细评估:")print("混淆矩阵:\n", confusion_matrix(Y_validation, y_pred))  # 混淆矩阵print("分类报告:\n", classification_report(Y_validation, y_pred))  # 分类报告# 特征重要性分析
plt.figure(figsize=(12, 5))# 决策树特征重要性
plt.subplot(1, 2, 1)
importances = models['CART'].feature_importances_  # 获取重要性分数
indices = np.argsort(importances)[::-1]  # 按重要性排序
plt.bar(range(X.shape[1]), importances[indices], color='#1f77b4')  # 绘制条形图
plt.xticks(range(X.shape[1]), np.array(names)[indices], rotation=45)  # 设置x轴标签
plt.title('决策树 (CART) 特征重要性')
plt.ylabel('Gini Importance')  # Gini重要性# LDA特征系数
plt.subplot(1, 2, 2)
coef = np.mean(np.abs(models['LDA'].coef_), axis=0)  # 取系数绝对值平均
indices = np.argsort(coef)[::-1]  # 排序
plt.bar(range(X.shape[1]), coef[indices], color='#ff7f0e')
plt.xticks(range(X.shape[1]), np.array(names)[indices], rotation=45)
plt.title('LDA 特征系数绝对值')
plt.ylabel('系数绝对值')plt.tight_layout()  # 自动调整子图间距
plt.show()# Permutation Importance(排列重要性)
print(f"\n最佳模型 '{best_model}' 的Permutation Importance:")
# 计算特征重要性(通过打乱特征值观察准确率变化)
result = permutation_importance(models[best_model], X_validation, Y_validation,n_repeats=10, random_state=seed)
sorted_idx = result.importances_mean.argsort()[::-1]  # 按重要性排序# 绘制重要性箱线图
plt.figure(figsize=(10, 5))
plt.boxplot(result.importances[sorted_idx].T,vert=False, labels=np.array(names)[sorted_idx])
plt.title(f"{best_model} Permutation Importance (测试集)")
plt.xlabel('重要性分数')
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()

http://www.hkcw.cn/article/FUZlhCcuBy.shtml

相关文章

Vim 支持多种编程语言编辑器

软件简介 Vim是Vi编辑器的增强版,它提供了更多的功能和快捷键。Vim是一款自由软件,它是由Bram Moolenaar在1991年创建的。Vim支持多种编程语言,包括C、C、Java、Python、Perl等等。它是一款轻量级的编辑器,可以快速打开和编辑大型…

CppCon 2014 学习:Unicode in C++

在 Unicode 出现之前,计算机使用各种 单字节编码(Single-Byte Encodings) 来表示文本。理解这些编码对于学习字符集的演变过程很有帮助,以下是关键点的解释: 什么是单字节编码(Single-Byte Encoding&#…

【计算机网络】第3章:传输层—面向连接的传输:TCP

目录 一、PPT 二、总结 TCP(传输控制协议)详解 1. 概述 核心特性: 2. TCP报文段结构 关键字段说明: 3. TCP连接管理 3.1 三次握手(建立连接) 3.2 四次挥手(终止连接) 4. 可…

python打卡 DAY 18 推断聚类后簇的类型

目录 聚类结果分析与簇类型推断学习笔记 一、聚类后分析基础流程 1.1 基本分析步骤 1.2 常用可视化工具 二、簇特征分析方法 2.1 数值型特征分析 簇中心对比 雷达图展示 2.2 类别型特征分析 频数统计 卡方检验 三、簇类型推断技术 3.1 基于统计特征的推断 关键指标…

【RocketMQ 生产者和消费者】- 生产者发送同步、异步、单向消息源码分析(2)

文章目录 1. 前言2. InvokeCallback#operationComplete3. onExceptionImpl 异常处理4. 定时任务扫描 responseTable5. 小结 本文章基于 RocketMQ 4.9.3 1. 前言 【RocketMQ】- 源码系列目录【RocketMQ 生产者消费者】- 同步、异步、单向发送消费消息【RocketMQ 生产者和消费者…

【大模型DA】Unified Language-driven Zero-shot Domain Adaptation

Motivation 本文动机在于解决现有方法对 domain-ID 和多模型的依赖问题,提出一个更实用、更通用的新设定 ULDA,使模型仅通过语言描述就能在不访问目标图像的前提下一次性适应多个未知目标域 这篇文章的方法部分提出了一个统一框架来解决Unified Language…

Tomcat 线程模型详解性能调优

1. Tomcat I/O模型详解**(了解)** 1.1 Linux I/O模型详解 I/O要解决什么问题 I/O:在计算机内存与外部设备之间拷贝数据的过程。 程序通过CPU向外部设备发出读指令,数据从外部设备拷贝至内存需要一段时间,这段时间CPU就…

Mem0: Building Production-Ready AI Agents with Scalable Long-Term Memory

文章目录 摘要Abstract1. 引言2. Mem03. graph-based Mem0参考总结 摘要 Mem0是一种针对AI智能体的长时记忆架构,旨在解决大型语言模型固定上下文窗口导致的跨会话连贯性问题。其基础版本采用两阶段处理范式:提取阶段通过结合对话摘要、近期消息序列和新…

C++构造函数详解:从基础到高级

文章目录 1. 摘要2. 默认构造函数3. 无参构造函数4. 带参构造函数5. 拷贝构造函数6. 移动构造函数 (C11)7. 委托构造函数 (C11)8. 转换构造函数9. 默认拷贝构造函数10. 总结 1. 摘要 构造函数是C类的重要组成部分,负责对象的初始化工作。本文将详细讲解8种构造函数…

day16 leetcode-hot100-32(链表11)

138. 随机链表的复制 - 力扣(LeetCode) 1.哈希表 思路 第一次遍历创建新节点并将原节点与新节点同时放入哈希表中 第二次遍历为新节点加入next与random 具体代码 /* // Definition for a Node. class Node {int val;Node next;Node random;public N…

52. N-Queens II

题目描述 52. N-Queens II 回溯法 这道题与第51题是一样的。51. N-Queens-CSDN博客 class Solution {int columns; //从低位到高位起算,第i位为0表示棋盘第i列可以放置皇后,第i位为1表示棋盘第i列不能放置皇后//边长为n的棋盘分别有2n-1条正斜线和反…

关于adb devices无法找到设备:error: device not found 的解决办法

一、此类问题出现的原因,一般是设备所使用的端口被占用,需要找到被占用的端口。 二、操作步骤 1、打开命令窗口。 2、输入adb shell 会发现提示error:device not found! 3、输入adb kill-server ,然后启动adb start-server 4、输入 net…

关于不同平台微信多开的解决方案(WIN/MAC/IOS/Andriod)

日常生活跟工作中需要用到多开微信,本次分享下在不同平台上解决微信多开的方法。这些方法我都用了超过1年以上,都比较稳定。中间遇到的一些问题我也有说明,包括每个方法的优缺点,每个平台的操作等。 先说下我自己体验下来的结论&a…

Flutter项目兼容鸿蒙Next系统

一、环境搭建: 1.1 下载鸿蒙DevEco Studio开发工具。 下载地址:下载中心 | 华为开发者联盟-HarmonyOS开发者官网,共建鸿蒙生态 下载之前需要先登录,后面的模拟器创建还要开发者验证、审核啥的,好在审核进度还可以&am…

无需密码强制移除Apple ID 工具! iOS 11.3以下可用 ipad和iphone通用!还不快快收藏起来

无需密码强制移除Apple ID 工具! iOS 11.3以下可用 ipad和iphone通用!还不快快收藏起来 ✅ 支持的设备范围注意事项使用方法如何下载? 很多朋友在不再使用某个Apple 帐户或是转卖旧的iPhone,为了防止 ID 被盗导致个人信息泄露&…

Mac 散热救星:Macs Fan Control,让你的苹果电脑“冷静”又安静!

各位果粉们,是不是经常遇到这样的烦恼:用着用着电脑,突然就发热卡顿,风扇狂转噪音大得跟拖拉机似的?别担心,今天给大家安利一款超实用的软件 —— Macs Fan Control,它可是让苹果电脑“冷静”又…

mac 安装idea,碰到“已损坏,无法打开,您应该推出磁盘映像”的解决办法

1.打开终端,先输入如下命令,之后回车操作,碰到输入密码时,正常输入密码即可 sudo spctl --master-disable 2.打开系统设置-安全与隐私性-找到‘允许以下来源的应用程序’ ,更改为任何来源,碰到输入密码时&…

k8s 四种Service类型(ClusterIP、NodePort、LoadBalancer、ExternalName)详解

🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、k8s概述 2、Service在Kubernetes中的作用 二、ClusterIP类型 1、ClusterIP 类型的特点和用途 2、ClusterIP 的工作机制 3、…

Android studio 模拟器运行时弹窗显示The emulator process for AVD 模拟器的名字 has terminated 的解决方法

Android studio 问题解决方案 一:.运行模拟器报错展示二.解决步骤第一步:找到.android的文件夹第二步:剪切该文件到SDK的下载路径第三步:点开该文件第四步:找到配置文件第五步:编辑配置文件 三:设置环境变量…

Android Studio快速配置国内镜像源和HTTP代理

最近开始学习Android Studio开发,发现老是连接超时,下面配置下国内镜像源和HTTP代理,而且通过尝试发现最快下载速度方法 一.配置 SDK 镜像源 打开 Android Studio。 进入 File > Settings 然后点击 System Settings,点击 Android SDK。 …