鳶尾花項目

鸢尾花分类项目(机器学习入门实战)

这是**机器学习最经典的入门项目**,基于鸢尾花(Iris)数据集实现**花卉品种分类**,完整覆盖:数据加载 → 探索分析 → 可视化 → 模型训练 → 评估 → 预测全流程。

项目使用 Python + Scikit-learn 实现,代码可直接运行,适合零基础上手。 ## 一、项目介绍 - **数据集**:鸢尾花数据集(内置数据集,包含3类鸢尾花,4个特征)

**任务**:根据花萼/花瓣的长度、宽度,分类花卉品种(山鸢尾、变色鸢尾、维吉尼亚鸢尾)

**算法**:K近邻、逻辑回归、决策树、随机森林(多模型对比)

**目标**:零基础掌握机器学习分类项目完整流程

二、完整代码

1. 环境依赖

bash

复制代码
# 安装所需库(复制到终端运行)
pip install pandas numpy matplotlib seaborn scikit-learn

2. 项目源码(可直接运行)

python

复制代码
# ===================== 1. 导入依赖库 =====================
import pandas as pd
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.metrics import accuracy_score, classification_report, confusion_matrix
# 分类算法
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier

# 设置中文字体(解决绘图中文乱码)
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# ===================== 2. 加载数据集 =====================
# 加载内置鸢尾花数据集
iris = load_iris()
# 特征数据(花萼长/宽、花瓣长/宽)
X = iris.data
# 标签(0=山鸢尾,1=变色鸢尾,2=维吉尼亚鸢尾)
y = iris.target
# 特征名称
feature_names = iris.feature_names
# 品种名称
target_names = iris.target_names

# 转换为DataFrame,方便查看
df = pd.DataFrame(X, columns=feature_names)
df["species"] = [target_names[i] for i in y]

# ===================== 3. 数据探索分析 =====================
print("=" * 50)
print("📊 数据集基本信息")
print("=" * 50)
print(f"数据形状:{X.shape} (样本数, 特征数)")
print(f"特征名称:{feature_names}")
print(f"品种类别:{target_names}")
print("\n前5行数据:")
print(df.head())
print("\n数据统计信息:")
print(df.describe())
print("\n缺失值检查:")
print(df.isnull().sum())  # 无缺失值,无需处理

# ===================== 4. 数据可视化 =====================
print("\n" + "=" * 50)
print("📈 数据可视化中...")

# 1. 特征相关性热力图
plt.figure(figsize=(10, 6))
sns.heatmap(df.corr(numeric_only=True), annot=True, cmap="coolwarm")
plt.title("特征相关性热力图")
plt.tight_layout()
plt.show()

# 2. 特征分布散点图
sns.pairplot(df, hue="species", palette="husl")
plt.suptitle("鸢尾花特征分布", y=1.02)
plt.show()

# ===================== 5. 数据预处理 =====================
# 划分训练集(80%)和测试集(20%)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# 特征标准化(提升模型精度)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# ===================== 6. 构建并训练模型 =====================
# 定义多个模型,对比效果
models = {
    "K近邻(KNN)": KNeighborsClassifier(n_neighbors=3),
    "逻辑回归": LogisticRegression(max_iter=1000),
    "决策树": DecisionTreeClassifier(random_state=42),
    "随机森林": RandomForestClassifier(random_state=42)
}

# 训练+评估所有模型
model_scores = {}
print("\n" + "=" * 50)
print("🤖 模型训练与评估")
print("=" * 50)

for name, model in models.items():
    # 训练模型
    model.fit(X_train_scaled, y_train)
    # 预测
    y_pred = model.predict(X_test_scaled)
    # 计算准确率
    acc = accuracy_score(y_test, y_pred)
    model_scores[name] = acc
    # 输出结果
    print(f"\n【{name}】")
    print(f"测试集准确率:{acc:.4f}")
    print("分类报告:")
    print(classification_report(y_test, y_pred, target_names=target_names))

# 模型准确率对比
print("\n" + "=" * 50)
print("🏆 模型准确率对比")
print("=" * 50)
for name, acc in model_scores.items():
    print(f"{name}:{acc:.4f}")

# 绘制模型准确率柱状图
plt.figure(figsize=(8, 5))
sns.barplot(x=list(model_scores.keys()), y=list(model_scores.values()))
plt.title("模型准确率对比")
plt.ylim(0.9, 1.0)
plt.xticks(rotation=15)
plt.ylabel("准确率")
plt.tight_layout()
plt.show()

# ===================== 7. 最优模型预测新数据 =====================
# 选择准确率最高的模型(随机森林/逻辑回归/KNN 均可)
best_model = RandomForestClassifier(random_state=42)
best_model.fit(X_train_scaled, y_train)

# 构造新样本(花萼长5.1,花萼宽3.5,花瓣长1.4,花瓣宽0.2)
new_sample = np.array([[5.1, 3.5, 1.4, 0.2]])
# 标准化
new_sample_scaled = scaler.transform(new_sample)
# 预测
pred = best_model.predict(new_sample_scaled)
pred_species = target_names[pred[0]]

print("\n" + "=" * 50)
print("🔮 新样本预测")
print("=" * 50)
print(f"输入特征:{new_sample[0]}")
print(f"预测品种:{pred_species}")

三、代码核心说明

1. 数据集结构

**4个特征**:花萼长度、花萼宽度、花瓣长度、花瓣宽度

**3个标签**:setosa(山鸢尾)、versicolor(变色鸢尾)、virginica(维吉尼亚鸢尾)

**样本数**:150个(均衡数据集)

2. 项目流程(机器学习标准流程)

  1. **数据加载**:加载内置鸢尾花数据集

  2. **数据探索**:查看数据结构、统计值、缺失值

  3. **数据可视化**:相关性分析、特征分布

  4. **数据预处理**:划分训练/测试集、特征标准化

  5. **模型训练**:训练4种经典分类算法

  6. **模型评估**:准确率、分类报告、混淆矩阵

  7. **模型应用**:预测新样本

3. 关键知识点

`train_test_split`:划分训练集和测试集

`StandardScaler`:特征标准化(消除量纲影响) - 多模型对比:快速找到最优算法

评估指标:**准确率**(分类任务核心指标) --- ## 四、运行结果说明

  1. **数据探索**:输出数据集基本信息,无缺失值,数据干净

  2. **可视化**:生成热力图、特征分布图,直观看到特征与品种的关系

  3. **模型效果**:所有模型**准确率均≥96%**(随机森林/逻辑回归/KNN 可达100%)

  4. **预测功能**:输入花卉特征,自动输出品种 --- ## 五、扩展优化(进阶学习)

  5. **调参优化**:使用 `GridSearchCV` 优化模型超参数

  6. **模型保存**:使用 `joblib` 保存训练好的模型

  7. **界面开发**:结合Streamlit制作可视化预测网页

  8. **深度学习**:使用TensorFlow/PyTorch搭建神经网络分类

相关推荐
2301_816660212 小时前
如何在 Telegram Bot 中正确发送 HTML 格式的用户列表消息
jvm·数据库·python
2401_898717662 小时前
CSS如何使得响应式的侧边抽屉附带遮罩渐暗效果
jvm·数据库·python
享客多网络2 小时前
2026年蓟州区GEO软件公司如何引领科技创新潮流
人工智能·python·科技
weixin_458580122 小时前
如何在网页中完整展示数组中所有对象的全部属性
jvm·数据库·python
2403_883261092 小时前
PHP源码能否在Chromebook上运行_ChromeOS硬件限制说明【解答】
jvm·数据库·python
djjdjdjdjjdj2 小时前
golang如何编写DNS查询工具_golang DNS查询工具编写大全
jvm·数据库·python
架构师老Y2 小时前
003、Prompt设计原则:清晰、具体、结构化
python·prompt
万粉变现经纪人2 小时前
如何解决 pip install bitsandbytes 报错 仅支持 Linux+glibc(macOS/Windows 失败)问题
linux·运维·windows·python·scrapy·macos·pip
小何code2 小时前
【Python零基础入门】第6篇:Python字符串入门:创建、索引与切片
开发语言·python