【课后作业08】判别模型-鸢尾花分类 隐藏答案 | 返回首页

作者:欧新宇(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]

【课后作业08】判别模型-鸢尾花分类 隐藏答案 | 返回首页