小白学机器学习|如何识别5000多个手写数字

浏览: 1523

这是菜鸟学Python的第132篇原创文章

阅读本文大概需要3分钟

菜鸟独白

前段时间一直在写各种榜单,2017电影榜单,基金榜单,Github榜单上的库等等,玩的不亦乐乎!机器学习前面写了一篇(小白入门最简单的机器学习算法)偷懒没有继续写。其实学和玩是不矛盾的,个人对数据分析一直非常好奇,只是数据分析和数据挖掘是两个完全不同的维度,一个趋于表象,一个趋于内在,各有千秋,但是都很有趣。今天我接着来分享一篇好玩的机器学习例子,我们如何识别手写数字。

怎么玩呢:

  • 了解这个5000多个手写数子

  • 清洗数据并用机器学习算法训练

  • 让机器来识别数字

  • 超参数调整提高准确率

1.介绍一下这个数据集

这个数据集也是非常有名的,是入门的经典数据集,而且时间也蛮久的了!大概在1998年就有的这个数据集,大概情况如下:

  • 一共有5620个数据

  • 每一个数据有64个属性(特征)

  • 这64个特征其实是一个8*8的像素点,每个像素点的取值在0-16之间

  • 这数据集8*8 其实就是一个手写的数字,数字是0-9之间的任意一个数字

image.png

http://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits

2.导入数据集

这个数据集已经直接内置在sklearn里面了,非常方便.它内置了很多好玩的数据集,对于刚开始学机器学习的同学来说,建议先从清洗过的数据集开始练手,然后慢慢的再用原始的复杂的数据集.

1).从sklearn导入数据

image.png

这个数据集和iris鸢尾花很类似,有data,target,target_names,image,DESCR五个属性.非常标准的一个数据集.

image.png

sklean里的数据仅收入了1797个数据,规模比5000小很多,仅有三分之一左右. 但是对于我们新手来说足够了.

2).看一下手写数字长啥样

有同学会问不是说都是手写数字吗,怎么都是一个一个矩阵啊,好我们就来看一下手写数字长啥样:

我们从数据集中选一个编号为111的数

image.png

image.png

我们人眼识别一看就知道是一个数字4,好我们看一下target里面的值是不是也是4:

y=digits.target
y[111]
>>4

target里面也是4,说明我人眼识别看的是对的

3.把数据喂给机器

这里我们依然采用knn(k邻近算法前面我详细介绍过)来训练这个数据集.

1).机器学习有一个套路,就是三板斧:

  • 分割数据,划出训练数据,测试数据

  • 找到算法模型,训练数据

  • 测试模型准确率,然后调参

image.png

训练完数据之后我们的准确率有98.33%,还是蛮高的!

2).让机器来预测数据

比如我们从测试集里面随机抽一个数据,让机器去识别:

image.png

这是一个数字2,好我们用刚才的模型让机器去识别一下,看他能不能读出来

knn.predict(X_test[10])
>>
array([2])

牛逼啊,如果我们给这个算法套一个外壳,前端用摄像头读取数字,后台用这套算法去训练,然后用语音去播报数字,就是一个小小数字识别机器人啦!当然这个想法比较简陋~~

4.提高准确率

我们的knn这个算法有很多参数可以调,大家可以去 sklearn官网查一下

class sklearn.neighbors.KNeighborsRegressor(n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, metric_params=None, n_jobs=1, **kwargs)

上面都是默认参数,这里我们调整下面几个参数:

  • n_neighbors:邻近值我们搜索从1到10

  • weights:权重有两种"uniform,distance"

  • p:p值不通,代表不同的距离类型,比如p=1为曼哈顿距离,p=2为欧氏距离

image.png

其实对参数的调整,需要对这个算法有深入的认识,比如权重的选择什么时候应该用unifrom(统一选择法),什么时候用distance(距离选择法),二者之间的区别是什么,最后我们看一下搜索网格参数之后最佳系统参数是多少:

gird_search.best_params_
>>
{'n_neighbors': 1, 'weights': 'uniform'}
gird_search.best_score_
>>
0.98440979955456576

原来我们的准确率为98.3%,最后用网格搜索发现最佳的参数是k=1,weights='unifrom',调参数之后变成了98.44%,如果我们继续大范围的调整更多的相关参数,准确率有可能更高!当然如果样本越大的话,准备率也会提高!

结论:


机器学习对数学知识真的要求很高,越往深研究,越发现自己的数学知识很浅薄!同时机器学习也很可怕,因为一旦大量的数据喂个机器之后,机器进行学习,它就有了识别和预测的能力,可以说是一种武器或者是双刃剑,善加利用对我们的工作学习,帮忙非常大,因为它的速度真的太快了!

推荐 0
本文由 菜鸟学Python 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册