USTC-机器学习 | 从表格分类到天气图片,我开始认真怀疑一个漂亮分数

这组机器学习实验让我最不放心的,反而是那些看起来特别漂亮的分数。

表格分类里,模型从一个普通的基线跳到很高的准确率;天气图片里,两个任务的宏平均 F1 也能稳定在九成左右。刚看到结果时,我当然开心,但很快又开始追问:这个提升究竟来自模型能力,还是某个特征偷偷把答案带进来了?一个模型在天气识别上变好时,另一个任务是不是也真的变好了?

仓库地址:USTC-Machine-Learning-Labs

USTC-Machine-Learning-Labs 仓库预览图

一、先在表格数据上分类:一个字段就能让分数突然变好

第一个任务是二分类。开始时我用逻辑回归做基线,先处理缺失值和类别特征,再看模型能不能在不复杂的条件下给出稳定结果。逻辑回归很适合做这个起点:它的决策边界比较直接,特征系数也比树模型更容易解释。

随后我尝试了 CatBoost。它对类别特征和非线性关系更友好,面对特征之间的组合也比线性模型灵活。代码层面看起来只是换了一个分类器,实际训练时,数据预处理、验证划分和评价指标仍然必须保持一致,否则“模型更好”可能只是实验设置变了。

真正让我停下来的是 duration 这个字段。它加入以后,结果明显变得好看;但好看得有点过头,于是我把包含和不包含它的结果放在一起比较:

特征设置逻辑回归CatBoost
包含 duration 0.871894 0.967062
不含 duration 0.693365 0.854018

这个表格很诚实地告诉我,特征比我原来想象得更有力量。CatBoost 在两种设置下都优于逻辑回归,但 duration 的存在让两个模型的分数都上去了,尤其是树模型。

问题在于,duration 到底在什么时候产生?如果它是在事件结束之后才知道的字段,却被拿来预测事件本身,那么这个高分就不能直接解释成模型很强。它可能只是提前看到了未来的一部分。于是我不再只问“这个特征和标签相关吗”,还会问“做预测的那一刻,这个特征真的可用吗”。

二、缺失值不是简单的空白:模型也许能从“缺失这件事”里学习

表格实验里另一个容易被忽略的地方是缺失值。最简单的做法是用均值或众数填上,再把它当成普通数值继续训练。但有时“这个值缺失了”本身就是一种信息:不同类型的样本可能有不同的填写习惯,某个字段缺失也许意味着流程还没有走到那一步。

所以我尝试加入缺失指示变量,让模型同时看到填补后的数值和原始缺失状态。这样做以后,模型不必把所有信息都挤进一个被填补的数字里。对我来说,这一步的意义不在于一定能带来多少分,而在于它让我开始把数据生成过程也纳入实验。

我还会把训练集和验证集的处理过程分开看。填补规则、编码映射和归一化参数应该从训练数据中得到,再应用到验证或测试数据。否则预处理也可能把验证集的信息悄悄带回训练阶段。

三、从表格换到天气图片:同一张图,两个问题

第二个任务从表格变成了天气图片,而且不是只判断一个标签。模型需要同时预测天气类别和时间段类别。看起来都是分类,实际上两个目标关注的线索可能不同:天气更依赖云层、光照和场景外观,时间段则可能更多依赖亮度、阴影和整体色调。

我先用 ResNet18 做基线。共享的图像特征可以同时服务两个任务,但最后的判断不能简单混成一个标签。训练时,两个任务的损失需要一起参与优化,评价时也要分别看 weather 和 period,不能只拿一个总分掩盖其中一个任务的退化。

ResNet18 基线的宏平均 F1 记录为:

任务Macro-F1
weather 0.9722
period 0.8838
平均 0.9280

第一眼看,weather 已经相当高,period 则更难一些。这很符合我在错误样本里看到的感觉:有些天气类别外观差异明显,但清晨、白天、傍晚之间的边界没有那么干净,光线变化会让模型犹豫。

四、ResNet34 并没有让所有数字都一起上涨

进阶实验换成了更深的 ResNet34,并调整了训练设置。深一点的网络有更强的表达能力,但它不是一个“所有指标自动加分”的开关。更大的模型也更容易受到数据量、增强策略和训练轮数的影响。

这次记录的结果是:

模型weather Macro-F1period Macro-F1平均
ResNet18 基线 0.9722 0.8838 0.9280
ResNet34 进阶 0.9599 0.8969 0.9284

很有意思:weather 从 0.9722 降到了 0.9599,period 从 0.8838 升到了 0.8969,最后的平均值只从 0.9280 变成 0.9284。若只看平均分,可以说进阶模型略好;若把两个任务拆开看,就会发现它是在用一部分 weather 表现换 period 表现。

这也是多任务学习让我最有感觉的一点。共享特征并不代表所有任务的目标完全一致。一个任务需要的表示可能会帮助另一个任务,也可能互相竞争。损失权重、采样方式和数据增强都会影响这种平衡。

五、我开始认真看混淆矩阵和错误图片

以前做分类实验时,我习惯先看一个 accuracy 或 F1,然后把结果填进表格。这次我会多停留一会儿,看模型到底错在什么地方。

表格分类里,我会看错误样本是否集中在某种缺失模式、某些类别组合或数值范围。图片分类里,我更关注模型把哪些天气混在一起,以及 period 错误是不是集中在光照过渡明显的图片。宏平均 F1 对小类别更敏感,它不会让一个大类的高分轻易遮住小类的糟糕表现。

有时一张图片的标签对人来说也不完全明确。天空被云遮住,地面光线又接近傍晚,模型在两个类别之间摇摆并不一定说明网络写错了。错误样本让我看到,数据标注本身也有边界,模型分数不应该被解释得比数据更确定。

六、漂亮分数背后,最该问的三个问题

第一,特征在预测时是否可用。尤其是 duration 这种强特征,必须确认它的产生时间,不能因为验证集分数高就直接把它当作有效信息。

第二,比较是否公平。基线和进阶模型应该使用相同的数据划分、相同的评价方式,并且尽量保留训练日志。只换模型、不说明其他设置,最后的提升很难归因。

第三,平均值是否遮住了局部变化。多任务学习里,平均 F1 可能几乎不变,但两个子任务已经一升一降。把指标拆开,才知道模型究竟帮助了谁。

这三个问题听起来并不高级,却是我在实验后半段越来越频繁写在笔记旁边的提醒。机器学习不只是让分数变大,也是在确认这个分数到底有没有资格被相信。

七、从“调出高分”到“解释高分”

这个仓库里有两类任务:一个在表格里判断类别,一个在图片里同时判断天气和时间段。它们让我分别碰到了特征可用性、缺失模式、多任务冲突和评价指标拆分。

如果重新做一次,我会把 duration 的时间边界写得更明确,补充更多不含强特征的对照实验;图像任务则会增加不同损失权重和数据增强组合的记录,并保存更多错误样本。这样最后的模型也许没有那么“漂亮”,但我会更清楚它为什么得到这个结果。

仓库地址:USTC-Machine-Learning-Labs

说明:本文根据个人历史课程实验和公开仓库整理,部分文字经过 AI 辅助润色;文中指标属于历史实验记录,具体结果会受数据划分、随机种子、特征可用性和依赖版本影响。课程资料仅用于学习回顾和个人作品整理,不用于当前课程作业或考试。

posted @ 2026-09-11 00:45  何以牵尘  阅读(5)  评论(0)    收藏  举报