机器学习之手写字体(digits)识别——利用sklearn实现


机器学习之手写字体(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
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sky.Grey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值