机器学习——神经网络
正文
作业
类别不均衡指的是什么?有哪些解决方案。
类别不均衡(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 Links 或 Cluster 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参数。
- Python 的
总结
类别不均衡的核心是让模型“看到”足够的少数类信息,同时选择合适的评估指标。根据数据特点和业务需求,灵活组合数据采样、算法改进和评估方法,才能有效提升模型对少数类的识别能力。
关于误差逆传播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}} $)(输出层权重的梯度)
步骤分解:
输出层输入:
[
$netj = \sum{h=1}^q w_{hj} b_h$
]
输出层节点的激活值为 ( $y_j = f(net_j)$ )。损失函数对 ( 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)$
]
损失函数对 ( 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$
]
- ( $\frac{\partial netj}{\partial w{hj}} = bh$ )(因为 ( $net_j = \sum w{hj} bh $))
2. 计算 ( $\frac{\partial Ek}{\partial v{ih}} $)(隐藏层权重的梯度)
步骤分解:
隐藏层输入:
[
$neth = \sum{i=1}^n v_{ih} x_i$
]
隐藏层节点的激活值为 ($ b_h = f(net_h) $)。损失函数对 ( 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)$
]
损失函数对 ( 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$
]
- ($ \frac{\partial neth}{\partial v{ih}} = xi $)(因为 ($ net_h = \sum v{ih} xi $)
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. 参数更新规则
使用梯度下降法更新权重:
输出层权重更新:
[
$w{hj} \leftarrow w{hj} - \eta \cdot \frac{\partial Ek}{\partial w{hj}}$
]隐藏层权重更新:
[
$v{ih} \leftarrow v{ih} - \eta \cdot \frac{\partial Ek}{\partial v{ih}}$
]
其中,( $\eta $) 是学习率。
关键点总结
- 链式法则:通过逐层反向传播误差,将全局误差分解为对每个权重的局部梯度。
- 敏感度(Delta):
- 输出层:($ \delta_j = (y_j - \hat{y}_j) \cdot f’(net_j)$ )
- 隐藏层:($ \deltah = \left( \sum \delta_j w{hj} \right) \cdot f’(net_h)$ )
- 高效性:通过存储中间结果(如 ( \delta_j )),避免重复计算,降低时间复杂度。
如果需要进一步解释具体步骤或示例,请随时告诉我! 😊