机器学习常见问题
一些常见问题
训练与调参
1. 如何处理类别不平衡?
常用办法是重采样、类别加权和调整分类阈值。评估时不能只看准确率,还要看精确率、召回率和 PR 曲线。
- 随机过采样:重复抽取少数类样本,增加它们参与训练的次数;可能过拟合,没有增加新信息。
- 随机欠采样:减少多数类样本,缩短训练时间;可能丢失多数类的重要信息。
- 类别加权:提高少数类错误在损失中的权重,让模型更重视这类样本。
- 调整阈值:降低正类判定阈值,通常能找回更多正例,也可能增加误报。
采样和类别加权改变训练,阈值调整改变最终分类结果。 选择哪种办法,取决于更在意漏报还是误报,不必把类别比例强行补到 1∶1。
重采样只用于训练集,交叉验证时也要在各训练部分单独进行;验证集和测试集保留目标场景的类别比例。
2. 超参数调优有哪些方法?
- 网格搜索:逐一尝试预设组合。 例如 3 种树深度、2 种学习率,共训练 6 组;参数多时,组合数增长很快。
- 随机搜索:从给定范围随机抽取组合。 用试验次数控制开销,适合先探索较大的参数范围。
- 贝叶斯优化:根据已有结果选择下一组参数。 在可能得高分的位置和仍不确定的位置之间权衡,适合单次训练较贵的情况。
交叉验证负责评价参数,搜索方法负责选择参数。 三种搜索都可以配合交叉验证,比较时应使用相同的数据划分和指标。
3. 以 XGBoost 为例,怎样安排调参流程?
建议按建立基线 → 调整树复杂度 → 调整采样 → 联合选择学习率和轮数的顺序进行,过程中固定数据划分和评价指标。
- 建立基线:记录训练与验证表现。训练也差,检查特征和训练是否充分;训练好、验证差,检查过拟合或数据分布差异。
- 调整树复杂度:减小
max_depth、增大min_child_weight、gamma或正则化强度,可以抑制过拟合;限制过强也会欠拟合。 - 调整采样:用
subsample控制样本比例,colsample_bytree控制每棵树的特征比例;比例过低可能丢失有效信息。 - 选择学习率和轮数:较小的学习率通常需要更多轮训练,用验证集早停确定合适轮数,再复核较好的参数组合。
min_child_weight 限制的是子节点内损失二阶导数之和,通常不等于最少样本数。
参数之间存在相互影响,以上是可用顺序,不是固定规则。测试集不参与调参或早停。
模型比较
4. 逻辑回归与线性回归有哪些联系和区别?
线性回归预测连续数值,逻辑回归预测类别概率,用于分类。
线性回归和都先计算线性得分 。
线性回归:直接输出 ,例如预测价格;常用平方误差损失。
二分类逻辑回归:用 sigmoid 将 转成正类概率,再按阈值分类,常用交叉熵损失。
Sigmoid 函数:
同样得到得分 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 是生成式模型,建模联合概率
- CRF 是判别式模型,建模条件概率 。
其中 是观测序列, 是标签序列。
以词性标注为例,观测是词,标签是词性:
- HMM:描述词性怎样转移,以及每种词性怎样产生词,再根据这些概率寻找可能的词性序列。
- CRF:已知整句话,直接给候选词性序列打分,再归一化为概率。
特征使用上的差别:
- 标准一阶 HMM 假设当前状态只依赖前一状态,当前观测只依赖当前状态。
- CRF 可使用前后词、词缀等相互重叠的观测特征。
一阶线性链 CRF 仍只直接连接相邻标签;能查看整句输入,不等于任意标签之间都有直接联系。
集成学习
7. Bagging 与 Boosting 有哪些区别?
- Bagging:主要降低方差,缓解过拟合。 把多个模型的预测汇总起来,减少单个模型受训练样本变化的影响,让结果更稳定。
- Boosting:逐轮增强模型,降低偏差、缓解欠拟合。 后一个模型补前面模型的不足,把多个较弱的模型组合成更强的模型。
Bagging 的过程:分别训练,平权汇总。
- 采样:从原训练集有放回地抽样,得到多份训练集。
- 学习:每份训练集分别训练一个模型,各模型通常可以并行训练。
- 集成:分类时平权投票或平均类别概率,回归时平均预测值。
Bagging 是一种集成方法,可搭配决策树、线性回归、逻辑回归等模型;对深树这类容易随训练样本变化的模型,改善通常更明显。
Boosting 的过程:逐轮改进,组合预测。以二分类 AdaBoost 为例:
- 初始化:所有样本权重相同,训练第一个弱分类器。
- 评价:计算加权错误率,据此确定分类器的投票权重;错误率越低,权重越大。
- 调整:提高错分样本的相对权重,让下一轮更关注这些样本。
- 迭代:按新样本权重训练下一个分类器,重复上述过程。
- 集成:按各分类器的权重进行加权投票。
GBDT 采用另一种改进方式:新树拟合当前损失的负梯度,再把输出加到已有预测中;平方损失下,拟合的就是残差。 XGBoost、LightGBM 都属于梯度提升树方法。
Boosting 也可能过拟合;Bagging 的准确率提升幅度取决于数据与基模型。
8. 随机森林为什么要随机抽样训练集?
让树之间有差异,避免所有树一起犯同样的错误,从而降低整体方差。
决策树对训练样本的变化比较敏感。不同采样结果会产生不同的分裂和预测,汇总时,部分误差可以相互抵消;如果每棵树的预测都一样,再多树也难以改善结果。
随机森林还在每个节点分裂时随机选择候选特征,减少各棵树反复依赖同一批强特征的情况。样本随机与特征随机共同增加树之间的差异。
9. 为什么随机森林通常采用有放回抽样?
抽样次数与原样本数相同时,有放回抽样仍能得到不同的训练集。
例如原始记录为 A、B、C、D,每棵树抽 4 次:
- 无放回:只能得到这 4 条完整记录,训练数据没有变化。
- 有放回:可以得到
A、A、C、D,A 出现两次,B 没被抽到,各棵树看到的数据及频次就不同了。
B 是这棵树的包外样本。评估 B 时,只汇总没训练过 B 的树的预测,这就是包外评估(OOB)。
从 条记录中有放回抽 次, 较大时,平均约 36.8% 的记录未被抽中,可用于 OOB 评估。
无放回抽取少于 条记录也能产生不同子集;随机森林采用有放回抽样,是常见做法,不是获得差异的唯一办法。
10. 随机森林与 GBDT 有哪些联系和区别?
二者都组合多棵树,都能做分类和回归;随机森林主要降低方差,GBDT 通过逐轮改进增强拟合能力。
| 比较项 | 随机森林 | GBDT |
|---|---|---|
| 每棵树学什么 | 原任务的类别或连续目标值 | 当前损失的负梯度;平方损失下是残差 |
| 训练顺序 | 各树分别训练,通常可并行 | 后一轮依赖前面各轮的累积预测 |
| 回归预测 | 各树预测取平均 | 初始预测加上各树输出,每轮贡献由学习率控制 |
| 分类预测 | 投票或平均类别概率 | 树输出实数调整量,累加后再转成类别概率与预测 |
例如平方损失回归中,真实值是 100,当前预测是 80,新树尝试拟合残差 20。若新树输出 20、学习率为 0.1,预测更新为 。
其他损失应按负梯度计算,不能一律用“真实值减预测值”。
分类森林的聚合取决于实现:原始方法采用类别投票,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”划分:
- 训练时比较两种情况:年龄缺失的样本全部去左侧,或全部去右侧。
- 保存收益较好的方向;预测时遇到年龄缺失,就沿该方向继续走。
不同节点可以选择不同方向。模型决定的是怎样分支,没有填回真实年龄。
能处理缺失值,不代表缺失不会影响预测。 训练与上线时的缺失原因、比例变化,可能让原来的分支规则失效。
还要区分缺失和零:
- 默认
missing=NaN时,稠密矩阵中的普通零是有效数值。 - 稀疏矩阵里未存储的元素被树模型视为缺失,转成稠密矩阵补零后,含义可能改变。
- 设置
missing=0时,输入中的零也被当作缺失。
训练与预测要保持相同的数据表示和缺失标记。
评论
使用 GitHub 登录后参与讨论,评论将公开保存在 GitHub。
站长管理删除会同步到 GitHub,无法撤销。
阅读到这里时加载评论。