微信公众号:人工智能拾贝,关注了解更多的关于人工智能领域下机器学习相关技术文章。
这一期公众号,阿航将带你了解以下知识:
为什么我们相信大数据?
机器学习对数据质量有何要求?
如何评估模型?针对这一期的分类模型,特别说明“正确率”、“精准率”、“召回率”、“F1-score”.
用鸢尾花数据集来实际做一个实际可用的模型!
1.大数定理:为什么我们更相信“事不过三”?
“事不过三”这个词,最早出自《西游记》,在悟空三打白骨精那一回中,唐僧曾三逐悟空,悟空回道:
“常言道:‘事不过三。’ 我若不去,真是个下流无耻之徒。”
—— 明·吴承恩《西游记》第二十七回
图源网络,侵删
第一次被逐不离开,不觉“无耻之徒”;
第二次被逐不离开,觉得自己有点是“无耻之徒”了;
第三次被逐还不离开,觉得自己就是“无耻之徒”了……
这是为什么呢?
这是“大数据BigData”的力量!
数据量越少,那么建模就越是不可信;
数据越多,越能深刻表达。
事不过三时,无法下定论“无耻之徒”;
屡屡不走,才觉得自己是“无耻之徒”。
我们现在用这个词也是一样,随着观察次数的增多,逐渐相信所见到的,就是真实的!
关于这个思想,伯努利早已经把它描述成了数学问题,这就是著名的大数定理:
伯努利和他的大数定理
伯努利大数定理的思想是什么呢?简言之:数据量趋于无穷大的时候,事件发生的频率等于其概率。概率本身是个固定值,比如掷骰子,掷出每个面的概率都是1/6,但是如果实际掷10次,可能会得到这样的结果:
这时,它们的频率是:
大数定理告诉我们,当我们投掷的次数足够多的时候,频率会逐渐趋于概率值,即:
为什么我们要谋求大数据,就是这个原因,数据越多,数据揭示的规律就越可信,这个时候的数据才是有参考意义的!
2.“大数据”=“好模型” ?
并不是!因为,数据,可能会骗人!
秦二世之时,赵高驾鹿而从行。王曰:“丞相何为驾鹿?”高曰:“马也。”王曰:“丞相误也,以鹿为马。”高曰:“陛下以臣言不然,愿问群臣。”臣半言鹿,半言马。当此之时秦王不能自信自而从邪臣之说。
——汉·陆贾《新语·辨惑》
图源网络,侵删
以上就是 “指鹿为马” 的典故,“半言鹿,半言马”的结果,就导致了连秦二世都开始怀疑自己是不是真的不认识马和鹿了。这一切,都是因为群臣主观造假,篡改数据造成的。现实生活中,对数据造假,实际是对建立模型不利的,因为这直接导致了学习模型的数据和模型实际应用场景的数据分布不一致。正如秦二世使用的数据,都是赵高为了某种特定结果进行干扰造成的,因此秦二世脑子里的“鹿/马分辨模型”已经失效!
再举两个例子:
“盲人摸象”,如果只感知很小一部分、并只愿意相信这一部分的数据,那么其实这个盲人所描述的“大象”并不是真正的大象。
即使针对同一件事情进行社会调查,好像各个调查机构得到的结果也并不一样,为什么呢,因为各个机构为了得到自己觉得好看的结论,都在收集自己觉得对的数据。有偏颇地进行样本选择,直接就导致了模型和结论失效或不可复现!
所以呀,如果想做数据科学,就不能只关心自己感兴趣自己的数据:人的主观选择导致数据有偏差,会导致学习的数据模型失效!
因此,切记
选择数据的时候要保证随机、雨露均沾!
3.用评估函数来肯定我们的模型!
拥有了大量和全面的数据,就一定会训练处好模型来吗?
当然不是!每个模型都是一个计算策略,每个策略的预测结果也很有可能不一样,如果不对其评估,我们难以确定训练出的模型是否可用!
给你超级VIP版的五年高考三年模拟(优质且大量数据),你学了(训练)好久,然后考试去了,你全答完了(预测完毕),交卷了,安心等清华录取通知书(模型上线)么?
无目的的学习,并不能带你考进好大学
你忘了有“阅卷老师”的存在!
那么在机器学习中,谁在扮演阅卷老师的角色呢?
评 估 函 数 !
阿航问: 看模型好不好,最直观的评估策略是什么?
答: 看是不是预测对了。
阿航继续问: 怎么用数学表达出来呢?
答: 如果预测的和真实的一样,就是正确的,否则,就是错的,然后统计正确的个数,除以总数,就可以吧~
阿航:棒!这是评估里最直观的方法:叫做Accuracy,就是正确率!
正确率评估方法虽然简单,但它也有问题,我们设想一下,如果我们有这样一批数据,包含了18个正样本和2个负样本,我们学习到了4条分割线模型来区分两类数据,如图(a)、(b)、(c)、(d):
我们分析了一下得到这样的结论:
(a)模型应该是一个可以用的模型,它完美地区分了正负样本数据;
(b)模型仅仅预测对了一个负样本,虽然正确率达到了95%,但是负样本有一半被预测错了;
(c)模型负样本全部预测错误,正确率仍然也不低,达到了90%;
(d)模型得到一个明显有问题的分割线,但也得到了90%的正确率!
看来我们的模型评估是有问题的:因为最后一个模型,明显是不可用的!
咋回事?最简单的不是最好的?!
4.精准率、召回率、F1-score
那我们怎么评估才是有效的呢?我们不妨把真实的和预测的结果放进一个表格里看看:
对于模型(a):
我们对上面的表格分析,会得到以下结论:
真实为正的全被预测为正,共计18个;
真实为负的全被预测为负,共计2个;
没有产生正负样本被预测错的情况。
模型(a)的一切都显得很棒,那我们再看看模型(b),对于模型(b):
我们对上面的表格分析,会得到以下结论:
真实为正的全被预测为正样本,共计18个;
真实为负的有一个被预测为负,共计1个;
真实为负的有一个被预测为正,共计1个;
上面的这个表格有个名字,叫做“混淆矩阵”,阿航结合 (b) 模型的混淆矩阵,来给你解释两个新的指标,“精准率”和 “召回率”:
1. 什么叫精准率呢?就是看预测的准不准!
正样本的精准率:
正确预测为正占全部预测为正的 比例
( 18 ) / ( 18 + 1) = 18 / 19
负样本的精准率:
正确预测为负占全部预测为负的 比例
( 1 ) / ( 0 + 1 ) = 1
2. 什么叫召回率呢?就是看预测的全不全!
正样本的召回率:
正确预测为正占全部正样本的 比例
( 18 ) / ( 18 + 0) = 1
负样本的召回率:
正确预测为负占全部负样本的 比例
( 1 ) / ( 1 + 1 ) = 1/2
实际上,精准率和召回率存在一个关系:
召回率越高,精准率就越低;
召回率越低,精准率就越高。
如何理解这个规律呢?这里阿航给你举个某汽车品牌曾经发生过的汽车召回事件:事件的背景是某批车次出现问题,需要返厂修复。如果公司职员不认真处理召回工作,准备召回全部所有批次的车,其实是没有必要的,因为只有较小比例的车有问题,这就是所说的“召回率高,精准率低”;但是如果他们加了限定条件,严格确定是否需要召回,那他们肯定能提高精准率,相当于召回一个就精准一个,但是这也导致了召回的数量变少,就是所说的“精准率高、召回率低”。
如图,下图是一个真实大数据环境下的召回率和精准率关系图,通过调节阈值threshold(这里threshold的取值区间是[0.1,1.0])确定模型的严格程度:阈值越大,模型越严格,精准率就越高,召回率就越低;阈值越小,模型越放松,精准率就越低,召回率就变高。
上面我们得到了精准率和召回率,是不是还是觉得怪怪的?因为总不能我每次汇报结果就说召回多少,精准多少,这多麻烦啊。放心,你能想到的问题,数据科学家早都想过了,他们设计了一个叫做F1-score的函数,来调和这两个值:
对上图计算F1-score得到的曲线如下,蓝色的曲线就是F1-score的结果,需要说明的是,当精准率等于召回率的时候,F1-score的值和它们相等:
我们再回归到最初的(a)、(b)、(c)、(d)四个模型上看,依次得到:
正样本的F1-score值为:
(a):1、(b):0.97、(c):0.95、(d):0.95
负样本的F1-score值为:
(a):1、(b):0.67、(c):0.00、(d):0.00
看来 (c) 和 (d) 模型中负样本全被预测错误的问题被重视了,因为负样本的F1-score =!
5.让我们尝试建立一个可用的模型吧!
事实上,通过上面的讲解,我们基本能得到这样的结论:要做好一个机器学习模型,需要
“第一,数据量要足够多!
第二,数据质量足够好!
第三,评估要足够有效!”
那我们现在开始尝试建立一个可用的模型,让我们开始学习训练一个鸢尾花分类模型吧,鸢尾花数据可以说是机器学习的“Hello World”级的数据集:
图源网络,侵删
鸢尾花Iris数据集是常用的分类实验数据集,由Fisher于1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。
——百度百科·IRIS词条
我们这一次写代码要完成的学习目标,是做一个鸢尾花的二分类模型,很棒的是,Sklearn里面,已经有了这个数据集,只要两句话,就可以加载出这个数据集:
运行完上面两句之后,实际得到的是个数据集的结构体,其中两个重要部分是数据部分(data)和标签部分(target),我们分别取得这两部分,并定义为X和Y:
你想看一下这个X和Y是什么样子的?先后分别输入X和Y,查看数据的具体信息,其中,X的每一行就是一株花,每一株花包含了花萼长度,花萼宽度,花瓣长度,花瓣宽度四个信息;Y的每个值对应于X的每一行,表示每一株鸢尾花的类别标签:
我们拿标签为 “1” 和 “2” 的数据(即后两类鸢尾花)做二分类模型训练,这需要取原始的数据编号为50之后的数据。首先,我们加载数据:
然后,我们使用朴素贝叶斯模型来训练并在自身数据上进行测试,并输出预测值pred:
输出的结果如下:
我们看到:
真实为1且预测为1的有47个;
真实为1预测为2的有3个;
真实为2预测为1的有3个;
真实为2且预测为2的有47个;
此时,我们想看这个模型学习自身数据并在自身数据上进行预测的结果总汇总是怎样的,Sklearn里面有这样一个很棒的函数classification_report,可以输出分类结果报告,它的两个输入参数分别是真实值和预测值:
输出的结果如下:
我们继续尝试使用上一小节的感知机模型来训练上面的数据,得到了这样的结果:
输出的结果如下:
看来,对于鸢尾花数据集来说,感知机模型更好一些!
6.结语
至此,上中下三篇连载的《一文学会训练一个简单的模型》完结,通过这一系列的有趣讲解,你是否已经上了机器学习的道儿了呢?不过,阿航还是要说,这些都是前人造的轮子,如果想深入了解下去,不仅要知其然,还要知其所以然,阿航基于统计学习的机器学习小课堂《机器学习那些事儿》还在开课,欢迎你的关注、转发和分享,阿航争取写最有趣最通俗易懂的机器学习文章!
(文底有代码彩蛋,可直接运行的那种彩蛋)
欢迎分享留言~
点开长按上方二维码
关注有趣的机器学习小课堂
“机器学习拾贝”
带你在机器学习的海洋里找到宝贝
本文代码
(左右滑动可查看完整代码)
【机器学习那些事儿】系列历史推送:
领取专属 10元无门槛券
私享最新 技术干货