前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 scikit-learn 玩转机器学习——模型评价

使用 scikit-learn 玩转机器学习——模型评价

作者头像
小小詹同学
发布2018-12-29 16:13:58
6010
发布2018-12-29 16:13:58
举报
文章被收录于专栏:小詹同学小詹同学

对于分类模型来说,我们一般会用模型的准确率来进行模型的评价,模型的准确率是用预测正确的样本数除以模型的总数。如果一个模型的准确率达到了95%,那么在我们的印象中,是不是这个模型表现的还挺不错的,那如果达到了99%呢,岂不是更好?

但是,在样本类别不平衡的情况下,仅仅使用模型的准确率并不能体现出模型的优劣。

就拿微博抽奖来举个栗子,IG 夺冠时王思聪发微博称:点赞、转发本条庆祝 IG 夺冠的微博可以参与获奖者每人一万的抽奖。假设10000人参与了该活动,共抽取了10名幸运者。现在问题来了,这次抽奖也成功的吸引了你女票的注意,她也知道你在机器学习领域浸淫多年,于是就命令你去建一个机器学习模型来预测她拿奖的准确率,通过研究中奖用户的特征来以此保证她下次一定抽中奖,不然就跟你分手。你一听慌了,一宿没睡狂撸代码,第二天一大早就拿着自己的劳动成果去邀功请赏,宣称你的模型准确率能到达99%,你女友一听脸色顿时铁青......于是你成了单身狗,可怜的是你居然还不知道到底出了什么问题。

好了,段子讲完了,言归正传。你想想,10000 个人抽10个人,中奖率都 0.1%,那么最朴素的一个模型就是无论是谁,我都宣称他的中奖率为0.1%,就这,这样的模型的准确率都能达到99.9%,那么准确率为99%的模型简直不要太垃圾好吧!你说你不单身谁单身。这同时也说明了,单一的使用准确率来评价分类模型的好坏是不严谨的,那么接下来就进入我们今天的正题。

混淆矩阵

我们拿二分类问题来举个栗子,上图中行代表真实值,列代表预测值,0、1分别代表我们研究的2个种类。预测正确为 True,用 T 表示,预测错误为 False,用 F 表示,预测为0类,我们称其呈阴性,用 N 表示,预测为1类被称为阳性,用 P 表示。在上表中合起来就是 TN、TP、FN、FP这四个值。下表就是上述提到的微博抽奖的混淆矩阵的其中一种情况。

在上表中,实际上没中奖同时也预测正确的人数,即TN值为9978,实际上中奖了也预测正确人数,即TP值为8,没中奖且预测错误的人数,即FP值为12,中了奖但预测错误的人数,即FN值为2.

精准率是TP值与TP值和FP值的和的比值,在上例中表示预测对的中奖人数占按预测应该中奖的人数的比值,表示如下:

召回率是TP值与TP值和FN值的和的比值,在上例中表示预测对的中奖人数占实际中奖人数的比率,表示如下:

然后我们可以得到我们所据上述例子中的混淆矩阵:

根据精准率和召回率的定义可得, 出现除0情况而无意义,,召回率为0,根据召回率的定义也可知,召回率表示的是对于特定的目标群,预测正确的比率。完美的解决了准确率在偏斜数据中不作为的问题。

在不同的应用场景下,我们通常会关注不同的指标,因为有些时候精准率更为重要,有些时候召回率更为重要。为了同时权衡这两个指标的重要性,就出现了 F1 Score,表达式如下:

由上式我们可以看出,F1 Score 其实就是精准率与召回率的调和平均值,因为召回率和精准率都大于0,由极限的性质可知,只有精准率和召回率都打的时候,F1 Score 才会比较大。

说到 ROC 曲线(Receiver Operating Characteristic, 受试者工作特性曲线),就得从 TPR 和 FPR,其分别表示 被正确预测的目标类别占目标类别的比率,和被错误的预测为目标类表占非目标类别的比率。其分别对应的表格和表达式如下:

ROC 曲线源于二战中用于敌机检测的雷达信号分析技术,后来才被引入机器学习领域。在进行机器学习模型的比较时,如果一个模型的 ROC 曲线被另一个模型的曲线完全包住,则可断言后者的性能优于前者;若两个模型的 ROC 曲线发生交叉,则在一般情况下很难判定2个模型孰优孰劣,这时,一种较为合理的评比标准便是比较这两个 ROC 曲线之下的面积,即 AUC(Area under curve)。

接下来我们用代码来具体的实现下相关的评判标准和判别式。

引入必要的包 -> 调用数据集 -> 使数据集中不同类别数量偏斜 -> 分离训练、测试数据集 -> 实例化一个逻辑回归模型 -> 预测并求出模型准确率

为增加我们对上述有关术语和评判标准的感性认识,我们具体实现了下一些函数,如下:

当然了,如果每次使用精准率和召回率时都要自己亲手撸出来可能骚微还是有一些的麻烦,不过 贴心的 scikit-learn 找就为我们准备好了一切,在 metrics 中封装了所有我们在上述实现的度量,如下是调用演示:

对于机器学习模型的性能而言,不光是各样本的特征系数,而且阈值(或称之为截距)的取法对其也有着重要的影响。如下代码是用于绘制精准率与召回率和阈值取值的关系,并绘出其图形:

PR 曲线对研究机器学习模型也有着重要的作用,我们也可以从 scikit-learn 中调用相关的函数来绘制 PR 曲线,如下:

绘制出 ROC 曲线:

ROC 曲线和 PR 曲线有着很强的相似性,因为这两图的各自的两个指标的取值范围都是0到1,因此都可以用曲线与 y=0 围成的面积可以用来表征模型的优劣,且用面积作为指标来衡量模型优劣对指标某个部分的具体变化不敏感,稳定性更强。关于以上所有概念更为严谨和全面的定义和证明请参考周大佬的西瓜书。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小詹学Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档