一、任务描述
鸢尾花分类任务是一个经典的机器学习问题,通常用于演示和测试分类算法的性能。该任务的目标是根据鸢尾花的特征将其分为三个不同的品种,即山鸢尾(Setosa)、变色鸢尾(Versicolor)和维吉尼亚鸢尾(Virginica)。这个任务是一个多类别分类问题,其中每个样本都属于三个可能的类别之一。
二、数据集描述
鸢尾花分类任务使用的数据集通常是著名的鸢尾花数据集(Iris dataset)。该数据集包含了150个鸢尾花样本,每个样本有四个特征:萼片长度(Sepal Length)、萼片宽度(Sepal Width)、花瓣长度(Petal Length)和花瓣宽度(Petal Width)。每个样本还标有其所属的品种。
三、主要代码
(1)主要代码库的说明与导入方法
- pandas (
import pandas as pd
):
Pandas是一个用于数据处理和分析的强大库,提供了数据结构(如DataFrame和Series)和数据操作工具,使得在Python中进行数据清理、转换和分析变得更加方便。 - matplotlib.pyplot (
import matplotlib.pyplot as plt
):
Matplotlib是一个用于绘制图表和可视化数据的2D绘图库。pyplot
是Matplotlib的子模块,提供了类似于MATLAB的绘图接口,用于创建图表、直方图、散点图等。 - sklearn.model_selection (
from sklearn.model_selection import train_test_split
):train_test_split
是scikit-learn中用于划分数据集为训练集和测试集的函数。它能够随机将数据划分为两个子集,是机器学习中常用的数据准备步骤之一。 - sklearn.svm (
from sklearn import svm
):
Scikit-learn中的svm
模块提供了支持向量机(SVM)算法的实现,包括用于分类和回归的支持向量分类器(SVC)和支持向量回归器(SVR)等。 - sklearn.metrics (
from sklearn import metrics
):metrics
模块包含了许多用于评估模型性能的指标,例如准确性、精确度、召回率、F1分数等。这些指标可用于评估分类、回归和聚类等任务的模型性能。
(2)数据预处理
1.查看数据集基本情况
使用pandas数据处理库来导入文件,注意这里的文件地址要改成你自己的,不然运行不了
# 导入必要的库 import pandas as pd # 从CSV文件读取鸢尾花数据集 iris = pd.read_csv("datasets/iris.csv") # 查看数据集大小 print(iris.shape)
可以看到数据集为150行,6列的数据集
2.特征工程
我们可以绘制图像来观察数据特征的关系,使用matplotlib绘图库,分别绘制花萼长宽图,与花瓣长宽图,来挖掘特征与种类之间的关系
# 导入必要的库 import pandas as pd import matplotlib.pyplot as plt # 从CSV文件读取鸢尾花数据集 iris = pd.read_csv("datasets/iris.csv") # 绘制散点图,显示鸢尾花的萼片长度与萼片宽度,根据不同的品种用不同的颜色标识 plt.scatter(iris[iris.Species == 'Iris-setosa']["SepalLengthCm"], iris[iris.Species == 'Iris-setosa']["SepalWidthCm"], color="red", label="Setosa") plt.scatter(iris[iris.Species == 'Iris-versicolor']["SepalLengthCm"], iris[iris.Species == 'Iris-versicolor']["SepalWidthCm"], color="green", label="Versicolor") plt.scatter(iris[iris.Species == 'Iris-virginica']["SepalLengthCm"], iris[iris.Species == 'Iris-virginica']["SepalWidthCm"], color="blue", label="Virginica") # 显示图例 plt.legend() # 设置图表标题和轴标签 plt.title('Scatter Plot of Sepal Length vs Sepal Width for Iris Flowers') plt.xlabel('Sepal Length (cm)') plt.ylabel('Sepal Width (cm)') # 显示图形 plt.show()
绘制花萼长与宽的关系图,我们发现蓝色和绿色的点混在一起,这就代表着这两个特征不能很好地区别鸢尾花的种类,使用这两个特征可能对模型性能提升不会有太多帮助
# 绘制散点图,显示鸢尾花的花瓣长度与花瓣宽度,根据不同的品种用不同的颜色标识 plt.scatter(iris[iris.Species == 'Iris-setosa']["PetalLengthCm"], iris[iris.Species == 'Iris-setosa']["PetalWidthCm"], color="red", label="Setosa") plt.scatter(iris[iris.Species == 'Iris-versicolor']["PetalLengthCm"], iris[iris.Species == 'Iris-versicolor']["PetalWidthCm"], color="green", label="Versicolor") plt.scatter(iris[iris.Species == 'Iris-virginica']["PetalLengthCm"], iris[iris.Species == 'Iris-virginica']["PetalWidthCm"], color="blue", label="Virginica")
绘制花瓣长与宽的关系图,我们发现不同颜色的点基本上被区分在了不同的区域,这代表着不同种类的鸢尾花的花瓣长宽有很大区别,所以花瓣的长与宽是两个强特征,让我们用这两个特征来进行模型训练吧。
(3)模型训练
在这里我们使用svm分类模型来训练,svm是一种经典的分类算法,我们可以使用机器学习库直接导入
# 导入必要的库 import pandas as pd from sklearn.model_selection import train_test_split from sklearn import svm # 从CSV文件读取鸢尾花数据集 iris = pd.read_csv("datasets/iris.csv") # 将数据集划分为训练集和测试集,测试集占总数据的20% train, test = train_test_split(iris, test_size=0.2) # 提取训练集和测试集的特征和标签 train_x = train[['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']] train_y = train.Species test_x = test[['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']] test_y = test.Species # 创建支持向量机(SVM)分类器模型 model = svm.SVC() # 在训练集上拟合SVM模型 model.fit(train_x, train_y)
(4)模型预测与性能评估
评估模型的性能,我们使用metrics库来评估模型的性能,它的预测指标是准确率
from sklearn import metrics # 使用训练好的模型对测试集进行预测 prediction = model.predict(test_x) # 打印SVM模型的准确性 print('The accuracy of the SVM is:', metrics.accuracy_score(prediction, test_y))
结果是1.0,这代表在测试集上的预测百分百正确,这是由于数据集较小,并且特征较少的原因,我们将在之后遇到更加复杂的情况
(5)除特征工程外的完整代码
这里是舍弃了一些寻找特征等工作的完整模型训练代码
# 导入必要的库 import pandas as pd from sklearn.model_selection import train_test_split from sklearn import svm from sklearn import metrics # 从CSV文件读取鸢尾花数据集 iris = pd.read_csv("datasets/iris.csv") # 将数据集划分为训练集和测试集,测试集占总数据的20% train, test = train_test_split(iris, test_size=0.2) # 提取训练集和测试集的特征和标签 train_x = train[['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']] train_y = train.Species test_x = test[['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']] test_y = test.Species # 创建支持向量机(SVM)分类器模型 model = svm.SVC() # 在训练集上拟合SVM模型 model.fit(train_x, train_y) # 使用训练好的模型对测试集进行预测 prediction = model.predict(test_x) # 打印SVM模型的准确性 print('The accuracy of the SVM is:', metrics.accuracy_score(prediction, test_y))
四、本章总结
- 如何查看数据集的大小
- 基本的探索数据之间关系的方法
- 对数据集进行划分的方法
- 基本的模型训练
- 基本的模型评估方法
当然,也可以自己处理特征,自己选择模型,调整参数,看看会不会获得更好的结果
感谢阅读,觉得有用的话就订阅下本专栏吧