首页 > 编程知识 正文

使用Python实现鸢尾花分类算法

时间:2023-11-20 19:01:58 阅读:294097 作者:IEAR

鸢尾花分类是机器学习领域的一个经典问题。本文将介绍如何使用Python实现鸢尾花分类算法,从数据预处理、模型构建、模型评估等多个方面进行详细阐述。

一、数据预处理

在进行机器学习任务之前,我们需要对数据进行预处理,包括数据集的导入、数据的清洗与格式化等过程。

首先,我们需要导入鸢尾花数据集,并查看其基本信息:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 导入数据集
data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None)
data.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'class']

# 查看数据信息
print(data.head())
print(data.info())

输出结果如下:

   sepal length  sepal width  petal length  petal width        class
0            5.1          3.5           1.4          0.2  Iris-setosa
1            4.9          3.0           1.4          0.2  Iris-setosa
2            4.7          3.2           1.3          0.2  Iris-setosa
3            4.6          3.1           1.5          0.2  Iris-setosa
4            5.0          3.6           1.4          0.2  Iris-setosa
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   sepal length  150 non-null    float64
 1   sepal width   150 non-null    float64
 2   petal length  150 non-null    float64
 3   petal width   150 non-null    float64
 4   class         150 non-null    object 
dtypes: float64(4), object(1)
memory usage: 6.0+ KB

可以看出,数据一共有150个样本,每个样本包含4个属性,分别为萼片长度、萼片宽度、花瓣长度、花瓣宽度,以及对应的分类标签。

接下来,我们需要对数据进行清洗与格式化:

# 处理缺失值
print(data.isnull().sum())

# 处理分类标签
data['class'] = pd.Categorical(data['class']).codes

# 查看处理后的数据
print(data.head())

输出结果如下:

sepal length    0
sepal width     0
petal length    0
petal width     0
class           0
dtype: int64
   sepal length  sepal width  petal length  petal width  class
0            5.1          3.5           1.4          0.2      0
1            4.9          3.0           1.4          0.2      0
2            4.7          3.2           1.3          0.2      0
3            4.6          3.1           1.5          0.2      0
4            5.0          3.6           1.4          0.2      0

可见,该数据集不存在缺失值,并且我们使用Categorical数据类型对分类标签进行了转化,方便后续的数据处理。

二、模型构建

在数据处理完成后,我们需要构建模型进行分类预测。在本文中,我们使用决策树算法进行分类,使用sklearn库进行模型构建。

首先,我们需要将数据集分为训练集和测试集:

from sklearn.model_selection import train_test_split

# 分离数据集
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

接着,我们可以使用决策树算法进行模型构建:

from sklearn.tree import DecisionTreeClassifier

# 构建模型
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)

# 预测
y_pred = clf.predict(X_test)

三、模型评估

在构建好模型后,我们需要对模型进行评估,以了解其性能和可靠性。

首先,我们可以使用accuracy_score函数计算模型的准确率:

from sklearn.metrics import accuracy_score

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('准确率为:', accuracy)

输出结果如下:

准确率为: 0.9555555555555556

可见,决策树模型的准确率为0.96,具有较高的分类性能。

除了准确率外,我们还可以使用confusion_matrix函数计算模型的混淆矩阵,并使用heatmap函数绘制可视化图像:

from sklearn.metrics import confusion_matrix
from sklearn.metrics import plot_confusion_matrix

# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, cmap='Blues')
plt.show()

输出结果如下:

可见,混淆矩阵的对角线上的数值较大,说明模型在分类预测中表现良好。

四、优化方案

在实际应用中,我们还可以尝试使用其他优化方式来提高模型的预测准确率,例如特征工程、模型融合、参数调优等。

其中,特征工程是指从原始数据中提取有意义的特征,以提高模型的性能和泛化能力。例如,我们可以使用递归特征消除法(Recursive Feature Elimination, RFE)对原始特征进行筛选,选出最为重要的特征:

from sklearn.feature_selection import RFE

# 使用递归特征消除法选取特征
selector = RFE(clf, n_features_to_select=2)
selector.fit(X_train, y_train)

# 查看特征排名
print(selector.ranking_)

输出结果如下:

[2 3 1 1]

可以看出,在使用递归特征消除法后,花瓣长度和花瓣宽度成为对分类任务最为关键的特征。

除了特征工程外,我们还可以尝试使用模型融合的方式提高模型的预测准确率。模型融合是指将多个模型的预测结果进行加权平均或投票决策,以得到更为准确的预测结果。例如,我们可以使用随机森林和K近邻算法构建两个不同的模型,然后使用投票决策的方式进行模型融合:

from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier

# 构建两个不同的模型
clf1 = RandomForestClassifier(max_depth=2, random_state=42)
clf2 = KNeighborsClassifier(n_neighbors=3)

# 模型融合
from sklearn.ensemble import VotingClassifier

clf = VotingClassifier(estimators=[('rf', clf1), ('knn', clf2)], voting='hard')
clf.fit(X_train, y_train)

# 预测
y_pred = clf.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('准确率为:', accuracy)

输出结果如下:

准确率为: 0.9777777777777777

可以看出,模型融合后的模型准确率进一步提高,达到了0.98。

总结

本文中,我们使用Python实现了鸢尾花分类算法,并对数据预处理、模型构建、模型评估以及优化方案等多方面进行了详细讲解。无论是从理论还是实践的角度考虑,鸢尾花分类问题都是一个十分经典的机器学习问题,相信本文对大家在学习和实际应用中都会有所帮助。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。