【机器学习实战复盘】这一个多月的踩坑与知识重构:从树模型到神经网络底层
2026/7/23 10:23:04 网站建设 项目流程

【机器学习实战复盘】这一个多月的踩坑与知识重构:从树模型到神经网络底层

这一个多月里,我们在组会上进行了多次密集汇报,从加州房价、泰坦尼克号等经典表格数据,一路打怪升级到图像分类(CNN)和文本生成(RNN)。今天借着这篇博客,和大家一起把这期间的知识点、踩过的坑以及优化思路做个系统的巩固。

一、 树模型的“伪高分”陷阱与样本权重分配

在处理表格类数据时,基于 Boosting 思想的 XGBoost 和传统的随机森林(RF)、决策树(CART)是我们最常用的基线模型。在泰坦尼克号生存预测实验中,单决策树(CART)在默认参数下拿到了 80.45% 的准确率,而引入了串行集成、不断通过残差纠错的 GBDT 则直接将成绩提升到了 81.01%。

踩坑点1:超参数互锁与欠拟合在给 GBDT 做网格搜索调参时,本来期望成绩能进一步提升,结果准确率反而掉到了 78.79%。深度复盘后发现,这是评估口径和参数恶性互锁共同导致的。系统给出的最优组合是learning_rate=0.5搭配n_estimators=60,再加上 2折交叉验证导致每次只有 50% 数据参与训练,在小样本场景下模型根本没法充分拟合。后续的改进策略是:把交叉验证固定在 5 折(cv=5),将学习率压低到 0.05-0.1 之间,同时把弱学习器数量放宽到 100-300 棵,让模型有充足的时间收敛。

踩坑点2:数据长尾分布下的参数失效在红酒品质分类(连续标签减 3 平移对齐到 0-5 分类)实验中,模型跑出了 71.25% 的整体准确率。但查看详细指标时却让人大跌眼镜:少数类的 F1-Score 直接挂零,模型退化成了只认识多数类的“伪高分分类器”。排查代码发现了一个极度低级却致命的失误:代码里虽然用compute_sample_weight计算了权重,但实际fit()训练时根本没传给模型! 针对这种极端类别不平衡,仅仅调参是不够的,必须三管齐下:

  1. 算法层:网格搜索的评估指标从默认的accuracy替换为f1_macro,引导模型关注少数类。
  2. 模型层:显式传入sample_weight,赋予少数类更高的惩罚权重。
  3. 数据层:在训练集引入 SMOTE 算法进行合成过采样。

二、 神经网络的进阶:从“乱撞墙”到“拓宽视野”

进入深度学习阶段后,我开始接触多层感知机(MLP)和卷积神经网络(CNN)。

现象1:学习率与梯度震荡在 MNIST 手写数字识别中,我搭建了一个三层全连接网络,将 28x28 像素矩阵展平为 784 维向量,隐藏层设为 128 和 64。非常有意思的是,模型第一次前向传播的初始 Loss 为 2.2968,这完美契合了 10 分类盲猜状态下的数学负对数期望(2.3025),证明了底层逻辑毫无偏差。 但在训练后期,模型准确率出现反弹和疯狂震荡,原因是 Adam 优化器0.01的步长在井底来回撞墙。严格遵循控制变量法,我仅仅把学习率降到0.001,局面瞬间稳住,测试集准确率直接飙升到了 97.5% 附近。

现象2:模型太“窄”导致特征丢失然而,单纯调低学习率并不是万能解药。在 CIFAR-10 图像分类实验中,盲目调低学习率反而让准确率掉到了 51.5%(因为模型走得太慢无法收敛)。经过几组对比实验,我发现核心瓶颈在于模型结构太窄,漏掉了大量的局部特征。当我保持其他参数不动,将第一层卷积通道从 6 增加到 16,第二层从 16 增加到 32 后,测试集准确率直接拉升了将近 6 个百分点,达到 64.2%。

这说明面对复杂的图像或者特征维度(比如之前的手机参数四分类任务,我将 20 维特征进行均值规范化后送入全连接层,尽管加了 BatchNorm 和 Dropout,准确率依然卡在 76.25%),引入具有局部过滤能力的 CNN 扩大感受野才是硬道理。具体大家可以参考我总结的这几个文件表格,里面记录了详实的调参过程:ANN手机价格分类对别优化前后.xlsx机器学习本周学习计划表(7.5-7.11).xlsx

三、 RNN 序列生成与“复读机”魔咒

自然语言处理又是另外一番天地。我用 Jieba 分词和滑动窗口对齐(输入前 32 个词,预测后一个词)处理了周杰伦的歌词文本,通过 Embedding 层将 5000 多个高频词映射到稠密空间,送入 RNN 网络。 结果在推理预测时,出现了一个极其经典的现象:给个种子词“星星”,模型前十几个字生成的歌词意境绝佳,非常有周董的味道,但往后就开始陷入“复读机”模式,语义完全错乱。这生动地向我展示了标准 RNN 模型在长序列反向传播时的严重缺陷——梯度消失。由于状态矩阵连乘,长久记忆断裂,模型实质上只能记住最近的几个词。

总结:基础不牢,地动山摇

就像导师在组会上敲黑板强调的一样:“不要盲目追求前沿的高大上模型,选对合适的架构比堆叠黑盒强得多”。传统的线性回归在某些特征单纯的数据上,甚至能把复杂的神经网络秒杀。

现阶段,我会听从老师的建议暂缓 NLP,先把神经网络的前向/反向传播、链式求导、激活函数(比如 ReLU 如何用非0即1解决 Sigmoid 的梯度消失)等底层数学原理手动推导一遍。底子厚了,以后再去冲时间序列和前沿的 Transformer 才不会虚。

如果你也在做相关方向的实战,或者需要这部分底层推导逻辑的探讨,欢迎在评论区留言交流!在工程落地部署方面,大家也可以交流下import joblib # 保存和加载模型_import numpy as np_impor....xlsx的使用心得。我们下期见!

这是一份为您整理好的补充内容,采用了 CSDN 支持的 Markdown 格式,包含数学公式与底层逻辑拆解,您可以直接复制并粘贴到上一篇博客的末尾作为“附录”或“进阶阅读”部分。

附录:核心知识点深度拆解与数学推导 (加深记忆版)

为了把这一个多月踩过的坑彻底填平,我把上述实战中涉及的核心底层原理做了一个系统的分支梳理,作为自己的学习笔记,也希望能帮到大家。

1. 树模型的极限与类别不平衡底层逻辑

1.1 GBDT 为什么需要限制深度与学习率?

传统决策树(CART)在拟合时是在整棵树上做贪心分裂,容易过拟合。而 GBDT(梯度提升决策树)的核心思想是加法模型,它不是去直接拟合真实标签YYY,而是让下一棵树去拟合上一棵树的负梯度(残差)

  • 学习率(Shrinkage)的作用:如果我们让每棵树完全去填补残差(学习率=1),模型很快就会在训练集上达到完美,但会丧失泛化能力。加入极小的学习率(如 0.05),意味着每棵树只向着目标迈出一小步(Fm(x)=Fm−1(x)+ν⋅hm(x)F_m(x) = F_{m-1}(x) + \nu \cdot h_m(x)Fm(x)=Fm1(x)+νhm(x)),给后续的树留出空间,因此需要搭配更多的基学习器(n_estimators增大)。

1.2 处理极端不平衡:样本权重与 SMOTE

在红酒品质(多数类碾压少数类)实验中,模型只预测多数类也能获得高“Accuracy”。

  • sample_weight的数学本质:在计算交叉熵损失或基尼不纯度时,默认每个样本的贡献度是 1。传入样本权重后,损失函数变为Loss=∑i=1Nwi⋅L(yi,y^i)Loss = \sum_{i=1}^{N} w_i \cdot L(y_i, \hat{y}_i)Loss=i=1NwiL(yi,y^i)。少数类的wiw_iwi被放大,模型一旦错判少数类,就会产生巨大的 Loss 惩罚,从而逼迫梯度更新向少数类倾斜。
  • SMOTE 的插值原理:不同于简单的复制样本,SMOTE 算法是在少数类样本与其 K 近邻之间进行线性插值生成新样本:xnew=xi+rand(0,1)×(xneighbor−xi)x_{new} = x_i + rand(0,1) \times (x_{neighbor} - x_i)xnew=xi+rand(0,1)×(xneighborxi)。这不仅增加了数量,还扩大了少数类在特征空间中的决策边界。

2. 神经网络初始状态与梯度震荡之谜

2.1 初始 Loss = 2.2968 的数学玄机

在 MNIST 的 10 分类任务中,模型未经训练时的权重是随机初始化的。此时对任何一张图片,模型预测每个类别的概率ppp都约为110=0.1\frac{1}{10} = 0.1101=0.1

根据多分类交叉熵损失函数(Cross-Entropy)公式:

由于只有一个真实标签yi=1y_i = 1yi=1,其余为 0,公式简化为:

实测的 2.2968 完美印证了这一底层数学期望,说明网络前向传播逻辑完全正确。

2.2 Adam 优化器与学习率撞墙

Adam 结合了动量(Momentum)和自适应学习率(RMSProp)。如果在训练后期学习率(如 0.01)过大,权重的更新步幅会超过极小值点的峡谷宽度,导致 Loss 在最优解附近不断越过谷底,来回弹射震荡。将学习率降到 0.001,相当于让步伐变碎,模型才能平稳滑落到全局/局部最优解。

3. CNN 的通道(Channel)扩展与感受野

在 CIFAR-10 图像分类中,单纯加深全连接层无法解决特征提取问题。

  • 感受野(Receptive Field):全连接层(MLP)将图像展平为一维向量,彻底破坏了像素间的二维空间依赖。卷积核(如 3x3)则是一个局部扫描仪。
  • 为什么要把通道从 6 扩展到 16,再到 32?:在 CNN 中,浅层网络的每个通道负责提取低级特征(如边缘、颜色斑块)。随着网络加深,将通道数翻倍,是为了让模型在更小的特征图上,组合出更丰富的高级语义特征(如车轮、猫耳朵)。如果通道太窄(比如只有 6),就如同管道太细,大量有效特征在向前向传播时被强行丢弃了(信息瓶颈)。

4. RNN 的“复读机”魔咒与梯度消失

4.1 为什么会变成复读机?

在预测周杰伦歌词时,模型后期生成语义错乱并不断重复。这是因为模型丧失了“长程记忆”,退化成了只根据前 1~2 个字来预测下一个字的马尔可夫链。由于高频词汇在训练集里频繁成对出现,模型只能在局部概率里“打转”。

4.2 随时间反向传播(BPTT)与梯度消失矩阵求导

在 RNN 中,隐藏层状态hth_tht依赖于前一时刻的ht−1h_{t-1}ht1。在反向传播求导时,根据链式法则,需要对不同时间步的权重矩阵连乘:

每一次求导都包含一个权重矩阵WWW和激活函数的导数。如果权重矩阵的最大特征值小于 1,或者激活函数导数小于 1,连乘十几次之后,早期的梯度就会指数级衰减趋近于 0(梯度消失)。这就导致模型根本无法根据前 32 个词的开篇来调整当前的权重。

5. 激活函数的破局:从 Sigmoid 到 ReLU

为了解决梯度消失,神经网络底层数学做了一次重大升级:

  • Sigmoid 的致命伤:其导数f′(x)=f(x)(1−f(x))f'(x) = f(x)(1-f(x))f(x)=f(x)(1f(x))的最大值只有 0.25。这意味着在链式求导中,每经过一层,梯度至少要缩小 4 倍。深层网络根本传不回梯度。

  • ReLU 的暴力美学:函数表达式为f(x)=max⁡(0,x)f(x) = \max(0, x)f(x)=max(0,x)。在x>0x > 0x>0的区间内,其导数恒等于 1。

ReLU 的暴力美学:函数表达式为f(x)=max⁡(0,x)f(x) = \max(0, x)f(x)=max(0,x)。在x>0x > 0x>0的区间内,其导数恒等于 1。

[外链图片转存中…(img-W8yMdErr-1784706527002)]

这意味着只要神经元被激活,梯度在反向传播时遇到 ReLU 就原封不动地传给上一层(乘以 1),彻底解决了多层网络连乘导致的梯度消失问题,这也是现代深度学习能够堆叠上百层的核心基石。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询