知行编程网知行编程网  2022-03-11 01:00 知行编程网 隐藏边栏 |   抢沙发  12 
文章评分 0 次,平均分 0.0

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

阅读本文大概需要3分钟

菜鸟独白

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



怎么玩呢:

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

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

  • 让机器来识别数字

  • 超参数调整提高准确率



1.介绍一下这个数据集

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

  • 一共有5620个数据

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

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

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

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

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



2.导入数据集

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

1).从sklearn导入数据

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

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

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

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


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

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

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

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


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

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

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

y=digits.target

y[111]

>>4

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



3.把数据喂给机器

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

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

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

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

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

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

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


2).让机器来预测数据

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

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

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

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


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

gird_search.best_params_

>>

<span style="font-size: 15px;color: rgb(255, 41, 65);">{'n_neighbors': 1, 'weights': 'uniform'}</span>


gird_search.best_score_

>>

<span style="font-size: 15px;color: rgb(255, 41, 65);">0.98440979955456576</span>


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


结论:


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


需要源码的同学,请留言


长按二维码,加入小密圈

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


 近期热门

双十二来了,我爬取了淘宝上所有的羽绒服|想找到最大折扣

Python年薪最高有50w|探秘全国近1600个Python岗位数据分析

学好Python薪水有多少|我爬取了所有的Python职位

一份值得了解的Google Python风格规范指南

南京楼市火吗|16000套二手房数据分析

分析9000部电影|一个简单的电影推荐系统

厉害了!实战爬取全网5000部手机|上篇


本篇文章来源于: 菜鸟学Python

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享