利用BP网络实现鸢尾花数据的分类

一、实验内容:

使用BP网络对鸢尾花数据集进行分类处理:

首先选取两维特征('petal length', 'petal width')进行分类,计算模型在训练集和测试集的识别准确率,利用matplotlib绘制一个SVM二维分类图,并将测试集的分类情况标注在图上以查看分类效果;    

然后选取三维特征,利用BP神经网络进行分类,使用mpl_toolkits.mplot3d模块绘制一个SVM三维分类图,观察分类效果,为方便查看,使用了plotly库绘制了一个真正的3D图,可拖拽查看。

注:实验环境使用的Jupyter

二、实验源程序及结果截图:

源程序核心代码

#输出模型识别准确度、二维分类结果、测试集分类情况代码:

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import classification_report
import warnings
warnings.filterwarnings("ignore")#避免输出警告信息,使结果美观
# 加载鸢尾花数据集
iris = datasets.load_iris()

# 设置随机种子,使得每次模型训练结果一致
np.random.seed(13)
# 只选择最后两个特征作为训练数据
X = iris.data[:, 2:]
y = iris.target

# 数据集可视化
plt.figure()
plt.scatter(X[y == 0, 0], X[y == 0, 1], c='b', label='setosa')
plt.scatter(X[y == 1, 0], X[y == 1, 1], c='r', label='versicolor')
plt.scatter(X[y == 2, 0], X[y == 2, 1], c='g', label='virginica')

plt.xlabel('Petal length')
plt.ylabel('Petal width')
plt.title('Iris Data Classification via BP ')

# 将数据集划分为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 创建并训练BP神经网络模型
model = MLPClassifier(hidden_layer_sizes=(10,), max_iter=1000)
model.fit(x_train, y_train)

# 计算模型在训练集和测试集上的准确率
print("神经网络模型训练集的准确率:%.3f" % model.score(x_train, y_train))
print("神经网络模型测试集的准确率:%.3f" % model.score(x_test, y_test))

# 在测试集上评估模型性能
target_names = ['setosa', 'versicolor', 'virginica']
y_hat = model.predict(x_test)
print(classification_report(y_test, y_hat, target_names=target_names))


# 绘制分类边界
h = 0.02  # 网格步长
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.4, cmap=plt.cm.Paired)

plt.legend()
plt.show()

# 绘制分类边界和训练集标志
plt.contourf(xx, yy, Z, alpha=0.4, cmap=plt.cm.Paired)

# 绘制训练集标注
plt.scatter(x_train[y_train == 0, 0], x_train[y_train == 0, 1], marker='o', c='b', label='setosa_train')
plt.scatter(x_train[y_train == 1, 0], x_train[y_train == 1, 1], marker='o', c='r', label='versicolor_train')
plt.scatter(x_train[y_train == 2, 0], x_train[y_train == 2, 1], marker='o', c='g', label='virginica_train')

# 绘制测试集标注
plt.scatter(x_test[y_test == 0, 0], x_test[y_test == 0, 1], marker='x', c='m', label='setosa_test')
plt.scatter(x_test[y_test == 1, 0], x_test[y_test == 1, 1], marker='x', c='y', label='versicolor_test')
plt.scatter(x_test[y_test == 2, 0], x_test[y_test == 2, 1], marker='x', c='c', label='virginica_test')

plt.xlabel('Petal length')
plt.ylabel('Petal width')
plt.title('Iris Data Classification via BP ')

plt.legend()
plt.show()

结果如下:

#选取三维特征,绘制三维分类图

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.neural_network import MLPClassifier
from mpl_toolkits.mplot3d import Axes3D  # 用于3D绘图
import warnings
warnings.filterwarnings("ignore")#避免输出警告信息,使结果美观
# 加载数据集
iris = datasets.load_iris()
X = iris.data  # 使用全部四个特征
y = iris.target  # 包括三类鸢尾花

# 创建并训练BP神经网络模型
model = MLPClassifier(hidden_layer_sizes=(10,), max_iter=1000)
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model.fit(x_train, y_train)

# 使用前三个特征进行可视化
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

colors = ['b', 'r', 'g']
for i in range(3):
    ax.scatter(X[y == i, 0], X[y == i, 1], X[y == i, 2], c=colors[i], label=iris.target_names[i])

ax.set_xlabel('Sepal length')
ax.set_ylabel('Sepal width')
ax.set_zlabel('Petal length')
ax.set_title('Iris Data Classification 3D via BP ')

plt.legend()
plt.show()

结果如下:
 

 #使用plotly库,绘制3D分类图

import plotly.graph_objects as go
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
import warnings
warnings.filterwarnings("ignore")#避免输出警告信息,使结果美观
# 加载数据集
iris = datasets.load_iris()
X = iris.data  # 导入数据
y = iris.target  # 包括三类鸢尾花

# 创建并训练BP神经网络模型
model = MLPClassifier(hidden_layer_sizes=(10,), max_iter=1000)
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model.fit(x_train, y_train)

# 使用前三个特征进行可视化
fig = go.Figure(data=[go.Scatter3d(
    x=X[:, 0],
    y=X[:, 1],
    z=X[:, 2],
    mode='markers',
    marker=dict(
        size=5,
        color=y,
        colorscale='Viridis',
        opacity=0.8
    )
)])

fig.update_layout(scene=dict(
    xaxis_title='Sepal length',
    yaxis_title='Sepal width',
    zaxis_title='Petal length'
))

fig.show()

结果如下:

三、分析与思考:

本次实验主要使用了BP网络模型分类方法,我选取150个数据中的45个数据作为测试集,剩下的数据作为训练集,使用sklearn库中的MLPClassifier类来实现BP神经网络模型,设置max_iter参数为1000,即用于指定算法的最大迭代次数为1000。;

对于可视化展示,使用了matplotlib库绘制二维图,mpl_toolkits.mplot3d模块绘制三维分类图,尝试使用了plotly库进行绘制3D分类图,都取得了良好的可视化效果;

BP网络模型在训练集、测试集的准确率都达到了95%以上,说明模型对鸢尾花数据集的预测能力是很好的;

测试集在二维分类图中用不同颜色的“x”标注出,可以清晰的看出测试集在分类结果中的显示,方便验证分类的合理性;

    对于最终的实验结果,BP网络分类图中的其中两类的边界依然不是很明显,但是只使用了二维数据进行分类,我认为主要还是因为两类数据之间的相关性导致的,即:当特征之间存在较强的相关性时,神经网络可能会受到多重共线性的影响,导致模型训练过程中出现过拟合或者收敛困难的情况;对于三维分类图,也存在这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值