资讯动态

回归当分类训了三天,loss狂跌上线指标崩了:补完人工智能基础才止血

发布时间:2026/9/10 0:07:40 来源:尧图企业网站定制
回归当分类训了三天,loss狂跌上线指标崩了:补完人工智能基础才止血发版前两天,业务方直接把电话打到我工位上:「你们那个房价预测模型,昨天估出来的三居室比市场价高了150万,客户在签约室当场摔了合同。」我打开监控一看,训练loss曲线优雅地下滑到了0.008,但线上的平均绝对误差(MAE)直接飙到287万。那一刻我才意识到,自己把整个问题从头定义错了。这事的起因说出来惭愧--我当时刚接手一个二手房估价项目,数据结构是一堆特征(面积、楼层、学区)和对应的成交价。我下意识就把它当成了一个多分类问题:把价格分桶,让模型去预测属于哪个区间。于是顺手搭了个三层全连接,输出10个类别,损失函数选了CrossEntropyLoss。训练的时候看着loss一直往下掉,心里还挺美,以为这个「人工智能」项目能提前交付。如果你也正在用人工智能入门课程里的例子做真实项目,很容易像我一样掉进这个坑--把回归硬套成分类,直到线上数据打脸才明白任务类型的选择有多致命。为什么我会觉得「loss在降就对了」刚开始搞机器学习那阵子,我对评估的理解特别粗暴:loss往下走模型在变好。那门「机器学习入门」的教程里确实讲过,训练过程中的损失函数值反映了模型预测与真实标签的差距,但没人告诉我,当任务类型选错的时候,loss完全可以变成一张骗人的面具。我当时的想法:把价格离散化成分段区间,输出10个类别的概率,最后取argmax作为预测区间,再去映射回中位价,不也挺合理吗?连续值被强行切碎之后我把500万以内的成交价切成10段,每段50万。模型在训练集上的「准确率」达到了92%,但那个准确率是:只要预测区间与实际价格落在同一段就算对。可实际业务要的是精确数字,不是「差不多在200到250万之间」这种含糊结果。特征工程这一步我也偷了懒。面积用原始值、楼层用楼层总数做归一化,但学区被我用one-hot编码成了20维稀疏向量,根本没考虑不同学区之间的价格梯度信息。后来看「机器学习基础」课程里专门有一节讲连续特征的处理与分桶陷阱,我才明白自己把关键信息全扔掉了。如果你在做特征工程时对连续值、类别值的处理模棱两可,那门课程里从特征存储到数据预处理的完整管线真的能帮你避开这种灾难性设计。损失函数那张底牌被我完全忽略CrossEntropyLoss在意的是类别概率分布的对数似然,它根本不在乎预测值离真实价格有多远。举个例子,真实价格是320万,模型预测出「300-350万」区间的概率是0.8,即使最终映射出的中位价325万还算接近,但如果这个区间里所有点都映射到同一个值,loss的计算只关心那个0.8的置信度,完全看不出价格偏移。这就像你去医院看病,医生说你「大概率没得癌症」,但你其实得的是轻微胃炎--置信度很高,诊断方向全错。我后来在「人工智能入门」中学到一个特别关键的概念:评估指标必须与业务目标一致。回归问题就要用MAE、MSE、RMSE这些能反映数值偏差的指标;分类问题才看准确率、精确率、召回率。如果你连这个都没搞清楚就上手训练,哪怕用了最先进的深度学习框架也是白搭。那门课用极其直观的图表对比了不同指标在典型场景下的表现,学完之后我再也没犯过把「准确率」贴在回归任务上的蠢事。修复过程:拆掉重来,从「管道」做起出问题当天下午,我把之前的训练脚本全部作废,重新梳理了整套机器学习管道。正好之前断断续续看过「亚马逊云科技机器学习」的一些文档,知道做项目不是上来就搭网络,而是数据预处理 → 特征工程 → 模型选择 → 训练 → 评估 → 上线监控六步缺一不可。第一步:重新定义输入输出我把价格恢复为连续数值,输出层改成1个神经元,激活函数用linear。损失函数换成HuberLoss,因为它对离群值不那么敏感--二手房数据里有不少上亿的别墅,用MSE会让模型过分讨好那些极端值。import torch import torch.nn as nn # 错误的分类头(弃用) # self.classifier nn.Linear(128, 10) # loss_fn nn.CrossEntropyLoss() # 正确的回归头 self.regressor nn.Sequential( nn.Linear(128, 64), nn.ReLU(), nn.Dropout(0.2), nn.Linear(64, 1) # 输出连续价格 ) loss_fn nn.HuberLoss(delta50.0) # 50万以内的误差线性,之外的平方第二步:特征工程重做学区不再是one-hot,而是用对应学区近三个月历史成交均价作为连续特征;面积做了对数变换缓解右偏;楼层改为「楼层与总楼层比」并和朝向做了一个组合特征。这些手段都是我在「机器学习基础」里学到的,那门课把数据预处理、特征存储、数据漂移这些概念串成了一条线,看完之后感觉自己之前一直在盲人摸象。第三步:评估指标换成MAE和R2训练时每个epoch结束后都在验证集上计算MAE,不再看那个欺骗性的loss数字。真正让我服气的是,我把同样的数据用回归模型跑了一晚,次日的MAE降到了18.7万--比之前那个分类的伪92%准确率靠谱得多。from sklearn.metrics import mean_absolute_error, r2_score def evaluate(model, loader): model.eval() preds, trues [], [] with torch.no_grad(): for X, y in loader: out model(X) preds.append(out.cpu().numpy()) trues.append(y.cpu().numpy()) preds np.concatenate(preds) trues np.concatenate(trues) mae mean_absolute_error(trues, preds) r2 r2_score(trues, preds) print(fMAE: {mae:.2f}万, R2: {r2:.3f}) return mae, r2我从「混淆矩阵」里发现的第二个大坑虽然问题已经定位到任务类型,但排查过程中还碰到了一个更隐蔽的坑:混淆矩阵。我用原来那套分桶方案的预测结果和真实桶画了一个10×10的混淆矩阵,对角线上的数值确实很高,但不在对角线上的那些误分类,对应的价格偏差都是几十上百万。比如真实是「200-250万」区间,被误判到「300-350万」,这一个跳跃就是100万的误差,但混淆矩阵只会把那一个格子标记为1,不会告诉你偏差幅度。这就是为什么混淆矩阵对回归问题毫无意义--它只在乎类别是否一致,不在乎偏离的程度。那门「人工智能」课程里专门有一章叫「模型评估与诊断」,把过拟合、欠拟合、混淆矩阵、ROC曲线、回归指标等概念掰开揉碎讲了一遍。我以前总觉得这些指标是面试八股文,真正被业务方指着鼻子骂的时候才意识到,不懂这些连为什么错都解释不清楚。如果你想系统建立人工智能项目的评估思维习惯,这门课非常适合花一个周末通读,学完你会发现调试模型的时间至少缩短一半。现在回看:如果早一点把「基础」补牢如果我能在做这个项目之前,先把「人工智能入门」和「机器学习基础」两门课老老实实过一遍,至少能避开三个致命错误:任务类型判断:看到数值型目标先问自己,是连续预测还是离散判别?损失函数选择:回归至少试MSE、MAE、Huber;分类才考虑交叉熵。评估指标与业务对齐:卖房子要的是价格误差,不是分类命中率。「AWS机器学习」的学习路径设计得很有层次:先从「人工智能入门」建立对整个领域的概念地图,再通过「机器学习入门」掌握建模全流程,最后才是「深度学习入门」去搞复杂的神经网络。我之前就是跳过前两步直接干到第三步,结果连机器学习管道的正规流程都没搞清楚,上线就翻车。# 训练脚本中的检查点监控,避免再次被loss迷惑 for epoch in range(epochs): model.train() for Xb, yb in train_loader: pred model(Xb) loss loss_fn(pred, yb) optimizer.zero_grad() loss.backward() optimizer.step() # 每个epoch后必须同时看验证集的业务指标 train_mae, _ evaluate(model, train_loader) val_mae, val_r2 evaluate(model, val_loader) print(fEpoch {epoch}: train_mae{train_mae:.2f}, val_mae{val_mae:.2f}, val_r2{val_r2:.3f}) # 如果验证MAE连续3轮不降,提前终止 if early_stop(val_mae): break给同样在「回归还分类」上翻过车的人接到新需求先画目标变量分布图:是连续的就按回归走,别自作聪明分桶。「人工智能入门」这门课里有张任务类型决策树,把回归、分类、聚类、推荐分别对应到典型业务场景,我后来把它打印出来贴在工位上,每次新项目都先过一遍--值得点进去看看原图。评估指标不能只盯着一个:回归至少看MAE、R2、残差分布;分类不能只看准确率,尤其样本不平衡时要加上精确率、召回率。这些在「机器学习基础」里讲得特别透彻。特征工程不要敷衍:one-hot不是万能药,连续值分桶要先做相关性分析;「AWS基础知识」那门课里介绍了特征存储的概念,能把特征复用和版本管理做起来,而不是每次都重新写脚本。上线前必须用独立测试集跑一遍业务指标,而不是看训练loss。如果你的老板问你「人工智能项目为啥效果这么差」,别像我当初一样支支吾吾,带着这套检查清单去对答。那次房价预测翻车之后,我花了两周把「人工智能」和「机器学习基础」两门课的系统学习路径走了一遍,最大的感受是:理论不是用来面试的,是真的能在你掉进数据沼泽时扔过来一根绳子。现在再接到一个AI需求,我已经能下意识地判断该走回归还是分类、选什么损失函数、用哪些指标向上汇报。这感觉,比起当初看着loss傻乐,踏实太多了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价