目录
(1)采用鸢尾花数据集进行SVM网络模型训练,计算模型在训练集和测试集的识别准确率。
(2)采用鸢尾花数据集进行BP网络模型训练,计算模型在训练集和测试集的识别准确率。
(3)采用K均值(K-mean)算法对鸢尾花数据集进行聚类,c=3。
3.对于鸢尾花数据的划分,我的划分为训练集占到总数据集的70%,测试集占到30%,
一、实验内容:
- 对鸢尾花数据集进行预处理(规范化)
- 采用Sklearn实现分类算法:
采用鸢尾花数据集进行SVM,BP网络模型训练,计算模型在训练集和测试集的识别准确率3
3.采用Sklearn实现聚类算法:
采用K均值(K-mean)算法对鸢尾花数据集进行聚类,c=3。
二、源程序及结果截图:
1.源程序核心代码:
(1)采用鸢尾花数据集进行SVM网络模型训练,计算模型在训练集和测试集的识别准确率。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 数据规范化处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 将数据存储到容器中
data = pd.DataFrame(X_scaled, columns=iris.feature_names)
data['target'] = y
# 可视化数据
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(data['sepal length (cm)'], data['sepal width (cm)'], data['petal length (cm)'], c=data['target'])
ax.set_xlabel('sepal length (cm)')
ax.set_ylabel('sepal width (cm)')
ax.set_zlabel('petal length (cm)')
ax.set_title('Iris Data')
plt.show()
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
# SVM模型训练和预测
svm_model = SVC()
svm_model.fit(X_train, y_train)
svm_train_pred = svm_model.predict(X_train)
svm_test_pred = svm_model.predict(X_test)
# 计算模型在训练集和测试集的准确率
svm_train_accuracy = accuracy_score(y_train, svm_train_pred)
svm_test_accuracy = accuracy_score(y_test, svm_test_pred)
print("SVM模型在训练集的准确率:", svm_train_accuracy)
print("SVM模型在测试集的准确率:", svm_test_accuracy)
# 可视化分类结果
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X_train[:, 0], X_train[:, 1], X_train[:, 2], c=y_train)
ax.set_xlabel('sepal length (cm)')
ax.set_ylabel('sepal width (cm)')
ax.set_zlabel('petal length (cm)')
ax.set_title('SVM Classification - Training Set')
plt.show()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X_test[:, 0], X_test[:, 1], X_test[:, 2], c=y_test)
ax.set_xlabel('sepal length (cm)')
ax.set_ylabel('sepal width (cm)')
ax.set_zlabel('petal length (cm)')
ax.set_title('SVM Classification - Test Set')
plt.show()
(2)采用鸢尾花数据集进行BP网络模型训练,计算模型在训练集和测试集的识别准确率。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 数据规范化处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 将数据存储到容器中
data = pd.DataFrame(X_scaled, columns=iris.feature_names)
data['target'] = y
# 可视化数据
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(data['sepal length (cm)'], data['sepal width (cm)'], data['petal length (cm)'], c=data['target'])
ax.set_xlabel('sepal length (cm)')
ax.set_ylabel('sepal width (cm)')
ax.set_zlabel('petal length (cm)')
ax.set_title('Iris Data')
plt.show()
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
# BP网络模型训练和预测
bp_model = MLPClassifier()
bp_model.fit(X_train, y_train)
bp_train_pred = bp_model.predict(X_train)
bp_test_pred = bp_model.predict(X_test)
# 计算模型在训练集和测试集的准确率
bp_train_accuracy = accuracy_score(y_train, bp_train_pred)
bp_test_accuracy = accuracy_score(y_test, bp_test_pred)
print("BP网络模型在训练集的准确率:", bp_train_accuracy)
print("BP网络模型在测试集的准确率:", bp_test_accuracy)
# 可视化分类结果
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X_train[:, 0], X_train[:, 1], X_train[:, 2], c=y_train)
ax.set_xlabel('sepal length (cm)')
ax.set_ylabel('sepal width (cm)')
ax.set_zlabel('petal length (cm)')
ax.set_title('BP Network Classification - Training Set')
plt.show()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X_test[:, 0], X_test[:, 1], X_test[:, 2], c=y_test)
ax.set_xlabel('sepal length (cm)')
ax.set_ylabel('sepal width (cm)')
ax.set_zlabel('petal length (cm)')
ax.set_title('BP Network Classification - Test Set')
plt.show()
(3)采用K均值(K-mean)算法对鸢尾花数据集进行聚类,c=3。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 数据规范化处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 将数据存储到容器中
data = pd.DataFrame(X_scaled, columns=iris.feature_names)
data['target'] = y
# 可视化数据
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(data['sepal length (cm)'], data['sepal width (cm)'], data['petal length (cm)'], c=data['target'])
ax.set_xlabel('sepal length (cm)')
ax.set_ylabel('sepal width (cm)')
ax.set_zlabel('petal length (cm)')
ax.set_title('Iris Data')
plt.show()
# 使用K均值算法进行聚类
kmeans = KMeans(n_clusters=3, n_init=10,random_state=42)
kmeans.fit(X_scaled)
# 获取聚类结果
labels = kmeans.labels_
# 可视化聚类结果
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(data['sepal length (cm)'], data['sepal width (cm)'], data['petal length (cm)'], c=labels)
ax.set_xlabel('sepal length (cm)')
ax.set_ylabel('sepal width (cm)')
ax.set_zlabel('petal length (cm)')
ax.set_title('K-means Clustering')
plt.show()
2.运行结果:
采用鸢尾花数据集进行SVM网络模型训练,计算模型在训练集和测试集的识别准确率。
数据预处理后进行的三维可视化图像:
对预处理后的数据进行SVM网络模型训练
计算模型在训练集和测试集的识别准确率。
---------------------------------------------------------------------------------
采用鸢尾花数据集进行BP网络模型训练,计算模型在训练集和测试集的识别准确率。
数据预处理后进行的三维可视化图像:
采用鸢尾花数据集进行BP网络模型训练
计算模型在训练集和测试集的识别准确率。
采用K均值(K-mean)算法对鸢尾花数据集进行聚类,c=3。
预处理后的三维图像:
采用K均值(K-mean)算法对鸢尾花数据集进行聚类,c=3。
三、分析与思考:
1、代码处理数据思路:
1.首先要将鸢尾花数据集进行下载,存储到容器中
2.对于得到的数据集中的每一条数据进行预处理,归一化处理
3.然后再预处理之后的数据基础之上进行SVM,BP模型训练然后使用分类算法对于测试集分类以及使用K均值模型算法对测试集进行聚类处理。
2、实验过程中遇到的问题以及解决方法:
1.在执行聚类算法时候,由于n_init这个参数的默认值已经从1.4版本中的10变成了’auto’,所以需要在调用KMeans(n_clusters=3,n_init=10,random_state=42)时需要加上n_init=10
打开Kmeans发现:确实已经变为了’auto’
2.可视化图像的选取:
首先使用的二维视图,但是根据数据集原始数据可以知道,每一个鸢尾花都是由四个数据量确定的,二维只能体现出两个数据量的关系,所以二维的区分度不高可视化程度不是特别高,于是我又使用了三维视图如正文。
鸢尾花数据的原始数据,每个鸢尾花数据都是由四个数据分量组成的,如下图,所以使用三维视图依然不够准确但是相比二维平面来讲效果是很显著的。
3.对于鸢尾花数据的划分,我的划分为训练集占到总数据集的70%,测试集占到30%,
总共数据集有150组数据,训练集105组,测试集45组。