机器学习——神经网络
正文
作业
类别不均衡指的是什么?有哪些解决方案。
类别不均衡(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'),让模型更关注少数类。
- 公式:
[ = ]
- 为少数类分配更高的权重(如
- 集成学习(Ensemble Methods)
- EasyEnsemble:从多数类中随机采样多个子集,分别与少数类结合训练多个模型,集成结果。
- BalanceCascade:逐步筛选多数类样本,避免冗余信息。
- RUSBoost:结合欠采样和提升算法(Boosting)。
- EasyEnsemble:从多数类中随机采样多个子集,分别与少数类结合训练多个模型,集成结果。
- 改进损失函数
- Focal
Loss:降低易分类样本的权重,聚焦于难分类的少数类样本。
- Cost-sensitive Learning:为不同类别分配不同的误分类代价。
- Focal
Loss:降低易分类样本的权重,聚焦于难分类的少数类样本。
2.3 评估指标调整
- 避免使用准确率(Accuracy),改用以下指标:
- F1-Score:精确率(Precision)和召回率(Recall)的调和平均。
- AUC-ROC
曲线:衡量分类器在不同阈值下的整体性能。
- 精确率-召回率曲线(PR
Curve):关注少数类的识别能力。
- 平衡准确率(Balanced Accuracy):计算每个类别的召回率的平均值。
- F1-Score:精确率(Precision)和召回率(Recall)的调和平均。
2.4 高级技术
异常检测(Anomaly Detection)
将少数类视为异常,使用 One-Class SVM 或孤立森林(Isolation Forest)检测。生成对抗网络(GAN)
使用 GAN 生成高质量的少数类样本(如医疗数据中的罕见病样本)。阈值调整
根据业务需求调整分类阈值(如将欺诈检测的阈值从 0.5 降低到 0.3)。
3. 实际应用建议
- 场景举例:
- 欺诈检测:少数类(欺诈)样本极少,需使用 SMOTE +
集成学习。
- 医疗诊断:罕见病识别可尝试 GAN
生成数据或异常检测。
- 欺诈检测:少数类(欺诈)样本极少,需使用 SMOTE +
集成学习。
- 工具库:
- Python 的
imbalanced-learn(提供 SMOTE、EasyEnsemble 等)。
- TensorFlow/PyTorch 中的
class_weight参数。
- Python 的
总结
类别不均衡的核心是让模型“看到”足够的少数类信息,同时选择合适的评估指标。根据数据特点和业务需求,灵活组合数据采样、算法改进和评估方法,才能有效提升模型对少数类的识别能力。
关于误差逆传播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. 计算 ( $ $)(输出层权重的梯度)
步骤分解:
输出层输入:
[ $net_j = \sum_{h=1}^q w_{hj} b_h$ ] 输出层节点的激活值为 ( yj = f(netj) )。损失函数对 ( 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)$ ]
- ( $\frac{\partial E_k}{\partial y_j} =
(y_j - \hat{y}_j)$ )(均方误差导数)
损失函数对 ( 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) $)。
- 损失函数对 ( 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)$ ]
- ($ = w_{hj} $)(输出层输入依赖于隐藏层输出 ( b_h ))
- 损失函数对 ( 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}}$ ]
- 隐藏层权重更新:
[ $v_{ih} \leftarrow v_{ih} - \eta \cdot \frac{\partial E_k}{\partial v_{ih}}$ ] 其中,( $$) 是学习率。
关键点总结
- 链式法则:通过逐层反向传播误差,将全局误差分解为对每个权重的局部梯度。
- 敏感度(Delta):
- 输出层:($ _j = (y_j - _j) f’(net_j)$ )
- 隐藏层:($ _h = ( j w{hj} ) f’(net_h)$ )
- 输出层:($ _j = (y_j - _j) f’(net_j)$ )
- 高效性:通过存储中间结果(如 ( _j )),避免重复计算,降低时间复杂度。
如果需要进一步解释具体步骤或示例,请随时告诉我! 😊