跳至内容

机器学习常见问题

一些常见问题

  • 机器学习
  • 模型评估
  • 集成学习
  • XGBoost
  • 支持向量机
  • 逻辑回归

训练与调参

1. 如何处理类别不平衡?

常用办法是重采样、类别加权和调整分类阈值。评估时不能只看准确率,还要看精确率、召回率和 PR 曲线。

  • 随机过采样:重复抽取少数类样本,增加它们参与训练的次数;可能过拟合,没有增加新信息。
  • 随机欠采样:减少多数类样本,缩短训练时间;可能丢失多数类的重要信息。
  • 类别加权:提高少数类错误在损失中的权重,让模型更重视这类样本。
  • 调整阈值:降低正类判定阈值,通常能找回更多正例,也可能增加误报。

采样和类别加权改变训练,阈值调整改变最终分类结果。 选择哪种办法,取决于更在意漏报还是误报,不必把类别比例强行补到 1∶1。

重采样只用于训练集,交叉验证时也要在各训练部分单独进行;验证集和测试集保留目标场景的类别比例。

2. 超参数调优有哪些方法?

  • 网格搜索:逐一尝试预设组合。 例如 3 种树深度、2 种学习率,共训练 6 组;参数多时,组合数增长很快。
  • 随机搜索:从给定范围随机抽取组合。 用试验次数控制开销,适合先探索较大的参数范围。
  • 贝叶斯优化:根据已有结果选择下一组参数。 在可能得高分的位置和仍不确定的位置之间权衡,适合单次训练较贵的情况。

交叉验证负责评价参数,搜索方法负责选择参数。 三种搜索都可以配合交叉验证,比较时应使用相同的数据划分和指标。

3. 以 XGBoost 为例,怎样安排调参流程?

建议按建立基线 → 调整树复杂度 → 调整采样 → 联合选择学习率和轮数的顺序进行,过程中固定数据划分和评价指标。

  1. 建立基线:记录训练与验证表现。训练也差,检查特征和训练是否充分;训练好、验证差,检查过拟合或数据分布差异。
  2. 调整树复杂度:减小 max_depth、增大 min_child_weight、gamma 或正则化强度,可以抑制过拟合;限制过强也会欠拟合。
  3. 调整采样:用 subsample 控制样本比例,colsample_bytree 控制每棵树的特征比例;比例过低可能丢失有效信息。
  4. 选择学习率和轮数:较小的学习率通常需要更多轮训练,用验证集早停确定合适轮数,再复核较好的参数组合。

min_child_weight 限制的是子节点内损失二阶导数之和,通常不等于最少样本数。

参数之间存在相互影响,以上是可用顺序,不是固定规则。测试集不参与调参或早停。

模型比较

4. 逻辑回归与线性回归有哪些联系和区别?

线性回归预测连续数值,逻辑回归预测类别概率,用于分类。

线性回归和都先计算线性得分 s=w⊤x+bs=w^\top x+b。

  • 线性回归:直接输出 ss,例如预测价格;常用平方误差损失。

  • 二分类逻辑回归:用 sigmoid 将 ss 转成正类概率,再按阈值分类,常用交叉熵损失。

    Sigmoid 函数: p=11+e−s\displaystyle p=\frac{1}{1+e^{-s}}

同样得到得分 2,线性回归输出数值 2;逻辑回归得到约 0.88 的正类概率,阈值为 0.5 时判为正类。

两者各自按损失函数训练,逻辑回归无需先训练一个线性回归模型。

5. 逻辑回归与 SVM 有哪些联系和区别?

LR 关注类别概率,SVM 关注分类间隔。 LR 希望真实类别的概率更高;软间隔 SVM 希望样本分对,并与边界保持足够距离。

两者都是监督学习中的判别模型。普通 LR 与线性 SVM 都学习线性分类边界,主要区别如下:

比较项逻辑回归线性 SVM
损失函数交叉熵:真实类别概率越低,惩罚越大hinge 或 squared hinge:误分类或间隔不足都会受罚
直接输出类别概率,再按阈值分类决策得分,根据正负或阈值分类
已分对的样本真实类别概率越接近 1,损失越小仍靠近边界时有损失,达到间隔要求后损失为 0

分对不等于没有损失。 例如正例已被 LR 以 0.6 的概率判对,把概率提高到 0.9 仍能降低损失;SVM 则要看它是否已达到间隔要求。

核 SVM 能形成非线性边界;LR 也可通过构造非线性特征实现这一点。SVM 若要输出概率,还需另做概率校准;LR 的概率也应检查是否校准。

6. HMM 与 CRF 有哪些区别?

  • HMM 是生成式模型,建模联合概率 P(x,y)P(x,y)
  • CRF 是判别式模型,建模条件概率 P(y∣x)P(y\mid x)。

    其中 xx 是观测序列,yy 是标签序列。

以词性标注为例,观测是词,标签是词性:

  • HMM:描述词性怎样转移,以及每种词性怎样产生词,再根据这些概率寻找可能的词性序列。
  • CRF:已知整句话,直接给候选词性序列打分,再归一化为概率。

特征使用上的差别:

  • 标准一阶 HMM 假设当前状态只依赖前一状态,当前观测只依赖当前状态。
  • CRF 可使用前后词、词缀等相互重叠的观测特征。

一阶线性链 CRF 仍只直接连接相邻标签;能查看整句输入,不等于任意标签之间都有直接联系。

集成学习

7. Bagging 与 Boosting 有哪些区别?

  • Bagging:主要降低方差,缓解过拟合。 把多个模型的预测汇总起来,减少单个模型受训练样本变化的影响,让结果更稳定。
  • Boosting:逐轮增强模型,降低偏差、缓解欠拟合。 后一个模型补前面模型的不足,把多个较弱的模型组合成更强的模型。

Bagging 的过程:分别训练,平权汇总。

  1. 采样:从原训练集有放回地抽样,得到多份训练集。
  2. 学习:每份训练集分别训练一个模型,各模型通常可以并行训练。
  3. 集成:分类时平权投票或平均类别概率,回归时平均预测值。

Bagging 是一种集成方法,可搭配决策树、线性回归、逻辑回归等模型;对深树这类容易随训练样本变化的模型,改善通常更明显。

Boosting 的过程:逐轮改进,组合预测。以二分类 AdaBoost 为例:

  1. 初始化:所有样本权重相同,训练第一个弱分类器。
  2. 评价:计算加权错误率,据此确定分类器的投票权重;错误率越低,权重越大。
  3. 调整:提高错分样本的相对权重,让下一轮更关注这些样本。
  4. 迭代:按新样本权重训练下一个分类器,重复上述过程。
  5. 集成:按各分类器的权重进行加权投票。

GBDT 采用另一种改进方式:新树拟合当前损失的负梯度,再把输出加到已有预测中;平方损失下,拟合的就是残差。 XGBoost、LightGBM 都属于梯度提升树方法。

Boosting 也可能过拟合;Bagging 的准确率提升幅度取决于数据与基模型。

8. 随机森林为什么要随机抽样训练集?

让树之间有差异,避免所有树一起犯同样的错误,从而降低整体方差。

决策树对训练样本的变化比较敏感。不同采样结果会产生不同的分裂和预测,汇总时,部分误差可以相互抵消;如果每棵树的预测都一样,再多树也难以改善结果。

随机森林还在每个节点分裂时随机选择候选特征,减少各棵树反复依赖同一批强特征的情况。样本随机与特征随机共同增加树之间的差异。

9. 为什么随机森林通常采用有放回抽样?

抽样次数与原样本数相同时,有放回抽样仍能得到不同的训练集。

例如原始记录为 A、B、C、D,每棵树抽 4 次:

  • 无放回:只能得到这 4 条完整记录,训练数据没有变化。
  • 有放回:可以得到 A、A、C、D,A 出现两次,B 没被抽到,各棵树看到的数据及频次就不同了。

B 是这棵树的包外样本。评估 B 时,只汇总没训练过 B 的树的预测,这就是包外评估(OOB)。

从 nn 条记录中有放回抽 nn 次,nn 较大时,平均约 36.8% 的记录未被抽中,可用于 OOB 评估。

无放回抽取少于 nn 条记录也能产生不同子集;随机森林采用有放回抽样,是常见做法,不是获得差异的唯一办法。

10. 随机森林与 GBDT 有哪些联系和区别?

二者都组合多棵树,都能做分类和回归;随机森林主要降低方差,GBDT 通过逐轮改进增强拟合能力。

比较项随机森林GBDT
每棵树学什么原任务的类别或连续目标值当前损失的负梯度;平方损失下是残差
训练顺序各树分别训练,通常可并行后一轮依赖前面各轮的累积预测
回归预测各树预测取平均初始预测加上各树输出,每轮贡献由学习率控制
分类预测投票或平均类别概率树输出实数调整量,累加后再转成类别概率与预测

例如平方损失回归中,真实值是 100,当前预测是 80,新树尝试拟合残差 20。若新树输出 20、学习率为 0.1,预测更新为 80+0.1×20=8280+0.1\times20=82。

其他损失应按负梯度计算,不能一律用“真实值减预测值”。

分类森林的聚合取决于实现:原始方法采用类别投票,scikit-learn 平均各树的类别概率,再选概率最大的类别。

XGBoost

11. XGBoost 相比基础 GBDT 改进了什么?

核心是利用二阶导数,并在目标函数中显式惩罚树的复杂度。 XGBoost 的树提升模型仍属于 GBDT。

  • 二阶信息:除了梯度,还使用损失曲线的弯曲程度,计算叶子输出和分裂收益。
  • 正则化:对叶子数量和叶子输出大小施加惩罚,抑制过拟合。
  • 训练机制:支持行列采样、稀疏与缺失值处理,以及直方图分裂搜索。
  • 并行计算:可以在单轮建树内部并行;各轮之间仍有先后依赖。

这些是相对基础推导的改进,其他 GBDT 实现也可采用其中的机制。

12. XGBoost 的样本采样与特征采样怎样进行?是否有放回?

行采样选训练记录,列采样选候选特征;一次采样内不重复选,同一记录或特征可在后续轮次再次使用。 以下行采样以 CPU hist 的均匀采样为例。

样本采样由 subsample 控制。设为 0.8 时,每轮每条记录约有 80% 的概率被保留,不会把同一条记录重复抽出多份。

特征采样分三个层级:

  • colsample_bytree:每棵树选一批候选特征。
  • colsample_bylevel:每层从树的候选特征中再选子集。
  • colsample_bynode:每个节点从该层的候选特征中再选子集。

三个比例逐级相乘。例如都设为 0.5,64 个特征在节点一级剩下 8 个候选,再从中寻找分裂特征与阈值。

XGBoost 还支持基于梯度的非均匀采样,其选择概率不同。

13. XGBoost 是否使用剪枝?依据是什么?

支持。依据是分裂带来的收益是否足够,以及是否超过深度限制。

先估算分裂能减少多少损失,再扣除新增叶子等复杂度成本;收益不足,就不值得保留。gamma 越大,要求的最低改善越高。

  • 生长时限制:提前拒绝收益不足或不满足约束的分裂。
  • 后剪枝:prune 更新器删除已形成但收益不足或深度超限的分支;是否执行,取决于树方法和更新器配置。

14. XGBoost 如何处理缺失值?有哪些边界?

树模型为每个分裂节点学习缺失值的默认方向,预测时按这个方向走。

例如节点按“年龄是否小于 30”划分:

  1. 训练时比较两种情况:年龄缺失的样本全部去左侧,或全部去右侧。
  2. 保存收益较好的方向;预测时遇到年龄缺失,就沿该方向继续走。

不同节点可以选择不同方向。模型决定的是怎样分支,没有填回真实年龄。

能处理缺失值,不代表缺失不会影响预测。 训练与上线时的缺失原因、比例变化,可能让原来的分支规则失效。

还要区分缺失和零:

  • 默认 missing=NaN 时,稠密矩阵中的普通零是有效数值。
  • 稀疏矩阵里未存储的元素被树模型视为缺失,转成稠密矩阵补零后,含义可能改变。
  • 设置 missing=0 时,输入中的零也被当作缺失。

训练与预测要保持相同的数据表示和缺失标记。

评论

使用 GitHub 登录后参与讨论,评论将公开保存在 GitHub。

阅读到这里时加载评论。