机器学习——神经网络

正文

作业

类别不均衡指的是什么?有哪些解决方案。

类别不均衡(Class Imbalance) 是指分类任务中不同类别样本的数量差异显著,例如:
- 多数类(Majority Class):样本数量多(如正常交易占99%)。
- 少数类(Minority Class):样本数量极少(如欺诈交易仅占1%)。

这种问题会导致模型倾向于预测多数类,严重降低少数类的预测性能(如漏检欺诈行为)。以下是详细解释和解决方案:

1. 类别不均衡的影响

  • 模型偏差:模型过度关注多数类,忽略少数类(如将所有样本预测为多数类,准确率虚高)。
  • 评估指标失效:准确率(Accuracy)失去意义(例如:99% 的样本是多数类,模型只需预测多数类即可达到 99% 准确率)。

2. 解决方案

2.1 数据层面调整

  • 过采样(Oversampling)
    • 复制少数类样本:直接复制少数类数据(可能导致过拟合)。
    • 生成合成样本:使用 SMOTE(Synthetic Minority Over-sampling Technique)生成新样本(通过插值法)。
    • 改进版算法:如 ADASYN(自适应合成采样),根据样本分布动态生成数据。
  • 欠采样(Undersampling)
    • 随机删除多数类样本:减少多数类数量,但可能丢失重要信息。
    • 选择性欠采样:保留多数类中更具代表性的样本(如 Tomek LinksCluster Centroids)。
  • 混合采样
    结合过采样和欠采样(如先过采样少数类,再欠采样多数类)。

2.2 算法层面调整

  • 调整类别权重(Class Weight)
    • 为少数类分配更高的权重(如 class_weight='balanced'),让模型更关注少数类。
    • 公式:
      [ = ]
  • 集成学习(Ensemble Methods)
    • EasyEnsemble:从多数类中随机采样多个子集,分别与少数类结合训练多个模型,集成结果。
    • BalanceCascade:逐步筛选多数类样本,避免冗余信息。
    • RUSBoost:结合欠采样和提升算法(Boosting)。
  • 改进损失函数
    • Focal Loss:降低易分类样本的权重,聚焦于难分类的少数类样本。
    • Cost-sensitive Learning:为不同类别分配不同的误分类代价。

2.3 评估指标调整

  • 避免使用准确率(Accuracy),改用以下指标:
    • F1-Score:精确率(Precision)和召回率(Recall)的调和平均。
    • AUC-ROC 曲线:衡量分类器在不同阈值下的整体性能。
    • 精确率-召回率曲线(PR Curve):关注少数类的识别能力。
    • 平衡准确率(Balanced Accuracy):计算每个类别的召回率的平均值。

2.4 高级技术

  • 异常检测(Anomaly Detection)
    将少数类视为异常,使用 One-Class SVM 或孤立森林(Isolation Forest)检测。

  • 生成对抗网络(GAN)
    使用 GAN 生成高质量的少数类样本(如医疗数据中的罕见病样本)。

  • 阈值调整
    根据业务需求调整分类阈值(如将欺诈检测的阈值从 0.5 降低到 0.3)。

3. 实际应用建议

  • 场景举例
    • 欺诈检测:少数类(欺诈)样本极少,需使用 SMOTE + 集成学习。
    • 医疗诊断:罕见病识别可尝试 GAN 生成数据或异常检测。
  • 工具库
    • Python 的 imbalanced-learn(提供 SMOTE、EasyEnsemble 等)。
    • TensorFlow/PyTorch 中的 class_weight 参数。

总结

类别不均衡的核心是让模型“看到”足够的少数类信息,同时选择合适的评估指标。根据数据特点和业务需求,灵活组合数据采样、算法改进和评估方法,才能有效提升模型对少数类的识别能力。

关于误差逆传播BP算法,详细推导E_k对w_hj的导数和对v_ih的导数。

以下是误差逆传播(Backpropagation, BP)算法中误差 ( E_k ) 对权重 ( w_{hj} )(输出层权重)和 ( v_{ih} )(隐藏层权重)的详细导数推导过程:

符号定义

  • 输入层节点:( xi )(( i = 1, 2, $, n $))
  • 隐藏层节点:( bh )(( h = 1, 2, $, q $))
  • 输出层节点:( yj )(( j = 1, 2,$ , l $))
  • 隐藏层到输出层的权重:( whj )(从隐藏层节点 ( h ) 到输出层节点 ( j ))
  • 输入层到隐藏层的权重:( vih )(从输入层节点 ( i ) 到隐藏层节点 ( h ))
  • 激活函数:假设为 Sigmoid 函数 ($ f(x) = $\),其导数为 \($ f’(x) = f(x)(1 - f(x)) $)
  • 损失函数:均方误差 ($ E_k = _{j=1}^l (y_j - _j)^2 $),其中 ( $_j $) 是真实标签。

1. 计算 ( $ $)(输出层权重的梯度)

步骤分解

  1. 输出层输入
    [ $net_j = \sum_{h=1}^q w_{hj} b_h$ ] 输出层节点的激活值为 ( yj = f(netj) )。

  2. 损失函数对 ( net_j ) 的导数
    [ $\frac{\partial E_k}{\partial net_j} = \frac{\partial E_k}{\partial y_j} \cdot \frac{\partial y_j}{\partial net_j}$ ]

    • ( $\frac{\partial E_k}{\partial y_j} = (y_j - \hat{y}_j)$ )(均方误差导数)
    • ( $ = f’(net_j) = y_j (1 - y_j) $\)(Sigmoid 导数) 因此: \[$ = (y_j - _j) y_j (1 - y_j)$ ]
  3. 损失函数对 ( w_{hj} ) 的导数
    [ $\frac{\partial E_k}{\partial w_{hj}} = \frac{\partial E_k}{\partial net_j} \cdot \frac{\partial net_j}{\partial w_{hj}}$ ]

    • ( $\frac{\partial net_j}{\partial w_{hj}} = b_h$ )(因为 ( $net_j = w_{hj} b_h $\)) 因此: \[$ = (y_j - _j) y_j (1 - y_j) b_h$ ]

2. 计算 ( $ $)(隐藏层权重的梯度)

步骤分解
1. 隐藏层输入
[ $net_h = \sum_{i=1}^n v_{ih} x_i$ ] 隐藏层节点的激活值为 ($ b_h = f(net_h) $)。

  1. 损失函数对 ( net_h ) 的导数
    需要将误差从输出层反向传播到隐藏层:
    [ $\frac{\partial E_k}{\partial net_h} = \sum_{j=1}^l \left( \frac{\partial E_k}{\partial net_j} \cdot \frac{\partial net_j}{\partial b_h} \right) \cdot \frac{\partial b_h}{\partial net_h}$ ]
    • ($ = w_{hj} $)(输出层输入依赖于隐藏层输出 ( b_h ))
    • ($ = f’(net_h) = b_h (1 - b_h) $\) 因此: \[$ = ( {j=1}^l w{hj} ) b_h (1 - b_h)$ ]
  2. 损失函数对 ( v_{ih} ) 的导数
    [ $\frac{\partial E_k}{\partial v_{ih}} = \frac{\partial E_k}{\partial net_h} \cdot \frac{\partial net_h}{\partial v_{ih}}$ ]
    • ($ = x_i $\)(因为 \($ net_h = v_{ih} x_i $) 因此: \[$ = ( {j=1}^l w{hj} ) b_h (1 - b_h) x_i$ ]

3. 最终梯度公式

  • 输出层权重梯度
    [ $\frac{\partial E_k}{\partial w_{hj}} = \delta_j \cdot b_h, \quad \text{其中 } \delta_j = (y_j - \hat{y}_j) \cdot y_j (1 - y_j)$ ]

  • 隐藏层权重梯度
    [ $\frac{\partial E_k}{\partial v_{ih}} = \delta_h \cdot x_i, \quad \text{其中 } \delta_h = \left( \sum_{j=1}^l \delta_j \cdot w_{hj} \right) \cdot b_h (1 - b_h)$ ]

4. 参数更新规则

使用梯度下降法更新权重:
1. 输出层权重更新
[ $w_{hj} \leftarrow w_{hj} - \eta \cdot \frac{\partial E_k}{\partial w_{hj}}$ ]

  1. 隐藏层权重更新
    [ $v_{ih} \leftarrow v_{ih} - \eta \cdot \frac{\partial E_k}{\partial v_{ih}}$ ] 其中,( $$) 是学习率。

关键点总结

  1. 链式法则:通过逐层反向传播误差,将全局误差分解为对每个权重的局部梯度。
  2. 敏感度(Delta)
    • 输出层:($ _j = (y_j - _j) f’(net_j)$ )
    • 隐藏层:($ _h = ( j w{hj} ) f’(net_h)$ )
  3. 高效性:通过存储中间结果(如 ( _j )),避免重复计算,降低时间复杂度。

如果需要进一步解释具体步骤或示例,请随时告诉我! 😊

参考资料

[5分钟深度学习] #01 梯度下降算法_哔哩哔哩_bilibili

反向传播算法可视化展示_哔哩哔哩_bilibili