MNIST数据集介绍
MNIST是一个手写数字数据集,数据集包含60000个训练数据与10000个测试数据,由500位作者手写而成,其中250位的手写作为训练数据,其余250位的手写作为测试数据。
通过这里MNIST数据集获取数据。
根据官方描述,该数据集的每个数据都被统一格式化成28 * 28像素大小,并已将手写数字居中于图像中央,即我们无需对数据集进行过多的预处理。
观察数据集可以发现,训练集60000,测试集10000,每张图片拥有784个特征。
X_train, y_train = load_train()
X_test, y_test = load_test()
print(X_train.shape) # (60000, 784) (10000, 784)
print(y_train.shape) # (60000,) (10000,)
使用matplotlib绘制其中一张图如下
image = X_train[0].reshape(28, 28)
plt.imshow(image, cmap='binary', interpolation="nearest")
plt.show()
显而易见,训练集的第一张手写图是数字“5”
训练思路
降维
通过观察数据发现,每张图片的边缘存在大量空白,即使删掉这部分内容,也不会丢失太多信息。针对这种情况,考虑使用降维来去除这些无关信息,降维还能够将两个相邻特征合并为一个,以此来降低维度,提升训练速度。
选择模型
本文将尝试使用几种模型对数据集进行训练:K邻近、SVM(支持向量机)、随机森林
其中,由于SVM是一个二元分类器,所以将会对10个数字分别训练10个分类器。
为了给模型找到合适的超参数,以更好的拟合数据,则使用GridSearchCV(网格搜索)对超参数进行微调。
最后采用模型集成来做预测。
评估模型
通过两种方式来评估模型性能,分别是交叉验证与混淆矩阵。
训练模型
PCA
使用PCA(主成分分析)降维,问题在于如何设置合适的维度,n_components参数用于设置需要保留的主成分数;
若不确定其主成分数,可以设置值为[0.0, 1.0],此时值表示要保留的方差率。
from sklearn.decomposition import PCA
# 使用主成分分析降维,保留95%的可解释方差比
pca = PCA(n_components=0.95)
X_train = pca.fit_transform(X_train)
print(pca.n_components_) # 输出154,即保留了154个主成分
KNN
KNN(K-邻近值)感觉是比较适合这项分类任务的模型。
使用sklearn提供的网格搜索,找出合适的模型超参数。
网格搜索
from sklearn.model_selection import GridSearchCV
# 尝试以下参数组合
param_grid= [
{
'weights': ['uniform', 'distance'], 'n_neighbors': [5, 10, 15]}
]
grid_search = GridSearchCV(model, param_grid, cv=3<