机器学习 性能度量

该文章内容旨在通过机器学习课程进行读书笔记以提高对课程内容的理解。如内容有误,请指正,谢谢!

以下部分图片及文字内容来源于:

《机器学习》(周志华,清华大学出版社)

《机器学习初步(2025春)》、《机器学习进步(2025春)》——学堂在线APP


性能度量

性能度量是衡量模型泛化能力的评价标准,匝它反映了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果。

以下是对分类任务中常用的性能度量进行解释。

1.错误率与精度

分类任务中最常见的两种性能度量是错误率和精度。在m个样本中有a个样本分类错误,错误率E=a/m,1-a/m则称之为精度。

2.查准率、查全率与F1

在遇到更多种任务时,错误率和精度并不能很好地去胜任。比如“所有合格的零件在所有零件里面被挑出来的有多少”,“选出来的零件里面有多少是合格的”。对于二分类问题,可以把样例根据真实情况和学习期预测的类别组合在一起,并将它们划分为四种情形:“真正例(true positive)、假反例(false negative)、假正例(false positive)、真反例(true negative)”。样例总数= TP + FN + FP + TN。下表为分类结果的“混淆矩阵”。

查准率=预测和真实相符 / 所有预测为正

查全率=预测和真实相符 / 所有真实为正

 根据学习器的预测结果按照正例可能性大小的顺序对样例进行排序,并诸葛把样本作为正例进行预测,则每次可以计算出当前的查全率和查准率。以查准率作为纵轴,查全率作为横轴,就得到了查准率-查全率曲线,即“P-R曲线”,以下为P-R曲线图示意图。

 A、B、C分别对应一种算法。

从上图我们可以得知,学习器A性能优于学习器C,学习器B优于学习器C,但学习器AS和学习器B我们并不能直接判断出谁的性能更好,只能说在某种需求下学习器A的性能优于学习器B,学习器B也有可能在别的情况下性能优于学习器A。

但是,实际上的P-R图并不像图示所给的那么美观那么平滑,图像是有很多折线的。以下借用周老师在《机器学习进步(2025春)》视频里面的例子进行解读。

 

 在上图中,图形的位置越靠近左边代表着算法觉得作为正例的可能性越大,反之可能性越小,但实际上正方形代表真实情况的正例,而三角形代表反例。我们需要根据实际需求在图上进行划分,来得出查准率和查全率的值。划分位置的左右边分别表示预测结果的正反例。

 例如,上图中,我们可以得出预测结果为正例的有2,反例是4,真实情况的正例和反例都是3。预测结果和实际情况相符的,即预测结果和真实情况都是正例的为1。

由此,可以计算出查准率=1/2,查全率=1/3。

再回到P-R图中,当查准率=查全率时的取值,会出现新的度量“平衡点(BEP)”。

相对比较简化的平衡点来说,我们更常用的是F1度量:

F1度量的一般形式:

 当β=1时,则是标准的F1,当β<1时查准率有更大影响,当β>1时查全率有更大影响。

当我们有n个二分类混淆矩阵时,又如何计算出查准率和查全率,以下介绍两种做法。

第一种做法是在每个混淆矩阵上分别计算出P和R,再计算平均值,得到的值称为“宏查准率(macro-P)”、“宏查全率(macro-R)”,接着将得出的平均值代入上面的F1中,我们就得到了“宏F1(macro-F1)”。

另外一种做法时将各个混淆矩阵的对应元素进行平均,得到TP、TN、FP、FN的平均值,再基于这些计算出新的P、R,分别是“微查准率(micro-P)”、“微查全率(micro-R)”,再带入F1当中,得到“微F1(micro-F1)”。

 

### PyCharm 打开文件显示全的解决方案 当遇到PyCharm打开文件显示全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值