模型评估小记

本文深入探讨了模型评估的多种指标,如准确率、精确率、召回率、F1-score及ROC曲线,阐述了它们在不同场景下的应用。同时,文章介绍了A/B测试的重要性,以及模型评估的常见方法如Holdout、交叉验证和自助法。此外,还讨论了超参数调优策略和解决过拟合、欠拟合问题的方法。

模型评估是验证模型效果的重要手段。不同的评价指标有不同的侧重点,我们评估模型时需要选择恰当的评估指标以期体现我们真实想反馈的模型结果。
常用的评价指标有:准确率、精确率、召回率、RMSE等

准确率

准确率是预测正确样本的占比。当样本不平衡时,准确率将不能客观反映真实情况。例如垃圾邮件分类问题中垃圾邮件占比很小,假设占比为95.这时即使我预测所有邮件都不是垃圾邮件,准确率也高达95%。显然不是我们想要的结果。所有准确率不适用于未作处理前的样本极度不平衡情形。

精确率与召回率

精确率:分类正确的正样本个数占预测为正样本个数的比例。精确率就像古代比较仁慈的官老远。对嫌犯宁放过不杀错!相对保守!
召回率:分类正确的正样本个数占正样本个数的比例。召回率恰恰相反,是一个酷吏,宁杀错不放过,毕竟激进!
这两种评估指标是既统一又矛盾的,那么我们该采用哪个指标呢?还是以垃圾邮件系统为例。如果只有精确率作为评价方式,则效果为向用户预警的邮件大多数都是垃圾邮件,但是会漏掉很多垃圾邮件,把他们当作好的邮件!这个时候用户就开始骂人了!这是啥子玩意,这么多垃圾邮件都没有拦截到!!!如果只以召回率来作为评价方式,则绝大多数的垃圾邮件都被拦截了,用户基本不吐槽我们不能拦截不到垃圾邮件了。但是用户用了一段时间后又开始骂人了!!!因为他发现一些重要的工作邮件收不到,被发现在我们的拦截邮件列表里!用户瞬间感觉失去了几个亿!!!

通常用R-P曲线、roc、F1-score来判定模型的性能。

R-P曲线图如下:
在这里插入图片描述做这个图时通常是把样本为正样本的概率(或者其他的距离等)算出来,然后从小到大逐渐增加阈值,分别算出精确率和召回率,以横坐标为召回率、纵坐标为精确率作图。如果有两个模型,则面积大的模型教优!如果两个模型的面积不是太好判断,可以以精确率等于召回率时,曲线值较大的模型教优!此时的点称为平衡点。

F1-score:为精确率和召回率的调和平均值,通常也是一种平均指标

ROC曲线:roc曲线涉及到两个新的指标,真阳性、假阳性
真阳性率:预测正确的正样本个数占正样本个数的比例。此时就是召回率。(作为纵坐标)
假阳性率:错误预测为正样本的负样本个数占负样本个数的比例。(作为横坐标)
制作roc曲线:模型输出样本为正样本的概率,从大到小排序。指定一个阈值,大于阈值的样本为正,分别计算真阳性和假阳性率作为坐标点,然后调低阈值。迭代,连接所有的坐标点点即可得到roc曲线。

R-P曲线和ROC曲线的区别如下图
在这里插入图片描述
ac对比可知,负样本增加10倍后,roc曲线基本没有变化:①真阳性计算时在数学上与负样本无关;②假阳性中分子虽然分子增大了,但是如果当前的负样本分布变化不大的情况下,负样本的概率大于阈值的比例不应变化过大,此时假阳性分子分母几乎同比例增大,故而影响不大。(如果增加10倍负样本后,负样本的分布已经改变,则说明增加前或者增加后的数据集中总有一个不能代表负样本数据的真实分布,那继续在当前数据集上做模型已经没有太多意义了。)
bd对比可知,负样本增加后曲线发生了极大的变化:精确率计算时,分母含有错误预测为正的负样本个数,使精确率大幅下降!

故:①在不同的数据集上比较模型性能时,roc更稳定;②现实中经常遇到样本不平衡问题,roc更通用;③如果想看同一数据集上的不同模型性能,R-P曲线更加适合

使用roc曲线时,常常计算曲线下的面积auc,auc越大,说明模型的真阳性越大,假阳性越小!(如果全预测正确,auc曲线的面积就是1,把边长为1的正方形区域都填满了。不过遗憾的是这种情况基本不可能)

余弦距离

余弦相似度:两个单位化的向量相乘记为余弦相似度,范围是[-1:1]
余弦距离:1-余弦相似度,范围是[-1:1]
①余弦距离更看重方向上的相对差异;欧氏距离更看重数值上的绝对差异
②欧式距离收到维度的影响,维度越多,值越大,但余弦距离不受到影响

距离定义:集合中,任意一对元素可唯一确定一个实数,满足:正定性、对称性、三角不等式。
余弦不等式不满足三角不等式,不是严格意义上的距离。例如:a(1,0),b(1,1),c(0,1)
d ( a , b ) = 1 − 2 2 d(a,b)=1-\frac{\sqrt2}{2} d(a,b)=122 d ( b , c ) = 1 − 2 2 d(b,c)=1-\frac{\sqrt2}{2} d(b,c)=122 d ( a , c ) = 1 d(a,c)=1 d(a,c)=1
d ( a , b ) + d ( b , c ) = 2 − 2 &lt; 1 = d ( a , c ) d(a,b)+d(b,c)=2-\sqrt2&lt;1=d(a,c) d(a,b)+d(b,c)=22 <1=d(a,c)

A/B测试

A/B测试是检测模型最终效果的主要手段
通常在离线评估后仍然需要做A/B测试:

  • 离线评估无法完全消除模型过拟合带来的影响
  • 离线评估无法完全还原线上的真实工程环境。例如数据延迟、缺失等
  • 离线评估无法计算某些商业指标。离线评估一般只是针对模型本身评估,往往无法计算与之相关的其他商业指标。例如推荐系统无法计算法带来的留存率、点击率等等

A/B通常对用户进行分桶操作,划分一组为实验组、一组为对照组。划分时需要遵循原则:独立性(每个用户只能属于一组)、无偏性(对样本进行随机抽样)

模型评估的常用方法

Holdout:把数据随机划分为训练集和验证集。训练集用来训练模型,验证集用来验证模型。通常比例为7:3,也可以再增加一个测试集,比例变为6:2:2。不过在神经网络中,数据量很大时为了充分利用数据,验证集和测试集的比例会进一步减小。有可能训练集占比达到99%。
缺陷:①验证集计算出来的评估指标与原始分组有很大关系。由于是随机分组,两个分组的分布很可能差异太大,导致模型失败。②有相当大一部分数据并没有利用上
交叉验证:把数据量分为k份大小相等的子集,遍历k个子集,每次把自己当做验证集,其余k-1个子集当做训练集。最后把k次的评估指标平均值作为最终指标。通常k取为5,如果数据量多也可以选10。(k可以通过观察k次的评估指标方差来确定,如果方差较大,则各个子集的分布差距较大,可以减小k,尽量使分布有一定的相似性。不过最好不要小于5)
交叉验证在一定程度上消除了只划分为训练集和验证集时随机性带来的影响!
自助法:当样本集较小时,不管是交叉验证还是holdout都可能得不到理想的模型。我们可以使用自助法来维持样本的规模。自助法的根本原理就是采样:进行n次有放回的抽样作为训练集,未被抽到的样本作为验证集(理论上,n足够大时,验证集比例为 1 e ≈ 36.8 % \frac 1e\approx 36.8\% e136.8%)。bagging就使用了booststrao。

超参数调优

超参数很可能影响一个模型的最终效果。通常做法:①通过经验来确定,②去GitHub上找相似项目,使用他们的参数作为最初参数,③范围搜索:

  • GridSearchCV:暴力搜索范围内的所有可能组合,能找到最优解,但是非常耗费算力和时间。通常先设定一个较大的步长和较广的范围,确定一个当前可能最优的位置,然后逐步缩小搜索范围和步长,这种方法能在一定程度上减少算力和时间的耗费,但很可能错过最佳值。
  • RandomizedSearchCV:随机选取范围内的参数点,如果参数点足够多,能大概率找到最优值或者其近似解。但是结果没法保证。
  • BayesianOptimization:利用上一次参数的信息,不断更新参数使之向最佳参数靠近。速度上比网格搜索和随机搜索快的多。

过拟合和欠拟合

过拟合现象:模型在训练集上表现得很好,在验证集或者测试集上表现很差
欠拟合现象:模型在训练集和验证集、测试集上都表现不好
处理过拟合:

  • 获取更多数据或者做尽量剔除outlier:①通常数据越多,数据集分布越接近样本空间的真实分布。如果获取样本困难,可以通过数据合成的方式获取。例如过采样时,对数据加入一个很小的随机干扰。②outlier对模型是无效的,是干扰的,如果能剔除,将对模型有正向的帮助(值得一提的是神经网络中有的时候人为加入噪音以抵消其他部分的噪音)
  • 降低模型复杂度:数据少时,过拟合的主要原因是模型复杂度过高。通常的方法有:特征选择去掉冗杂特征、决策树中剪枝、神经网络中减少神经元个数或层数深圳神经元随机失活等
  • 正则化:权重值的过大容易使模型效果严重偏向于某个特征(相当于独裁),故对特征大小做限制。通常有L1、L2正则。例如Lasso(L1)、岭回归(L2).
  • 集成学习:三个臭皮匠顶一个诸葛亮。通常有blending、stacking(非线性blending)、boosting

处理欠拟合

  • 增加新特征:欠拟合的主因是特征集对数据集的描述能力不够,体现在特征少或者特征与target相关性差。通过特征组合来构造强特征往往能取得较好的效果。
  • 增加模型复杂度:通常简单模型对数据的学习能力较差。例如在数据量不是非常少的情况下,决策桩的学习能力绝对没得三层的决策树好。但建议还是先构造强特征。
  • 降低正则化项的权重。正则化的重要是降低过拟合,与此同时增加了欠拟合的风险。
### 使用 UniApp 开发小记账本应用程序 #### 项目概述 生活记账小程序通过前端 Vue 和 UniApp 设计开发,后端采用 SpringBoot 提供数据接口支持。主要功能模块包括首页展示、分类记账以及微信登录状态管理[^1]。 #### 创建新项目 首先安装 HBuilderX 或者其他 IDE 工具来创建一个新的 UniApp 项目: ```bash npm install -g @dcloudio/uni-cli uni create myAccountBookProject ``` 进入项目目录并初始化必要的配置文件。 #### 配置 App.vue 生命周期函数 为了更好地控制应用生命周期,在 `App.vue` 中定义如下几个重要钩子函数用于处理不同场景下的逻辑操作: - **onLaunch**: 当整个程序启动时调用此方法, 可以在这里做一些全局性的初始化工作. - **onShow**: 页面每次从前台切到后台再返回前台都会触发这个事件, 合适用来刷新某些实时变化的内容. - **onHide**: 对应于当用户点击 Home 键使 APP 进入后台运行模式时执行的动作. 这些设置有助于提升用户体验流畅度和响应速度[^2]. #### 数据绑定与交互实现 确保所有的业务逻辑都放置在 methods 下面,并且避免 data 属性名称同 method 名冲突以免造成不必要的错误;另外注意检查 HTML 标签内部是否存在重复属性声明尤其是集成第三方 UI 组件库 uView-ui 的时候要格外小心[^3]: ```html <template> <!-- 记录条目输入框 --> </template> <script> export default { name: 'RecordEntry', data() { return { recordType: '', amount: null, date: '' } }, methods:{ addNewRecord(){ // 添加新的财务记录... } } } </script> ``` #### 接口对接与缓存机制 对于前后端分离架构的应用来说,合理的 API 路由规划至关重要。这里推荐使用 RESTful 风格的服务端点配合 axios 发起 HTTP 请求完成增删改查等基本 CRUD 功能。与此同时引入 Redis 做为临时存储介质加速频繁访问的数据读取效率降低 MySQL 查询压力。 #### 微信开放能力接入 如果计划让这款理财工具具备社交分享特性,则需按照官方文档指引注册成为微信公众平台开发者账号获得 appid 权限认证之后才能正常使用诸如支付等功能服务。此外还可以考虑加入直播营销插件吸引更多潜在客户群体关注产品动态[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值