作者:欧新宇(Xinyu OU)
当前版本:Release v1.0
开发平台:Python3.11
运行环境:Intel Core i7-7700K CPU 4.2GHz, nVidia GeForce GTX 1080 Ti
本教案所涉及的数据集仅用于教学和交流使用,请勿用作商用。
最后更新:2024年3月5日
判别模型、多层感知机、LDA、马氏距离、欧氏距离、朴素贝叶斯
使用word文档或Markdown文档进行作答,使用Python编写程序,最终结果合并为一个word文档或Markdown文档,并另存为PDF格式进行提交。
注意:可以使用手机拍照文档进行提交,但请不要使用word文档直接进行提交。
[习题11.5-P354] 求下列方程组的符号解和数值解:
已知19个鸢尾花的分类数据如表11.5所示,试使用至少两种算法构建判别模型,并对3个未知样本进行分类判别。此外,要求使用回代误判率和交叉验证误判率对模型进行评估。
表11.5 鸢尾花样本数据
序号 | 花长(cm) | 花宽(cm) | 花瓣长(cm) | 花瓣宽(cm) | 类别 |
---|---|---|---|---|---|
1 | 5 | 3.3 | 1.4 | 2 | 1 |
2 | 6.7 | 3.1 | 5.6 | 2.4 | 3 |
3 | 8.9 | 3.1 | 5.1 | 2.3 | 3 |
4 | 4.6 | 3.6 | 1 | 2 | 1 |
5 | 6.5 | 3 | 5.2 | 2 | 3 |
6 | 5.8 | 2.7 | 5.1 | 1.9 | 3 |
7 | 5.7 | 2.8 | 4.5 | 1.3 | 2 |
8 | 6.6 | 3.3 | 4.7 | 1.6 | 2 |
9 | 4.9 | 2.5 | 4.5 | 1.7 | 3 |
10 | 7 | 3.2 | 4.7 | 1.4 | 2 |
11 | 4.8 | 3.1 | 1.6 | 2 | 1 |
12 | 6.3 | 2.5 | 5 | 19 | 3 |
13 | 4.9 | 3.6 | 1.4 | 1 | 1 |
14 | 4.4 | 3.2 | 1.3 | 2 | 1 |
15 | 5.8 | 2.6 | 4 | 1.2 | 2 |
16 | 6.3 | 2.7 | 4.9 | 1.8 | 3 |
17 | 5 | 2.3 | 3.3 | 1 | 2 |
18 | 5.1 | 3.8 | 1.6 | 2 | 1 |
19 | 5 | 3 | 1.6 | 2 | 1 |
20 | 5 | 3 | 1.6 | 2 | 1 |
21 | 6.4 | 2.8 | 5.6 | 2.1 | 待判定 |
22 | 5.1 | 3.8 | 1.9 | 4 | 待判定 |
23 | 4.9 | 3.0 | 1.4 | 3 | 待判定 |
建议使用Python编程实现,可以考虑直接使用sklearn库实现相关功能。
备注:
(1)为便于数据处理,建议先将数据存入xlsx文件中,再使用Python读取数据。注意数据读取时,可以使用numpy数组进行切片,并将数据载入为x_train, y_train, x_test三个数据子集。
(2)本例给出基于欧氏距离的KNN,基于马氏距离的KNN,三层神经网络,基于LDA的判别模型,基于朴素贝叶斯的多分类模型。
(3)此外给出回代误判率和交叉验证误判率进行模型对比。
import pandas as pd
import numpy as np
from sklearn.neural_network import MLPClassifier
from sklearn.neighbors import KNeighborsClassifier as KNN
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.model_selection import cross_val_score as cvs
from sklearn.naive_bayes import GaussianNB
df = pd.read_excel('../../Data/Homeworks/hw08.xlsx', engine='openpyxl')
data = df.values
x_train = data[:20,1:5]
y_train = data[:20, -1]
x_test = data[20:,1:5]
model_knn = KNN(n_neighbors=3).fit(x_train, y_train)
pred_knn = model_knn.predict(x_test)
print('KNN模型分类结果:', pred_knn)
print('KNN模型的回代误判率:', 1 - model_knn.score(x_train, y_train))
print('KNN模型的交叉验证误判率:', 1 - cvs(model_knn, x_train, y_train, cv=5))
model_mlp = MLPClassifier(hidden_layer_sizes=(32,16,32), solver='adam', random_state=1, max_iter=2000).fit(x_train, y_train)
pred_mlp = model_mlp.predict(x_test)
print('MLP模型分类结果:', pred_mlp)
print('MLP模型的回代误判率:', 1 - model_mlp.score(x_train, y_train))
print('MLP模型的交叉验证误判率:', 1 - cvs(model_mlp, x_train, y_train, cv=5))
Sigma = np.cov(x_train.T)
model_dist = KNN(metric='mahalanobis', metric_params=dict(V=Sigma)).fit(x_train, y_train)
pred_dist = model_dist.predict(x_test)
print('Mahalanobis模型分类结果:', pred_dist)
print('Mahalanobis模型的回代误判率:', 1 - model_dist.score(x_train, y_train))
print('Mahalanobis模型的交叉验证误判率:', 1 - cvs(model_dist, x_train, y_train, cv=5))
model_lda = LDA().fit(x_train, y_train)
pred_lda = model_lda.predict(x_test)
print('LDA模型分类结果:', pred_lda)
print('LDA模型的回代误判率:', 1 - model_lda.score(x_train, y_train))
print('LDA模型的交叉验证误判率:', 1 - cvs(model_lda, x_train, y_train, cv=5))
model_gnb = GaussianNB().fit(x_train, y_train)
pred_gnb = model_gnb.predict(x_test)
print('GaussianNB模型分类结果:', pred_gnb)
print('GaussianNB模型的回代误判率:', 1 - model_gnb.score(x_train, y_train))
print('GaussianNB模型的交叉验证误判率:', 1 - cvs(model_gnb, x_train, y_train, cv=5))
KNN模型分类结果: [3. 1. 1.]
KNN模型的回代误判率: 0.0
KNN模型的交叉验证误判率: [0.25 0.25 0. 0.25 0. ]
MLP模型分类结果: [3. 1. 1.]
MLP模型的回代误判率: 0.0
MLP模型的交叉验证误判率: [0. 0. 0. 0. 0.]
Mahalanobis模型分类结果: [3. 1. 1.]
Mahalanobis模型的回代误判率: 0.25
Mahalanobis模型的交叉验证误判率: [0.25 0.5 0.25 0.25 0.75]
LDA模型分类结果: [3. 1. 1.]
LDA模型的回代误判率: 0.0
LDA模型的交叉验证误判率: [0. 0.25 0. 0.25 0.25]
GaussianNB模型分类结果: [3. 1. 1.]
GaussianNB模型的回代误判率: 0.050000000000000044
GaussianNB模型的交叉验证误判率: [0. 0.25 0. 0.25 0.25]