机器学习——神经网络

正文

作业

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

类别不均衡(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'),让模型更关注少数类。
    • 公式:
      [
      \text{权重} = \frac{\text{多数类样本数}}{\text{少数类样本数}}
      ]
  • 集成学习(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)算法中误差 ( Ek ) 对权重 ( w{hj} )(输出层权重)和 ( v_{ih} )(隐藏层权重)的详细导数推导过程:

符号定义

  • 输入层节点:( $x_i$ )(( i = 1, 2, $\dots, n $))
  • 隐藏层节点:( $b_h$ )(( h = 1, 2, $\dots, q $))
  • 输出层节点:( $y_j$ )(( j = 1, 2,$ \dots, l $))
  • 隐藏层到输出层的权重:( $w_{hj}$ )(从隐藏层节点 ( h ) 到输出层节点 ( j ))
  • 输入层到隐藏层的权重:( $v_{ih}$ )(从输入层节点 ( i ) 到隐藏层节点 ( h ))
  • 激活函数:假设为 Sigmoid 函数 ($ f(x) = \frac{1}{1 + e^{-x}} $),其导数为 ($ f’(x) = f(x)(1 - f(x)) $)
  • 损失函数:均方误差 ($ Ek = \frac{1}{2} \sum{j=1}^l (y_j - \hat{y}_j)^2 $),其中 ( $\hat{y}_j $) 是真实标签。

1. 计算 ( $\frac{\partial Ek}{\partial w{hj}} $)(输出层权重的梯度)

步骤分解

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

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

    • ( $\frac{\partial netj}{\partial w{hj}} = bh$ )(因为 ( $net_j = \sum w{hj} bh $))
      因此:
      [
      $\frac{\partial E_k}{\partial w
      {hj}} = (y_j - \hat{y}_j) \cdot y_j (1 - y_j) \cdot b_h$
      ]

2. 计算 ( $\frac{\partial Ek}{\partial v{ih}} $)(隐藏层权重的梯度)

步骤分解

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

  2. 损失函数对 ( net_h ) 的导数
    需要将误差从输出层反向传播到隐藏层:
    [
    $\frac{\partial Ek}{\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}$
    ]

    • ($ \frac{\partial netj}{\partial b_h} = w{hj} $)(输出层输入依赖于隐藏层输出 ( b_h ))
    • ($ \frac{\partial bh}{\partial net_h} = f’(net_h) = b_h (1 - b_h) $)
      因此:
      [
      $\frac{\partial E_k}{\partial net_h} = \left( \sum
      {j=1}^l \frac{\partial Ek}{\partial net_j} \cdot w{hj} \right) \cdot b_h (1 - b_h)$
      ]
  3. 损失函数对 ( v_{ih} ) 的导数
    [
    $\frac{\partial Ek}{\partial v{ih}} = \frac{\partial Ek}{\partial net_h} \cdot \frac{\partial net_h}{\partial v{ih}}$
    ]

    • ($ \frac{\partial neth}{\partial v{ih}} = xi $)(因为 ($ net_h = \sum v{ih} xi $)
      因此:
      [
      $\frac{\partial E_k}{\partial v
      {ih}} = \left( \sum{j=1}^l \frac{\partial E_k}{\partial net_j} \cdot w{hj} \right) \cdot b_h (1 - b_h) \cdot x_i$
      ]

3. 最终梯度公式

  • 输出层权重梯度
    [
    $\frac{\partial Ek}{\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 Ek}{\partial v{ih}} = \deltah \cdot x_i, \quad \text{其中 } \delta_h = \left( \sum{j=1}^l \deltaj \cdot w{hj} \right) \cdot b_h (1 - b_h)$
    ]

4. 参数更新规则

使用梯度下降法更新权重:

  1. 输出层权重更新
    [
    $w{hj} \leftarrow w{hj} - \eta \cdot \frac{\partial Ek}{\partial w{hj}}$
    ]

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

关键点总结

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

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

参考资料

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

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