016、机器学习基础:模型、训练与评估方法论

张开发
2026/4/20 16:54:00 15 分钟阅读

分享文章

016、机器学习基础:模型、训练与评估方法论
从一次调试说起帮同事看一个图像分类项目测试集准确率卡在 92% 死活上不去。他反复调整网络层数、换优化器、甚至试了数据增强效果都不明显。最后我让他把训练集和验证集的 loss 曲线打出来——两条线早早就分道扬镳验证集 loss 从第 5 个 epoch 就开始往上飘。他盯着屏幕愣了半天“我早看到过这图以为只是随机波动。”这个场景太典型了。很多工程师把机器学习当成“调参炼金术”却忽略了背后那套基础的方法论。今天我们就拆开看看模型、训练、评估这三个环节到底该怎么系统化地思考。模型不只是选个算法那么简单选模型的时候新手常犯两个错误要么盲目追新非 Transformer 不用要么死守老方法觉得“线性回归足够简单稳定”。其实模型选择是道平衡题复杂度、可解释性、计算开销、数据规模这几个因素得一起掂量。# 举个简单的例子选分类模型fromsklearn.linear_modelimportLogisticRegressionfromsklearn.ensembleimportRandomForestClassifier# 小数据集几千条且特征不多时逻辑回归其实很能打# 别一上来就搞深度学习训练慢还容易过拟合model_lrLogisticRegression(max_iter1000)# 记得调大迭代次数默认值经常不够用# 数据量上去后几万条随机森林往往更稳# 但特征维度太高时比如几万维内存可能扛不住model_rfRandomForestClassifier(n_estimators100,n_jobs-1)# n_jobs-1 用上所有CPU核心模型本身的结构参数也值得琢磨。比如全连接层的神经元数量我习惯从特征数量的 1/2 到 2 倍之间开始试。别拍脑袋设个 1024参数量爆炸不说梯度回传还容易出问题。训练loss 下降不等于模型在学好训练过程中最骗人的就是 loss 曲线平稳下降。有一次我做时序预测训练 loss 一路降到接近 0高兴了不到三分钟发现模型把所有值都预测成了常数——它只是学会了忽略输入特征。# 监控训练时的关键指标historymodel.fit(X_train,y_train,validation_split0.2,# 一定留出验证集否则你不知道模型泛化能力batch_size32,# batch 大小别瞎设一般从 32 开始试epochs50,verbose1,callbacks[EarlyStopping(patience10),# 早停必备防过拟合的利器ReduceLROnPlateau(factor0.5,patience5)# 学习率自适应调整])# 画图看趋势别只看最后数字plt.plot(history.history[loss],labeltrain)plt.plot(history.history[val_loss],labelval)# 关键在这条线plt.legend()# 如果两条线差距越来越大赶紧停别硬训学习率设置是门玄学。我的经验是先用一个 epoch 做学习率扫描learning rate range test找到 loss 开始下降的那个拐点再取略小于它的值作为初始学习率。Adam 优化器的默认学习率 1e-3 对很多任务来说其实偏大试试 3e-4 或 1e-4 可能更稳。评估准确率 99% 的模型可能毫无用处评估环节的坑最多。分类任务只看准确率结果发现数据集 90% 都是负样本回归任务盯着 MSE实际业务更关心极端值的预测能力。评估必须和业务目标对齐。fromsklearn.metricsimportclassification_report,confusion_matrix# 分类任务别只看 accuracyy_predmodel.predict(X_test)print(classification_report(y_test,y_pred))# 看 precision/recall/f1print(confusion_matrix(y_test,y_pred))# 看错在哪了# 特别警惕类别不平衡的情况# 如果正样本只有 1%模型全预测负也能有 99% 准确率# 这时候得看 AUC-ROC 或者 PR 曲线交叉验证要做但别机械地做。时间序列数据不能随机 shuffle得用滚动窗口或者时间序列交叉验证。数据有分组效应时比如同一个患者多次采样要按组划分确保同一组的数据不会同时出现在训练集和测试集里。一些实战中的碎碎念数据质量大于一切花 80% 时间清洗和探索数据比换模型管用得多。缺失值、异常值、分布漂移这些才是真实项目里的主要敌人。从简单模型开始先跑个线性模型或决策树把它作为 baseline。后续复杂模型的提升如果不超过 3-5 个百分点得想想是否值得上线。评估指标要早定项目启动前就和业务方确认清楚我们到底要优化什么是召回率还是精确度是 MAE 还是 99 分位误差别等到模型训练完了再扯皮。留一份真正的测试集验证集用来调参测试集只在最后用一次。最好能把测试集锁在另一个目录里防止手滑不小心用到训练中。记录每一次实验哪怕只是改了个随机种子也要记下参数和结果。三个月后你肯定想不起来为什么当时选了 0.001 的学习率。机器学习项目很少有“一招制胜”的神奇操作更多是靠扎实的方法论和细致的实验推进。下次看到 loss 曲线不对劲时先别急着调参停下来想想是数据问题、模型问题还是评估方式有问题这三者的平衡才是工程实践里的真功夫。

更多文章