首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何识别5000多个手写数字

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

阅读本文大概需要3分钟

菜鸟独白

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

怎么玩呢:

了解这个5000多个手写数子

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

让机器来识别数字

超参数调整提高准确率

1.介绍一下这个数据集

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

一共有5620个数据

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

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

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

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

2.导入数据集

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

1).从sklearn导入数据

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

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

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

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

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

第111个数其实是一个array,里面有64个数字,我们图像化一下:

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

y=digits.target

y[111]

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

3.把数据喂给机器

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

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

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

找到算法模型,训练数据

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

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

2).让机器来预测数据

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

这是一个数字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为欧氏距离

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

gird_search.best_params_

{'n_neighbors': 1, 'weights': 'uniform'}

gird_search.best_score_

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

结论:

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

需要源码的同学,请留言

更多私密技巧干货,尽在小密圈

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180109G042P200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券