机器学习之手写字体(digits)识别——利用sklearn实现
文章目录
1实验目的
为了进一步地掌握建立机器学习模型的流程,理解机器学习的基本概念,此次实验针对sklearn自带的digits数据集(手写字体识别数据集)进行分类预测。
在此次实验中,我选用了KNN、MLP、Random Forest、Adaboost、SVM、Decision Tree、Logistic Regression这七种机器学习算法模型进行手写字体的识别。
本次项目的实验环境为pycharm + python3.9,经测试,各种算法模型在安装了python3.9的jupyter notebook中均可以正常运行
2实验过程
2.1 查看数据集
首先,将sklearn库中的数据集导入到项目中,其中X为1797*64的二维数组,代表数据集中1797个样本,每一个样本图片均是一维向量,特征维度为64,每个像素点代表1维的特征,其取值范围为0-16;y为样本所对应的标签值,共有10个类别,其取值范围为0-9中的任意一个数字。将数据集导入项目中的代码如下所示:
from sklearn.datasets import load_digits
digits = load_digits()
X = digits.data
y = digits.target
如果要可视化查看数据集,则需要将样本图片转换为二维,然后借助matplotlib包实现,以数据集中的第1796个样本9为例,具体的实现方式,如下所示:
import matplotlib.pyplot as plt
def show(image):
test = image.reshape((8, 8)) # 从一维变为二维,这样才能被显示
print(test.shape) # 查看是否是二维数组
plt.imshow(test, cmap=plt.cm.gray) # 显示灰色图像
plt.show()
if __name__ == '__main__':
show(X[1795])
数字9图片如下图所示:

考虑到在后续算法模型的建立过程中,需要用到的样本是一维向量,故show()函数只用来对数据集的查看和检验,并不将数据集全部进行转换。
2.2 数据清理
数据集的预处理主要分为两部分,分别是特征标准化和特征降维。
2.2.1特征标准化
调用sklearn中对数据进行标准化的函数处理样本X,特征标准化的过程如下:
from sklearn.preprocessing import StandardScaler
def standard_demo(data):
transfer = StandardScaler()
data_new = transfer.fit_transform(data)
print(data_new)
return data_new
if __name__ == '__main__':
X_new = standard_demo(X)
2.2.2特征降维
考虑到样本中的特征维度为64维,可能包含一些相近的维度或噪音等,这些维度会影响算法模型的性能,容易产生过拟合等现象,因此,在数据清理时,需要对样本进行特征降维。实现代码如下:
from sklearn.decomposition import PCA
def pca_demo(data):
transfer = PCA(n_components=0.92)
data_new = transfer.fit_transform(data)
print(data_new)
return data_new
if __name__ == '__main__':
X_new = pca_demo(X_new)
其中,在进行降维的过程中,保留原本数据集大小的百分比对与算法的准确率具有较大的影响,此次实验中,以KNN算法为例,从84%一直到96%,实验PCA降维之后算法的准确率,最终实验得到的结果如下表所示:
Percentage(%) 84 85 86 87 88 89 90 91 92 93 94 95 96
Accuracy 0.96 0.96 0.97 0.97 0.96 0.97 0.97 0.97 0.98 0.97 0.97 0.97 0.97
由于这是在调参之后测出的结果,所以在四舍五入之后,它们之间并没有很明显的差距,但是在保留原数据集92%的情况下,准确率依然很明显,故此次实验的降维参数n_components=0.92,特征维度降为34维,由此可见,数据集中的确存在大量的噪音或比较接近的特征维度。
2.3 机器学习建模
数据集已经准备好了,下一步就是建立机器学习算法模型,对模型进行训练。
2.3.1 KNN算法
我第一个选择的算法模型为KNN算法,因为它的原理比较简单,对于这种小数据集来说,理论上看它应该会有不错的表现,模型构建如下:
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
def knn_demo(data, label):
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(data, label, random_state=6)
# 训练模型
estimate = KNeighborsClassifier(n_neighbors=10)
estimate.fit(X_train, y_train) # 模型构建好了
if __name__ == '__main__':
knn_demo

最低0.47元/天 解锁文章
725

被折叠的 条评论
为什么被折叠?



