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

news2025/6/4 19:05:27

本项目代码在个人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   ############################################ 1

LR 模型详细评估:
混淆矩阵:
 [[ 7  0  0]
 [ 0 10  2]
 [ 0  2  9]]
分类报告:
                  precision    recall  f1-score   support
    Iris-setosa       1.00      1.00      1.00         7
Iris-versicolor       0.83      0.83      0.83        12
 Iris-virginica       0.82      0.82      0.82        11

       accuracy                           0.87        30
      macro avg       0.88      0.88      0.88        30
   weighted avg       0.87      0.87      0.87        30

LDA 准确率: 0.9667   ############################################ 2

LDA 模型详细评估:
混淆矩阵:
 [[ 7  0  0]
 [ 0 11  1]
 [ 0  0 11]]
分类报告:
                  precision    recall  f1-score   support
    Iris-setosa       1.00      1.00      1.00         7
Iris-versicolor       1.00      0.92      0.96        12
 Iris-virginica       0.92      1.00      0.96        11

       accuracy                           0.97        30
      macro avg       0.97      0.97      0.97        30
   weighted avg       0.97      0.97      0.97        30

KNN 准确率: 0.8667   ############################################ 3
CART 准确率: 0.9000   ############################################ 4
NB 准确率: 0.8333   ############################################ 5
SVM 准确率: 0.8667   ############################################ 6

SVM 模型详细评估:
混淆矩阵:
 [[ 7  0  0]
 [ 0 10  2]
 [ 0  2  9]]
分类报告:
                  precision    recall  f1-score   support
    Iris-setosa       1.00      1.00      1.00         7
Iris-versicolor       0.83      0.83      0.83        12
 Iris-virginica       0.82      0.82      0.82        11

       accuracy                           0.87        30
      macro avg       0.88      0.88      0.88        30
   weighted 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 = acc
        best_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.coloradmin.cn/o/2396635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vr中风--数据处理模型搭建与训练2

位置http://localhost:8888/notebooks/Untitled1-Copy1.ipynb # -*- coding: utf-8 -*- """ MUSED-I康复评估系统(增强版) 包含:多通道sEMG数据增强、混合模型架构、标准化处理 """ import numpy as np impor…

鸿蒙next系统以后会取代安卓吗?

点击上方关注 “终端研发部” 设为“星标”,和你一起掌握更多数据库知识 官方可没说过取代谁谁,三足鼎立不好吗?三分天下,并立共存。 鸿蒙基于Linux,有人说套壳;ios/macos基于Unix,说它ios开源了…

PolyGen:一个用于 3D 网格的自回归生成模型 论文阅读

[2002.10880] PolyGen:一个用于 3D 网格的自回归生成模型 --- [2002.10880] PolyGen: An Autoregressive Generative Model of 3D Meshes 图 2:PolyGen 首先生成网格顶点(左侧),然后基于这些顶点生成网格面&#xff0…

系统思考:成长与投资不足

最近认识了一位95后年轻创业者,短短2年时间,他的公司从十几个人发展到几百人,规模迅速扩大。随着团队壮大,用户池也在持续扩大,但令人困惑的是,业绩增长却没有明显提升,甚至人效持续下滑。尽管公…

快手可灵视频V1.6模型API如何接入免费AI开源项目工具

全球领先的视频生成大模型:可灵是首个效果对标 Sora 、面向用户开放的视频生成大模型,目前在国内及国际上均处于领先地位。快手视频生成大模型“可灵”(Kling),是全球首个真正用户可用的视频生成大模型,自面…

数学建模期末速成 最短路径

关键词:Dijkstra算法 Floyd算法 例题 已知有6个村庄,各村的小学生人数如表所列,各村庄间的距离如图所示。现在计划建造一所医院和一所小学,问医院应建在哪个村庄才能使最远村庄的人到医院看病所走的路最短?又问小学建…

Java开发经验——阿里巴巴编码规范实践解析7

摘要 本文主要解析了阿里巴巴 Java 开发中的 SQL 编码规范,涉及 SQL 查询优化、索引建立、字符集选择、分页查询处理、外键与存储过程的使用等多个方面,旨在帮助开发者提高代码质量和数据库操作性能,避免常见错误和性能陷阱。 1. 【强制】业…

权威认证与质量保障:第三方检测在科技成果鉴定测试中的核心作用

科技成果鉴定测试是衡量科研成果技术价值与应用潜力的关键环节,其核心目标在于通过科学验证确保成果的可靠性、创新性和市场适配性。第三方检测机构凭借其独立性、专业性和权威性,成为科技成果鉴定测试的核心支撑主体。本文从测试流程、第三方检测的价值…

Perforce P4产品简介:无限扩展+全球协作+安全管控+工具集成(附下载)

本产品简介由Perforce中国授权合作伙伴——龙智编辑整理,旨在带您快速了解Perforce P4版本控制系统的强大之处。 世界级无限可扩展的版本控制系统 Perforce P4(原Helix Core)是业界领先的版本控制平台,备受19家全球Top20 AAA级游…

网络协议入门:TCP/IP五层模型如何实现全球数据传输?

🔍 开发者资源导航 🔍🏷️ 博客主页: 个人主页📚 专栏订阅: JavaEE全栈专栏 内容: 网络初识什么是网络?关键概念认识协议五元组 协议分层OSI七层模型TCP/IP五层(四层&…

Docker安装Redis集群(3主3从+动态扩容、缩容)保姆级教程含踩坑及安装中遇到的问题解决

前言 部署集群前,我们需要先掌握Redis分布式存储的核心算法。了解这些算法能帮助我们在实际工作中做出合理选择,同时清晰认识各方案的优缺点。 一、分布式存储算法 我们通过一道大厂面试题来进行阐述。 如下:1-2亿条数据需要缓存&#xff…

企业级 AI 开发新范式:Spring AI 深度解析与实践

一、Spring AI 的核心架构与设计哲学 1.1 技术定位与价值主张 Spring AI 作为 Spring 生态系统的重要组成部分,其核心使命是将人工智能能力无缝注入企业级 Java 应用。它通过标准化的 API 抽象和 Spring Boot 的自动装配机制,让开发者能够以熟悉的 Spr…

如何用docker部署ELK?

环境: ELK 8.8.0 Ubuntu20.04 问题描述: 如何用docker部署ELK? 解决方案: 一、环境准备 (一)主机设置 安装 Docker Engine :版本需为 18.06.0 或更新。可通过命令 docker --version 检查…

Redis最佳实践——安全与稳定性保障之高可用架构详解

全面详解 Java 中 Redis 在电商应用的高可用架构设计 一、高可用架构核心模型 1. 多层级高可用体系 #mermaid-svg-Ffzq72Onkv7wgNKQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Ffzq72Onkv7wgNKQ .error-icon{f…

【Python 算法零基础 4.排序 ⑥ 快速排序】

既有锦绣前程可奔赴,亦有往日岁月可回首 —— 25.5.25 选择排序回顾 ① 遍历数组:从索引 0 到 n-1(n 为数组长度)。 ② 每轮确定最小值:假设当前索引 i 为最小值索引 min_index。从 i1 到 n-1 遍历,若找到…

Go 即时通讯系统:日志模块重构,并从main函数开始

重构logger 上次写的logger.go过于繁琐,有很多没用到的功能;重构后只提供了简洁的日志接口,支持日志轮转、多级别日志记录等功能,并采用单例模式确保全局只有一个日志实例 全局变量 var (once sync.Once // 用于实现…

MYSQL MGR高可用

1,MYSQL MGR高可用是什么 简单来说,MySQL MGR 的核心目标就是:确保数据库服务在部分节点(服务器)发生故障时,整个数据库集群依然能够继续提供读写服务,最大限度地减少停机时间。 2. 核心优势 v…

阿里通义实验室突破空间音频新纪元!OmniAudio让360°全景视频“声”临其境

在虚拟现实和沉浸式娱乐快速发展的今天,视觉体验已经远远不够,声音的沉浸感成为打动用户的关键。然而,传统的视频配音技术往往停留在“平面”的音频层面,难以提供真正的空间感。阿里巴巴通义实验室(Qwen Lab&#xff0…

异步上传石墨文件进度条前端展示记录(采用Redis中String数据结构实现-苏东坡版本)

昔者,有客临门,亟需自石墨文库中撷取卷帙若干。此等文册,非止一卷,乃累牍连篇,亟需批量转置。然吾辈虑及用户体验,当效东坡"腹有诗书气自华"之雅意,使操作如行云流水,遂定…

处理知识库文件_编写powershell脚本文件_批量转换其他格式文件到pdf文件---人工智能工作笔记0249

最近在做部门知识库,选用的dify,作为rag的工具,但是经过多个对比,最后发现, 比较好用的是,纳米搜索,但是可惜纳米搜索无法在内网使用,无法把知识库放到本地,导致 有信息…