一、 任务描述及数据
1. 任务描述
FashionMNIST 是一个替代MNIST 手写数字集的图像数
据集。它是由Zalando(一家德国的时尚科技公司)旗下的
研究部门提供。其涵盖了来自10 种类别的共7 万个不同商
品的正面图片FashionMNIST 的大小、格式和训练集/ 测试
集划分与原始的MNIST 完全一致。60000/10000 的训练测
试数据划分,28x28 的灰度图片。
2. 数据集描述
⚫ Kaggle提供的数据集
⚫ 数据字典
◼ label: 类别标签,整型
◼ pixel1 -- pixel784: 784个像素值(784 = 28 * 28)
⚫ 标签
◼ 0: T-shirt/top
◼ 1: Trouser
◼ 2: Pullover
◼ 3: Dress
◼ 4: Coat
◼ 5: Sandal
◼ 6: Shirt
◼ 7: Sneaker
◼ 8: Bag
◼ 9: Ankle boot
二、 需求分析及实现路线
1. 需求分析
2
本题要求通过机器学习的方法实现对 FashionMNIST 图
像数据集中的 10 个种类的共 7 万个不同商品的图片的分
类。
2. 实现路线
├── data
├── fashion-mnist_train.csv # FashionMNIST 训练数据文件
├── fashion-mnist_test.csv # FashionMNIST 测试数据文件
├── output #程序输出结果保存的目录
├── main.py #主程序
├── utils.py #工具文件,包含数据加载、图像数据显示、特征
工程等
├── config.py #配置文件
├── lect06_proj_readme.pdf #案例讲解文档
三、 模块设计及实现
1. 模块设计:
1) main.py:
main()函数:
读取 csv 数据文件,调用工具文件中的相关函数对数据进行
数据类型转换处理、图像数据特征提取处理、特征标准化处理、
数据显示处理、分类结果可视化处理与保存等,并引入机器学习
的相关库以及众多机器学习模型,对处理过的数据进行分类、预
测、评估,将每种模型的预测结果的准确率显示到控制台。
main()函数包含简单的默认参数的 Logistic Regression,也包含
复杂的包含交叉验证的多个模型,本人使用了逻辑回归模型
(Logistic Regression)、k 最近邻模型(k-Nearest Neighbors)、随机森
林分类模型(RandomForestClassifier)。
关键代码:
3
for i in range(len(models)):
score = cross_val_score(models[i],
scaled_feats_train,
y_train, cv=2, scoring='accuracy').mean()
scores.append(score)
if score > max_scores:
max_scores = score
model = models[i]
此部分代码根据每种模型预测结果的准确率选取最优的模型。
2) utils.py:
A. load_fashion_mnist_dataset(data_file)函数:
将 numpy 的数据类型转化为 uint8 格式,便于后续代码对数据
进行均衡化操作。
B. plot_random_samples(X, Y)函数:
对输入的两组数据随机抽取一部分,进行切片以后,将数据
通过 opencv 进行显示。对应于本题为显示标准化处理之前与
标准化处理之后的预测图像。
C. extract_feats(X, num = 3)函数:
通过中值滤波方式与直方图均化两个方法,将图像数据进行
处理,并从中提取出图像的特征。
核心代码:
#中值滤波,去除噪声
blur_img_data = cv2.medianBlur(img_data, num)
#直方图均衡化
equ_blur_img_data = cv2.equalizeHist(blur_img_data)
D. do_feature_engineering(feats_train, feats_test)函数:
对特征进行标准化处理,将 uint8 类型的数据转化为
np.float64 类型。
E. confusionMatrix(y_test, y_pred, image_name)函数:
根据真实数据与模型预测出来的数据进行混淆矩阵的绘制,
将其以热力图的形式展示出来。
F. save_compare_result(path = 'output/')函数:
将所以模型预测的结果绘制到同一张图中进行对比,将对比
结果显示出来,并将其储存到 output 文件中。
3) config.py:
4
配置文件,用以储存其他文件用到的配置数据
2. 模块实现
1. main.py:
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
import warnings
import utils
warnings.filterwarnings('ignore')
IS_SIMPLE_EXP = True
#文件名
train_data_file = 'fashion-mnist_train.csv'
test_data_file = 'fashion-mnist_test.csv'
#测试集和训练集
x_train, y_train = utils.
load_fashion_mnist_dataset(train_data_file)
x_test, y_test = utils.
load_fashion_mnist_dataset(test_data_file)
def main():
if IS_SIMPLE_EXP:
# 耗时比较短
print('简单的 LR 分类:')
# 随机选取训练集中数据进行绘制
feats_x_train = utils.extract_feats(x_train)
utils.plot_random_samples(x_train, feats_x_train)
# 进行图像处理
feats_x_test = utils.extract_feats(x_test)
# 对数据进行标准化处理
scaled_feats_train, scaled_feats_test =
utils.do_feature_engineering(x_train, x_test)
scaled_feats_train0, scaled_feats_test0 = utils.
do_feature_engineering(feats_x_train,
feats_x_test)
# 建立模型
model = LogisticRegression()
model.fit(scaled_feats_train, y_train)
model0 = LogisticRegression()