机器学习之神经网络(五)手写数字识别案例调库实现

题目要求

某品牌运动鞋数据集有上万个样本,共有10个品种运动鞋,标记为0-9。每个样本的特征数据储存data.txt中,样本的标签文件存储在labels.txt中。

请完成该数据集的分类识别。可以用自己写的神经网络函数代码,也可以调用相关神经网络库函数。库函数导入,数据集的加载,适当缩放特征;将数据集随机分成训练集和测试集;调用神经网路相关库函数,或者自己编写的神经网络函数;建立适当的神经网络模型,包括神经网络结构,各种相关参数等;用训练集完成模型的训练,并计算在训练集上的准确率Accuracy及输出;用以上训练模型计算测试集的Precision,Recall和F1分数及输出

题目分析

本题目案例为运动鞋类别,其实就是我们学习神经网络的经典案例手写数字识别的更变版本,属于多分类问题。每逢碰到这种问题我们的解决思路一定要清晰,首先,一定是在心中设计好我们即将要使用的神经网络的架构,比如有几层隐藏层,每层的神经元个数是多少。我们都知道,大部分情况来说,多层大型的神经网络的模型效果比小型加入正则化的模型要好,那么此时我们要对数据进行观察,本次数据是10000个样本,每个样本有784个特征,那么对这种数据的训练,我们的神经网络的搭建就必须往大了搭,想必如果搭建成单层隐藏层,每个隐藏层十来个神经元的网络,拟合效果必然是很差的。这是常识,也是我们以后要多加注意积累的经验。
本次训练我选择至少两层隐层起步,第一层个数为400,第二层个数为100,进行尝试。
这里对数据的特征缩放,我们建议选择归一化缩放,特征缩放有利于计算机提高计算效率,缩短模型的训练时间,我们观察到数据中没有负数,所以我们在特征缩放后,期望我们的数据同样还是没有负数,所以我们选择归一化缩放。
而后题目要求我们将数据集进行切割,切成训练集和测试集,那么我们需要观察标签是否是有序排列的,如果标签是有序排列的,我们必须对数据进行洗牌,这样可以保证我们每个数据集的样本类别是均匀的,从而降低我们人为因素对模型训练的影响。
题目要求输出的是分类报告中的衡量指标,可以清晰的看到我们模型训练的效果如何,一般多和混淆矩阵一块使用。

代码及注释如下

# 1.库函数导入,数据集的加载,适当缩放特征(10分)
# 2.将数据集随机分成训练集和测试集(10分)
# 3.调用神经网路相关库函数,或者自己编写的神经网络函数(20分)
# 4.建立适当的神经网络模型,包括神经网络结构,各种相关参数等(20分)
# 5.用训练集完成模型的训练,并计算在训练集上的准确率Accuracy及输出(15分)
# 6.用以上训练模型计算测试集的Precision,Recall和F1分数及输出(15分)
'''
    调用神经网络库函数 处理本题
'''

import numpy as np
from sklearn.metrics import classification_report
from sklearn.neural_network import MLPClassifier

# 读取数据
X = np.loadtxt(r'image.txt',delimiter=',')
y = np.loadtxt(r'label.txt',delimiter=',')

# 特征缩放之 归一化
X_min = np.min(X)
X_max = np.max(X)
X = (X - X_min) / (X_max - X_min)

# 数据切割
m = len(X)
d = int(0.7 * m)
X_train,X_test = np.split(X,[d])
y_train,y_test = np.split(y,[d])

# 创建模型
model_mlp = MLPClassifier(hidden_layer_sizes=(400,100),max_iter=300)
# 跑模型
model_mlp.fit(X_train,y_train)
# 输出训练集的准确率
print('训练集的准确率是:',model_mlp.score(X_train,y_train))
# 输出测试集的分类报告
print('测试集的分类报告是:\n',classification_report(y_test,model_mlp.predict(X_test)))

题目结果如下

机器学习之神经网络(五)手写数字识别案例调库实现_第1张图片

你可能感兴趣的:(机器学习项目练习,机器学习,神经网络,调库实现,分类报告)