鸢尾花分类项目是一个经典的入门项目,它不仅简单易懂,还能帮助我们掌握机器学习的基本步骤和方法。

1、项目介绍

鸢尾花数据集(Iris Dataset)早在1936年就由英国生物学家 Ronald A. Fisher 引入。这个数据集包含了150个鸢尾花样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度和花瓣宽度)和1个目标变量(鸢尾花的品种)。

  • 特征包括:花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)和 花瓣宽度(petal width);

  • 目标变量:鸢尾花的品种(有三种类别:山鸢尾(Iris Setosa)、变色鸢尾(Iris Versicolour)以及 维吉尼亚鸢尾(Iris Virginica))。

数据科学案例分析 - 知乎

2、项目目标

使用机器学习算法,根据鸢尾花的四个特征来预测其所属的品种。

3、项目步骤

以下是机器学习大致的基本步骤,我们后面实战部分也将是参考此步骤来进行的:

数据准备:获取并准备好数据集。在鸢尾花数据集中,这包括加载数据,了解数据的结构,检查是否有缺失值等;

数据预处理:对数据进行清洗和转换,如处理缺失值、标准化或归一化特征等;

数据分割:将数据分成训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能;

选择模型:选择合适的机器学习算法来训练模型,如K近邻(KNN)、决策树、逻辑回归、支持向量机(SVM)等;

训练模型:使用训练数据来训练模型;

评估模型:使用测试数据评估模型的性能,查看模型的准确率、混淆矩阵等评估指标;

模型优化:根据评估结果调整模型参数,优化模型性能;

模型部署:将训练好的模型应用到实际问题中进行预测。

数据准备

鸢尾花数据集作为机器学习领域中最著名的数据集之一,常用于入门级教学和算法验证。

我们可以通过以下地址对该数据集进行下载:https://archive.ics.uci.edu/dataset/53/iris。下载后,导入:

import pandas as pd
feature_names = [
    "sepal length (cm)",
    "sepal width (cm)",
    "petal length (cm)",
    "petal width (cm)",
    "target"
]
data = pd.read_csv("iris.csv", header=None, names=feature_names)
# 查看数据
print(data.head())      # 查看数据集前五行数据
print('-')
print(data.info())      # 查看数据集的基本信息
print('-')
print(data.describe())  # 查看数据集的统计信息

打印结果:

   sepal length (cm)  sepal width (cm)  ...  target  target_names
0                5.1               3.5  ...       0        setosa
1                4.9               3.0  ...       0        setosa
2                4.7               3.2  ...       0        setosa
3                4.6               3.1  ...       0        setosa
4                5.0               3.6  ...       0        setosa

[5 rows x 6 columns]
-
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 6 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   sepal length (cm)  150 non-null    float64
 1   sepal width (cm)   150 non-null    float64
 2   petal length (cm)  150 non-null    float64
 3   petal width (cm)   150 non-null    float64
 4   target             150 non-null    int64  
 5   target_names       150 non-null    object 
dtypes: float64(4), int64(1), object(1)
memory usage: 7.2+ KB
None
-
       sepal length (cm)  sepal width (cm)  ...  petal width (cm)      target
count         150.000000        150.000000  ...        150.000000  150.000000
mean            5.843333          3.057333  ...          1.199333    1.000000
std             0.828066          0.435866  ...          0.762238    0.819232
min             4.300000          2.000000  ...          0.100000    0.000000
25%             5.100000          2.800000  ...          0.300000    0.000000
50%             5.800000          3.000000  ...          1.300000    1.000000
75%             6.400000          3.300000  ...          1.800000    2.000000
max             7.900000          4.400000  ...          2.500000    2.000000

[8 rows x 5 columns]

数据预处理

  • 数据格式有什么问题吗?

  • 数据数值有什么问题吗?

  • 数据需要修复或删除吗?

无,因数据无缺失

数据可视化

通过数据可视化手段,探索数据的分布和特征之间的关系。使用 seabornpairplot 函数绘制特征之间的分布图,以便于观察数据的分布情况和不同类别之间的关系。

import seaborn as sns
import matplotlib.pyplot as plt

# 绘制特征分布图
sns.pairplot(data, hue='target', markers=["o", "s", "D"])  # 使用 seaborn 库的 pairplot 函数绘制散点图矩阵,根据 'target' 列着色,并使用不同的标记
plt.show()                                                 # 显示图形

数据分割

将数据分成训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。

分割数据集的主要目的是为了评估模型的性能。通过将数据集划分为训练集和测试集,我们可以在训练集上训练模型,并在测试集上评估模型的泛化能力。这有助于检测模型是否过拟合或欠拟合,并提供对模型性能的更真实的评估。

# 分割数据集
X = data['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']  # 特征数据,包含所有特征列
y = data['target']  # 目标数据,包含目标标签
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
                                                    random_state=42)  # 将数据集按 70% 训练集和 30% 测试集进行分割,设置随机种子为 42 以确保可重复性

# 查看分割后的数据集大小
print(f"训练集大小: {X_train.shape[0]}, 测试集大小: {X_test.shape[0]}")  # 打印训练集和测试集的大小